Servlet 与 JSP
Servlet和JSP是Java Web开发的核心技术。Servlet是Java编写的服务器端程序,而JSP(JavaServer Pages)是Servlet技术的扩展,允许在HTML中嵌入Java代码。
Servlet基础
什么是Servlet?
Servlet是运行在服务器端的Java程序,用于处理客户端(通常是Web浏览器)的请求并生成响应。Servlet是Java EE规范的一部分,必须在支持Java EE的Web容器(如Tomcat)中运行。
Servlet生命周期
Servlet的生命周期由Web容器管理,包括以下几个阶段:
- 加载和实例化:Web容器加载Servlet类并创建实例
- 初始化:调用
init()方法进行初始化 - 处理请求:调用
service()方法处理客户端请求 - 销毁:调用
destroy()方法释放资源
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloServlet extends HttpServlet {
// 初始化方法
public void init() throws ServletException {
System.out.println("Servlet初始化");
}
// 处理GET请求
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>Hello, Servlet!</h1>");
}
// 处理POST请求
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
// 销毁方法
public void destroy() {
System.out.println("Servlet销毁");
}
}Servlet配置
Servlet需要在web.xml文件中进行配置,或者使用注解方式进行配置。
使用web.xml配置:
<web-app>
<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>
</web-app>使用注解配置:
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
// Servlet实现
}JSP基础
什么是JSP?
JSP(JavaServer Pages)是一种动态网页技术,允许在HTML中嵌入Java代码。JSP文件在运行时会被编译成Servlet,然后执行。
JSP基本语法
JSP页面包含以下几种元素:
- HTML模板文本:普通的HTML代码
- JSP脚本元素:
- 声明:
<%! 声明变量或方法 %> - 表达式:
<%= 表达式 %> - 脚本片段:
<% Java代码 %>
- 声明:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP示例</title>
</head>
<body>
<h1>JSP示例</h1>
<%!
// 声明变量和方法
int count = 0;
String getMessage() {
return "Hello from JSP!";
}
%>
<%
// Java代码片段
count++;
String currentTime = new java.util.Date().toString();
%>
<p>页面访问次数:<%= count %></p>
<p>当前时间:<%= currentTime %></p>
<p>消息:<%= getMessage() %></p>
</body>
</html>JSP指令
JSP指令用于设置整个JSP页面的属性,语法为<%@ 指令名 属性="值" %>。
常用的JSP指令:
- page指令:设置页面属性
<%@ page contentType="text/html;charset=UTF-8" language="java" %>- include指令:包含其他文件
<%@ include file="header.jsp" %>- taglib指令:引入标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>JSP动作
JSP动作是在请求处理阶段执行的XML语法标签,常用的有:
<jsp:include>:包含其他页面<jsp:forward>:转发请求<jsp:param>:传递参数<jsp:useBean>:使用JavaBean
<jsp:include page="header.jsp">
<jsp:param name="title" value="页面标题"/>
</jsp:include>MVC设计模式
MVC(Model-View-Controller)是一种软件设计模式,广泛应用于Web开发中:
- Model(模型):负责处理数据和业务逻辑
- View(视图):负责展示数据(通常是JSP页面)
- Controller(控制器):负责处理用户请求(通常是Servlet)
MVC实现示例
- Model层:
public class User {
private String name;
private String email;
// 构造方法、getter和setter省略
}
public class UserService {
public List<User> getAllUsers() {
// 模拟获取用户数据
List<User> users = new ArrayList<>();
users.add(new User("张三", "zhangsan@example.com"));
users.add(new User("李四", "lisi@example.com"));
return users;
}
}- Controller层:
@WebServlet("/users")
public class UserController extends HttpServlet {
private UserService userService = new UserService();
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<User> users = userService.getAllUsers();
request.setAttribute("users", users);
request.getRequestDispatcher("/user-list.jsp").forward(request, response);
}
}- View层:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>用户列表</title>
</head>
<body>
<h1>用户列表</h1>
<table border="1">
<tr>
<th>姓名</th>
<th>邮箱</th>
</tr>
<c:forEach var="user" items="${users}">
<tr>
<td>${user.name}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</table>
</body>
</html>EL表达式与JSTL标签库
EL表达式
EL(Expression Language)表达式用于简化JSP中的数据访问,语法为${表达式}。
<p>用户姓名:${user.name}</p>
<p>请求参数:${param.username}</p>
<p>会话属性:${sessionScope.userId}</p>JSTL标签库
JSTL(JSP Standard Tag Library)是JSP标准标签库,提供了常用的标签来简化JSP开发。
常用的JSTL标签:
- 核心标签库:
<c:out>:输出内容<c:set>:设置变量<c:if>:条件判断<c:forEach>:循环遍历
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="score" value="85"/>
<c:if test="${score >= 60}">
<p>成绩及格</p>
</c:if>
<c:forEach var="i" begin="1" end="5">
<p>数字:${i}</p>
</c:forEach>Servlet与JSP最佳实践
- 职责分离:Servlet负责控制逻辑,JSP负责视图展示
- 避免在JSP中编写复杂业务逻辑:将业务逻辑放在Java类中
- 使用MVC模式:保持代码结构清晰
- 合理使用EL和JSTL:减少Java代码在JSP中的使用
- 异常处理:正确处理异常并提供友好的错误页面
实践练习
创建一个简单的用户管理系统:
- 创建用户列表页面(JSP)
- 创建用户详情页面(JSP)
- 创建用户控制器(Servlet)
- 实现用户增删改查功能
- 使用JSTL和EL简化页面开发
总结
Servlet和JSP是Java Web开发的基础技术。Servlet负责处理请求和控制流程,JSP负责页面展示。通过MVC模式,我们可以构建结构清晰、易于维护的Web应用。在实际开发中,我们通常会结合使用Servlet、JSP、EL和JSTL来构建功能完整的Web应用。