之前知道 forward后地址栏地址不变,redirected后地址栏地址会变化,举个登陆的例子:
login.jsp ---> check (servlet) ---> 成功success(servlet),失败false(servlet)login.jsp
<form action="CheckUser" method="post">
username:<input type="text" name="username" /><br>
password:<input type="password" name="password" /><br>
<input type="submit" value="submit" />
<input type="reset" value="reset" />
</form>
check (servlet)
success(servlet)
false(servlet)
这个程序主要看 forward 或 redirect 完后,会不会继续执行 check之后的代码。
经测试:
redirect后,先继续执行 check下面的 "this is rederect end",然后再执行 false(servlet)代码而 forward 后,先执行 success(servlet) 的代码,然后再执行 check下面的"this is forward end"还有就是: redirect 后,false(servlet) 取不到 user 的值,而 forward 后,success(servlet) 则可以。换句话说 forward 后,success(servlet) 的 request 与 check(servlet) 的 request 所指向的对象是一个。也就是 getServletContext().getRequestDispatcher("/Success").forward(request, response) 这句把当前的 request 和 response 的引用作为参数 forward 到 success(servlet)
总结:
redirect 后,确认了要跳转的页面的 url,继续执行 redirect 下面的代码;执行完后,断开当前的与
用户所发出的请求连接,即断开 request 的引用指向,因此 request 里存放的 username 信息也会丢失
;然后再与用户建立新的请求连接,即创建新的 request 对象,这样 false 页面的通过
request.getAttribute("user") 就会得到一个 null 值;最终显示的是页面是 false 页面,所以地址栏
的 url 内容会发生变化。
forward 后,确认了要跳转的页面的 url,现在停止继续执行后面的代码,而是先执行 success
(servlet) 里的代码,执行完后再回来继续执行 check 后面的代码;在这期间 check 和 success 共享
一个 request 和 response 对象,所以 success 页面通过 request.getAttribute("user") 便可以取到
值;这个过程最后执行的还是 check 页面(即使 forward 后面没有任何代码),所以地址栏的 url 内容
不会发生变化。
续:
有时候会出现这样的两种错误:
1:
java.lang.IllegalStateException
org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
2:
java.lang.IllegalStateException: Cannot forward after response has been committed
通过上面介绍,不难理解其原因是:前者是 forward 后面的代码还要执行 redirect,后者是 redirect
后面还要执行 forward。其具体原因还有待研究。