Servlet与JSP间的两种传值情况


Servlet与JSP之间的传值通常可以通过两种主要方式实现:请求转发(Request Dispatcher)和请求属性(Request Attributes)。下面是这两种情况的简要说明和示例。

### 1. 请求转发(Request Dispatcher)

请求转发是一种在服务器内部将请求从一个资源(如Servlet)转发到另一个资源(如JSP页面)的机制,客户端对此过程是无感知的。在转发过程中,请求对象(HttpServletRequest)和响应对象(HttpServletResponse)在Servlet和JSP之间共享。

**Servlet端示例代码**:


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 在这里设置请求属性(如果需要的话)
    request.setAttribute("message", "Hello from Servlet!");
    
    // 转发请求到JSP页面
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/somePage.jsp");
    dispatcher.forward(request, response);
}

**JSP页面示例代码**:

p
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>${message}</h1> <!-- 使用EL表达式获取请求属性 -->
</body>
</html>

### 2. 请求属性(Request Attributes)

虽然请求属性在请求转发场景中经常被设置和使用,但它们也可以在其他场景下(如包含操作)用于在Servlet和JSP之间传递信息。通过设置请求属性,你可以将数据附加到请求对象上,并在后续的请求处理过程中访问这些数据。

**注意**: 实际上,请求属性在请求转发和包含操作中都是基于相同的机制,即HttpServletRequest对象上的属性集合。上面关于请求转发的描述已经涵盖了请求属性的使用方式。

在包含操作中,Servlet可能会设置一些请求属性,然后包含(include)一个JSP页面,该JSP页面可以访问这些属性。然而,包含操作(使用`RequestDispatcher`的`include`方法)通常用于将JSP页面的内容片段嵌入到另一个JSP页面或Servlet的响应中,而不是作为主要的请求处理流程。

总之,无论是请求转发还是请求属性的使用,Servlet和JSP之间的数据传递都依赖于HttpServletRequest对象上的属性集合。通过合理设置和访问这些属性,你可以实现灵活的数据传递机制。