1.RequestDispatcher.forward()
是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递.
但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面.
在JavaServer Pages (JSP) 开发中,页面跳转是一种常见的操作,它允许用户从一个页面导航到另一个页面。本文将重点讨论两种主要的JSP跳转方式:`RequestDispatcher.forward()` 和 `response.sendRedirect()`,以及JSP标签 `<jsp:forward page="">`。
1. `RequestDispatcher.forward()`
`RequestDispatcher.forward()` 方法是在服务器端执行的,它用于将当前HTTP请求转发到另一个Servlet、JSP或HTML文件。当在a.jsp中使用`forward()`将请求重定向到b.jsp时,所有在原始请求(如表单提交)中的信息都会被保留,并且在b.jsp中可以直接访问这些参数,无需再次传递。这是因为转发过程中,请求对象没有改变,只是请求的处理路径发生了变化。然而,`forward()`方法不支持重定向到包含frameset的JSP文件,但可以重定向到包含frames的HTML文件。此外,它不能直接在URL后面附加参数,如`servlet?name=frank`。如果需要传递参数,应使用`request.setAttribute()`方法在服务器端将数据存储,并在目标页面通过`request.getAttribute()`获取。
示例代码:
```java
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=gb2312");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp"); // 转向的页面
rd.forward(request, response);
}
```
通常,`forward()` 方法在Servlet中使用,而不是直接在JSP中使用。
2. `response.sendRedirect()`
与`forward()`不同,`response.sendRedirect()` 是在客户端浏览器端进行操作。它可以携带参数,例如`servlet?name=frank`,并且可以重定向到不同服务器上的资源,包括包含frameset的JSP文件。在浏览器的地址栏中,用户可以看到重定向的URL。需要注意的是,在使用`sendRedirect()`之前,不应有任何HTML输出,以避免影响重定向,且在调用该方法后应立即跟上`return`语句,确保页面处理完毕后进行跳转。
示例代码:
```java
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=gb2312");
response.sendRedirect("/index.jsp");
}
```
在JSP页面中,可以直接使用`response.sendRedirect()`进行重定向。
3. `<jsp:forward page="">`
JSP 标签 `<jsp:forward>` 是JSP内置的一个动作标签,它同样用于页面间的跳转,但在表现层处理。底层实现上,它实际上会调用`RequestDispatcher.forward()`。与`forward()`方法一样,它不会改变浏览器的URL,但支持重定向到包含frameset的JSP页面。使用`<jsp:forward>`标签,你可以指定要转向的页面,如下所示:
```jsp
<jsp:forward page="newPage.jsp" />
```
总结:
- `RequestDispatcher.forward()` 是服务器端的跳转,效率较高,且浏览器地址栏不变,适用于在同一应用内部跳转。
- `response.sendRedirect()` 是客户端的跳转,地址栏会显示新的URL,支持跨域跳转,适用于需要用户看到新URL的情况。
- `<jsp:forward page="">` 是JSP动作标签,功能与`forward()`类似,主要用于JSP页面内部。
选择哪种跳转方式取决于具体需求。在满足条件的情况下,通常推荐使用`forward()`,因为它更高效,且保持了请求的私密性。但如果需要用户看到新的URL或者需要跨域跳转,`sendRedirect()`是更好的选择。而`<jsp:forward>`则提供了一种在JSP页面内简便的转发机制。