转发(forward)
一、定义
过程中,浏览器只发起了一次请求,并且只有一次响应,而Servlet在处理完请求后直接将响应发送给了浏览器,这种方式称为转发。
二、实现步骤
(1)当用户发起请求时,Web服务器接收到请求并将请求发送到对应的Servlet。
(2)Servlet处理请求并将响应发送回Web服务器。
(3)Web服务器将响应发送回浏览器,浏览器显示响应内容。
转发(注意路径是相对于web站点根目录)
request.setAttribute("name", "zhangsan");
request.getRequestDispatcher("/index.jsp").forward(request, response);
注意这里是给服务器用,所以不需要获取虚拟目录,即 request.getContextPath();
转发通过request.getAttribute带值。
三、中文乱码
使用req.setCharacterEncoding("utf-8");解决转发中文乱码的问题。
四、举例说明
重定向(redirect)
一、定义
过程中,浏览器发起了两次请求,第一次是用户发起的,第二次是Servlet发起的,而由于重定向的特性,第一次请求的响应被忽略掉了,只有第二次请求的响应被显示在浏览器上,这种方式称为重定向。
二、实现步骤
(1)当用户发起请求时,Web服务器接收到请求并将请求发送到对应的Servlet。
(2)Servlet处理请求并发起一个新的请求,请求重定向到另一个页面。
(3)Web服务器将新的请求发送到另一个页面,该页面处理请求并将响应发送回Web服务器。
(4)Web服务器将响应发送回浏览器,浏览器显示响应内容。
重定向(路径是相对于webapps)
response.sendRedirect("/Web1/MyHtml.html");
重定向通过在访问地址后拼接参数带值。
三、中文乱码
注意:URL只支持ASCII码,所以重定向带参数如果出现了中文,要用URLEncoder.encode进行编码,解码是URLDecoder.decode。
四、举例说明
转发和重定向的区别
1.重定向访问服务器两次,转发只访问服务器一次。
2.转发页面的URL不会改变,而重定向地址会改变。
3.相对路径不同,转发:站点根目录 参考上一次站点,重定向:webapps(Tomcat) 两次请求重新访问。
4.转发相当于服务器跳转,相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,前后页 共用一个request,可以通过此来传递一些数据或者session信息,request.setAttribute()和 request.getAttribute()。而重定向会产生一个新的request,不能共享request域信息与请求参数。
5.由于转发相当于服务器内部方法调用,所以转发后面的代码仍然会执行(转发之后记得return);重定向代码执行之后是方法执行完成之后进行重定向操作,也就是访问第二个请求,如果是方法的最后一行进行重定向那就会马上进行重定向(重定向也需要return)。
6.无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中移除。
ServletContext可以转发,但是很容易产生安全问题,所以以后再实际开发中一般都用request实现转发。