Java JSP 和 Servlet 全面解析
简介
在 Java Web 开发领域,JSP(JavaServer Pages)和 Servlet 是两个至关重要的技术。它们共同为创建动态 Web 应用程序提供了强大的支持。Servlet 作为 Java 编写的服务器端程序,负责处理业务逻辑和与数据库交互;JSP 则侧重于将动态内容嵌入到 HTML 页面中,提供良好的用户界面展示。理解并熟练运用这两项技术,对于开发高效、可靠的 Web 应用程序至关重要。
目录
- 基础概念
- Servlet 概念
- JSP 概念
- 使用方法
- Servlet 使用方法
- JSP 使用方法
- 常见实践
- Servlet 常见实践
- JSP 常见实践
- 最佳实践
- Servlet 最佳实践
- JSP 最佳实践
- 小结
- 参考资料
基础概念
Servlet 概念
Servlet 是用 Java 编写的服务器端程序,它运行在 Web 服务器上,用于处理客户端(通常是浏览器)发送的 HTTP 请求,并生成 HTTP 响应返回给客户端。Servlet 基于 Java 语言,具备面向对象、可移植、安全等优点。它的生命周期由 Web 容器管理,包括初始化、服务请求和销毁三个阶段。
JSP 概念
JSP 是一种动态网页技术,它允许将 Java 代码嵌入到 HTML 页面中。JSP 页面在服务器端被编译成 Servlet,然后运行。JSP 的主要作用是简化 Web 页面的动态内容生成,开发人员可以在 HTML 代码中直接编写 Java 代码来生成动态内容,无需像传统 Servlet 那样在 Java 代码中拼凑 HTML 标签。
使用方法
Servlet 使用方法
- 创建 Servlet 类
继承
HttpServlet
类,并重写doGet
或doPost
方法来处理 HTTP 请求。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Hello from Servlet!</h1>");
out.println("</body></html>");
}
}
- 配置 Servlet
在
web.xml
文件中配置 Servlet(如果使用 Servlet 3.0 以上版本,也可以使用注解方式,如上述代码中的@WebServlet("/hello")
)。
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 访问 Servlet
在浏览器地址栏输入
http://localhost:8080/项目名/hello
即可访问该 Servlet。
JSP 使用方法
- 创建 JSP 页面
创建一个
.jsp
文件,例如hello.jsp
。
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
<h1>Hello from JSP!</h1>
<%
out.println("Current time: " + new java.util.Date());
%>
</body>
</html>
- 访问 JSP 页面
在浏览器地址栏输入
http://localhost:8080/项目名/hello.jsp
即可访问该 JSP 页面。
常见实践
Servlet 常见实践
- 处理表单数据
在
doPost
方法中获取表单参数。
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 处理用户名和密码
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Welcome, " + username + "</h1>");
out.println("</body></html>");
}
- 与数据库交互 在 Servlet 中使用 JDBC 连接数据库并执行查询操作。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DatabaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
while (rs.next()) {
out.println("<p>" + rs.getString("username") + "</p>");
}
out.println("</body></html>");
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
JSP 常见实践
- 使用 JSP 表达式 在 JSP 页面中显示动态数据。
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
<h1>User Information</h1>
<p>Username: <%= request.getParameter("username") %></p>
</body>
</html>
- 包含其他 JSP 页面
使用
<%@ include %>
指令包含其他 JSP 片段。
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
<%@ include file="header.jsp" %>
<h1>Main Content</h1>
<%@ include file="footer.jsp" %>
</body>
</html>
最佳实践
Servlet 最佳实践
- 分离业务逻辑 将业务逻辑封装到单独的 Java 类中,Servlet 只负责接收请求、调用业务逻辑并返回响应。
- 使用过滤器(Filter) 通过过滤器对请求进行预处理和后处理,如验证用户权限、记录日志等。
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/secure/*")
public class AuthenticationFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 验证用户是否已登录
if (isUserLoggedIn(request)) {
chain.doFilter(request, response);
} else {
response.getWriter().println("Access denied. Please log in.");
}
}
private boolean isUserLoggedIn(ServletRequest request) {
// 实现用户登录验证逻辑
return true;
}
}
- 使用监听器(Listener) 利用监听器监听 Servlet 上下文、会话等的生命周期事件,进行资源初始化和清理等操作。
JSP 最佳实践
- 避免在 JSP 中编写过多业务逻辑 尽量将业务逻辑放在 Servlet 或 JavaBean 中,JSP 主要负责展示数据。
- 使用 EL 表达式和 JSTL EL(Expression Language)表达式和 JSTL(JavaServer Pages Standard Tag Library)可以简化 JSP 页面中的代码编写,提高代码的可读性和可维护性。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<body>
<c:forEach var="user" items="${userList}">
<p>${user.username}</p>
</c:forEach>
</body>
</html>
- 进行页面优化 压缩 HTML 代码、合并 CSS 和 JavaScript 文件,提高页面加载速度。
小结
Java JSP 和 Servlet 是构建动态 Web 应用程序的核心技术。通过理解它们的基础概念、掌握使用方法、熟悉常见实践和遵循最佳实践,开发人员能够创建出高效、可靠且易于维护的 Web 应用程序。Servlet 专注于处理业务逻辑,JSP 则侧重于页面展示,两者相互配合,为 Web 开发提供了强大的解决方案。
参考资料
- Oracle 官方 Servlet 文档
- Oracle 官方 JSP 文档
- 《Head First Servlets and JSP》
- 《Effective Java》相关章节