区别
1:转发是一次请求,一次响应(仅仅是服务器内部行为)。而重定向是两次请求,两次响应;
2:转发只能在工程内进行,而重定向可以到任意位置;
3:转发后地址栏不变。而重定向会变。
二者的选用规则
如果是服务器内部的资源,建议使用转发。
如果是服务器外的资源,只能使用重定向。
关于路径
重定向带工程名,转发不带。浏览器往服务器走的都带工程名,服务器内部玩儿的都不带工程名。
转发:
request对象可以进行转发操作
转发:是服务器内部的一个行为,从A处转到B处….
对于浏览器来说,浏览器是不知道服务器内部的转发行为的!
转发的过程中request对象并没有死亡,因此在request对象存的值,依然有效!!!
通常都是在servlet中使用request存值,转发到jsp页面,在jsp页面通过reqesut对象取值;
转发的代码格式:
request.getRequestDispatcher(“/必须斜杠开头,代表的是工程名”).forward(request, response);
此处理解成webcontent也可以,因为编译后webcontent也没有了,工程下直接就是webcontent下的内容
举例:
public class MyServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1:向reqesut对象中存值
request.setAttribute("username","迪丽热巴");
//2:转发到attr2.jsp页面
request.getRequestDispatcher("/attr2.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
重定向:
重定向方式一:用response操作响应头location
location 配合302状态码可以让浏览器重定向;值格式:”绝对路径”
绝对路径:说的是带工程名。如果去其他地方就带协议,所以建议又带协议又带工程名。
举例:
重定向到www.itcast.cn这个网站。
response.setStatus(302);
response.setHeader(“location”, “http://www.itcast.cn“);
重定向方式二(常用):方式一的优化代码
response.sendRedirect(“http://www.itheima.com“);