Skip to content

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容器管理,包括以下几个阶段:

  1. 加载和实例化:Web容器加载Servlet类并创建实例
  2. 初始化:调用init()方法进行初始化
  3. 处理请求:调用service()方法处理客户端请求
  4. 销毁:调用destroy()方法释放资源
java
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配置:

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>

使用注解配置:

java
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    // Servlet实现
}

JSP基础

什么是JSP?

JSP(JavaServer Pages)是一种动态网页技术,允许在HTML中嵌入Java代码。JSP文件在运行时会被编译成Servlet,然后执行。

JSP基本语法

JSP页面包含以下几种元素:

  1. HTML模板文本:普通的HTML代码
  2. JSP脚本元素
    • 声明:<%! 声明变量或方法 %>
    • 表达式:<%= 表达式 %>
    • 脚本片段:<% Java代码 %>
jsp
<%@ 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指令:

  1. page指令:设置页面属性
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
  1. include指令:包含其他文件
jsp
<%@ include file="header.jsp" %>
  1. taglib指令:引入标签库
jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

JSP动作

JSP动作是在请求处理阶段执行的XML语法标签,常用的有:

  • <jsp:include>:包含其他页面
  • <jsp:forward>:转发请求
  • <jsp:param>:传递参数
  • <jsp:useBean>:使用JavaBean
jsp
<jsp:include page="header.jsp">
    <jsp:param name="title" value="页面标题"/>
</jsp:include>

MVC设计模式

MVC(Model-View-Controller)是一种软件设计模式,广泛应用于Web开发中:

  • Model(模型):负责处理数据和业务逻辑
  • View(视图):负责展示数据(通常是JSP页面)
  • Controller(控制器):负责处理用户请求(通常是Servlet)

MVC实现示例

  1. Model层
java
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;
    }
}
  1. Controller层
java
@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);
    }
}
  1. View层
jsp
<%@ 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中的数据访问,语法为${表达式}

jsp
<p>用户姓名:${user.name}</p>
<p>请求参数:${param.username}</p>
<p>会话属性:${sessionScope.userId}</p>

JSTL标签库

JSTL(JSP Standard Tag Library)是JSP标准标签库,提供了常用的标签来简化JSP开发。

常用的JSTL标签:

  1. 核心标签库
    • <c:out>:输出内容
    • <c:set>:设置变量
    • <c:if>:条件判断
    • <c:forEach>:循环遍历
jsp
<%@ 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最佳实践

  1. 职责分离:Servlet负责控制逻辑,JSP负责视图展示
  2. 避免在JSP中编写复杂业务逻辑:将业务逻辑放在Java类中
  3. 使用MVC模式:保持代码结构清晰
  4. 合理使用EL和JSTL:减少Java代码在JSP中的使用
  5. 异常处理:正确处理异常并提供友好的错误页面

实践练习

创建一个简单的用户管理系统:

  1. 创建用户列表页面(JSP)
  2. 创建用户详情页面(JSP)
  3. 创建用户控制器(Servlet)
  4. 实现用户增删改查功能
  5. 使用JSTL和EL简化页面开发

总结

Servlet和JSP是Java Web开发的基础技术。Servlet负责处理请求和控制流程,JSP负责页面展示。通过MVC模式,我们可以构建结构清晰、易于维护的Web应用。在实际开发中,我们通常会结合使用Servlet、JSP、EL和JSTL来构建功能完整的Web应用。