(1)request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 这个是在服务端运行的,对浏览器来说是透明的。
(2)response.sendRedirect()是重新定向,前后页面不是一个request。而这个是在浏览器端运行的。
redirect()方式:
response.sendRedirect(“/a.jsp”);
页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:
response.sendRedirect(“URL”);
跳转后浏览器地址栏变化。
这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来 传递。所以该方式只适用于无传值跳转
2) forward方式
request.getRequestDispatcher(“/路径(可以是jsp路径也可以是servlet)”) .forward(request, response);
如:
“request.getRequestDispatcher(”/2.jsp)”) .forward(request, response);”
“request.getRequestDispatcher(”/servlet/HomeServlet)”) .forward(request, response);”
Servlet页面跳转的路径是相对路径。forward方式只能跳转到本web应用中的页面上。
跳转后浏览器地址栏不会变化。
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute
实例:
用户登录模块
login.jsp
loginServlet.java
loginOK.jsp
用户访问login.jsp,输入用户名和密码进行登录,请求到达loginServlet,loginServet中,在session中加入user属性,值为输入的用户名。接着loginServlet把请求转发给loginOK.jsp,loginOK.jsp显示用户名。
代码简单描述
login.jsp中:
username=aaa,password=123;
loginServlet.java中:
String username=request.getParameter("username");
session.setAttribute("username",username);
loginOK.jsp中:
显示request中的用户名 ${username},
显示session中的用户名 ${username},
第一种情况:
由loginServlet调用forward方法进行转发,首先观察浏览器的地址栏,发现了地址是形如http://.../login.do?username=..&..的样子的。页面中的request里的用户名和session的用户名都显示了出来。
第二种情况:
由loginServlet调用sendRedirect方法进行转发,还是观察地址栏,发现地址已经变成http://.../loginOK.jsp了,
页面中request里面的用户名没有显示出来,但是session里的用户名却显示了出来。
这是为什么呢?
原来,forward 是服务器端的跳转,也就是客户端根本不知道这个动作,从一个java程序转到了另一个java程序,所以此时request会被作为参数传递过去。
但是,sendRedirect 这个是客户端的跳转,服务器端会发送一个跳转的代码和url给浏览器,浏览器会重新请求指定的URL,所以此时,request已经无效了。当然,此时session还是生效的。