区别

1:转发是一次请求,一次响应(仅仅是服务器内部行为)。而重定向是两次请求,两次响应;
2:转发只能在工程内进行,而重定向可以到任意位置;
3:转发后地址栏不变。而重定向会变。

二者的选用规则

如果是服务器内部的资源,建议使用转发。
如果是服务器外的资源,只能使用重定向。

关于路径

重定向带工程名,转发不带。浏览器往服务器走的都带工程名,服务器内部玩儿的都不带工程名。

转发:

request对象可以进行转发操作
转发:是服务器内部的一个行为,从A处转到B处….
对于浏览器来说,浏览器是不知道服务器内部的转发行为的!
转发的过程中request对象并没有死亡,因此在request对象存的值,依然有效!!!
通常都是在servlet中使用request存值,转发到jsp页面,在jsp页面通过reqesut对象取值;
转发的代码格式:
request.getRequestDispatcher(“/必须斜杠开头,代表的是工程名”).forward(request, response);
此处理解成webcontent也可以,因为编译后webcontent也没有了,工程下直接就是webcontent下的内容
举例:
image.png

  1. public class MyServlet1 extends HttpServlet {
  2. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. //1:向reqesut对象中存值
  4. request.setAttribute("username","迪丽热巴");
  5. //2:转发到attr2.jsp页面
  6. request.getRequestDispatcher("/attr2.jsp").forward(request, response);
  7. }
  8. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9. doGet(request, response);
  10. }
  11. }

重定向:

重定向方式一:用response操作响应头location
location 配合302状态码可以让浏览器重定向;值格式:”绝对路径”
绝对路径:说的是带工程名。如果去其他地方就带协议,所以建议又带协议又带工程名。
举例:
重定向到www.itcast.cn这个网站。
response.setStatus(302);
response.setHeader(“location”, “http://www.itcast.cn“);
重定向方式二(常用):方式一的优化代码
response.sendRedirect(“http://www.itheima.com“);