jsp servlet跳转

本文详细解析了JSP中forward与sendRedirect的区别及其在JSP与Servlet间的应用。forward在同一请求中传递数据,而sendRedirect则创建新请求。文章通过实例展示了不同跳转方式下request属性的变化。
<jsp:forward> 使用同一个 request ,是在服务器端跳转,浏览器显示的是第一个页面的名字,因为客户端(浏览器)不知道它在服务器端跳转了。
Response.sendRedirect 是两个不同的 request ,是在客户端跳转,浏览器显示的是跳转后的页面的名字。因为它是从客户端跳转到第二个页面的。
 
 
 

使用 forward 时,由于只是发送一次 request 请求, request 设置的属性( setAttribute )依然能保留在下一个页面。
使用 sendRedirect 时,由于发送两次 request 请求,所以在下一个不能获取 request 属性。但可以通过重写 URL 的方式将内容传递过去。
下面举例说明:
tian.jsp    
<%request.setAttribute( "river", "redwater");
    request.setAttribute( "country", "daguaiwan");
%>
<jsp:forward page= "fengshan.jsp" />
 
 
donglan.jsp    
<%request.setAttribute( "river", "redwater");
    request.setAttribute( "country", "daguaiwan");
%>
<a href= "fengshan.jsp">fengshan</a>
 
 
bama.jsp    
<%request.setAttribute( "river", "redwater");
    request.setAttribute( "country", "daguaiwan");
    response.sendRedirect( "fengshan.jsp");
%>
 
 
fengshan.jsp
<%=request.getAttribute( "river")%><br/>
<%=request.getAttribute( "country")%>
redwater
daguaiwan
 
null
null
 
null
null
 
结果分析:
tiane.jsp 是通过 forward 跳转到 fengshan.jsp 的,这两个页面享用的是同一个 request ,故 fengshan.jsp 可以接收到 tiane.jsp 通过 request 设置的属性。
donglan.jsp 是通过 href 发送了另外的 request 请求, bama.jsp 是通过 sendRedirect 跳转,用的也是另外的 request 请求,故 fengshan.jsp 不可以接收到这两个页面通过 request 设置的属性。
 
JspServlet 之间的跳转:
Jsp 跳转 Servlet 可以使用 <jsp:forward page=”URL” /> 或者 response.sendRedirect(URL) 都可以,它们之间的区别上面已经说明了。
 
Servlet 跳转 Jsp
²        getRequestDispatcherforward(request, response) 方法,这里也只是发送了一次请求,可以在下一个页面接受 request设置的属性。
²        response.sendRedirect(URL), 这里发送了两次请求,不可以在下一个页面接受 request 设置的属性
例子如下:
servlettiane.jsp    
<%request.setAttribute( "river", "redwater");
    request.setAttribute( "country", "daguaiwan");
%>
<jsp:forward page= "/tiane" />
 
servletbama.jsp    
<%request.setAttribute( "river", "redwater");
    request.setAttribute( "country", "daguaiwan");
    response.sendRedirect( "/ForwardRedirect/tiane");
%>
 
Tiane.java
public class Tiane extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
//    response.sendRedirect("/ForwardRedirect/fengshan.jsp");
     this.getServletConfig().getServletContext()
            .getRequestDispatcher( "/fengshan.jsp").forward(request, response);
  }

   public void doPost(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
    doGet(request, response);
  }    
}
 
再在web.xml中配置servlet:
   < servlet >
   < servlet-name >tiane </ servlet-name >
   < servlet-class >com.dvnchina.test.Tiane </ servlet-class >
   </ servlet >
   < servlet-mapping >
   < servlet-name >tiane </ servlet-name >
   < url-pattern >/tiane </ url-pattern >
</ servlet-mapping >
### Servlet 中实现跳转JSP 页面的方式 在 Java Web 开发中,Servlet 可以通过多种方式实现向 JSP 页面的跳转功能。以下是主要的两种方法及其特点: #### 1. 使用 `RequestDispatcher` 的 `forward()` 方法 这是服务器端的一种跳转方式。通过获取 `RequestDispatcher` 对象并调用其 `forward()` 方法,可以将请求和响应对象转发给目标 JSP 页面。 ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置属性以便在 JSP 页面中使用 request.setAttribute("message", "This is a message from the servlet."); // 获取 RequestDispatcher 对象 RequestDispatcher dispatcher = request.getRequestDispatcher("/targetPage.jsp"); // 执行转发操作 dispatcher.forward(request, response); } ``` 这种方式的特点在于: - 请求被转发后,浏览器地址栏中的 URL 不会发生变化[^2]。 - 原始请求和会话数据会被保留,并可以直接传递给目标页面[^1]。 #### 2. 使用 `HttpServletResponse` 的 `sendRedirect()` 方法 这是一种客户端跳转方式。通过设置 HTTP 响应头信息,通知浏览器访问新的 URL 地址。 ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置重定向的目标页面 String redirectUrl = "/targetPage.jsp"; // 执行重定向操作 response.sendRedirect(redirectUrl); } ``` 这种方式的特点在于: - 浏览器地址栏中的 URL 将显示为目标页面的地址[^2]。 - 这是一个全新的请求过程,原始请求的数据无法直接传递给目标页面[^3]。 --- ### 总结对比 | 特性 | `forward()` | `sendRedirect()` | |--------------------------|-------------------------------------|----------------------------------| | **发生位置** | 服务器端 | 客户端 | | **URL 是否改变** | 否 | 是 | | **是否保留原请求数据** | 是 | 否 | 如果需要保持原有请求数据并在同一应用上下文中处理,则推荐使用 `forward()` 方式;而如果希望让用户感知到页面的变化或者跨域跳转,则适合采用 `sendRedirect()`[^2]。 --- ### 示例代码总结 以下是一段完整的示例代码展示如何从 Servlet 跳转JSP 页面: ```java import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/exampleServlet") public class ExampleServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 添加共享数据供 JSP 显示 request.setAttribute("greetingMessage", "Hello from Servlet!"); // 使用 forward() 实现内部跳转 request.getRequestDispatcher("/result.jsp").forward(request, response); /* 如果需要 sendRedirect() 则替换上面两行为如下代码: response.sendRedirect("/result.jsp"); */ } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值