日期:2014-05-16  浏览次数:20358 次

Servlet和JSP跳转相关

先前在做项目的时候,没有太多去注意Servlet和JSP之间的跳转。今天在自己做JavaMail的时候,出现跳转问题。上网查了些资料,解决了。于是想着记下来。

Servlet的跳转有下面两种方式:
(1)redirect方式
String targetUrl = "xxx.jsp?param_1=xxx&param_2=xxxx";
response.sendRedirect(targetUrl);

该方式给用户浏览器发送通知,然后由浏览器再给服务器发送跳转请求,所以比较类似用户自己去点URL的跳转。这种方式如果需要传参给跳转页面,需要使用Session或者使用GET方式将参数显式的写在targetUrl里(如:ooxx.jsp?id=1),无法使用request.setAttribute来传递,而且大部分情况下由于GET方法的局限性,这种跳转方式只能带较为简单的参数。


此方法JSP页面接受参数写法:
String xxx = request.getParameter("xxx");

session.getAttribute("xxx").toString(); //如果用的是session方式传递参数


(2)forward方式(RequestDispather方式)
request.setAttribute("key","value");
RequestDispatcher requestDispatcher = request.getRequestDispatcher("targetUrl");
   requestDispatcher.forward(request, response);

从现象上看就是用户的浏览器内容发生了变化,但是浏览器的地址栏不变还是老地址。这种方式由服务器直接控制request及response的走向及参数,从命令行的参数上就可以看出这一点。这样方便程序员控制参数的传递,几乎可以传递任何类型的参数,只要简单的使用setAttribute()方法即可,也可以通过Session和parameter的形式传递参数。

getRequestDispatcher()方法的参数必须以“/”开始,“/”表示本Web应用程序的根目录。

当执行forward方法时,不能有任何输出到达客户端,否则会抛出异常,也就是说,在forward之前,不要使用out.println()语句向客户端输出。

此方法JSP页面接受参数写法;
String xxx = request.getAttribute("xxx").toString();
或其他如:
String xxx = request.getParameter("xxx"); //用paramter传递

session.getAttribute("xxx").toString(); //如果用的是session方式传递参数


JSP的跳转:
(1)response.sendRedirect();

和servlet的response.sendRedirect()方式一样。此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
...
跳转后浏览器地址栏变化 。
如果Servlet页面跳转要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;
如果要跳Servlet页面跳转要到相同主机下,此语句后面的语句执行完成后才会跳转;


(2)response.setHeader("Location","");

此语句前不允许有out.flush(),如果有,页面不会跳转。
跳转后浏览器地址栏变化 。
此语句后面的语句执行完成后才会跳转 。

(3)<jsp:forward page="" />

此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed.
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134)
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101)
at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
...
Servlet页面跳转后浏览器地址栏不变,但是只能跳到当前主机下。
此语句后面的语句执行完成后才会跳转。

?