Request
1.内置对象request提供了一系列关于获取请求头之类的详细信息,还有关于jsp页面提交数据中文乱码的问题。因为get和post提交方式默认是以ISO-8859-1的编码提交的,Request对象也是以ISO-8859-1的编码获取数据的,想要解决这个问题就要在Request对象获取数据时将ISO-8859-1编码改成UTF-8。
post提交方式的只需要调用 request.setCharacterEncoding("utf-8"); 语句就可以了。由此可见setCharacterEncoding()方法只是针对FormDate中提交的数据有效。
get提交方式需要重新实例化String对象,如下
或者直接将tomcat config中的server.xml文件中配置UTIEncoding=“utf-8” 来解决乱码问题。
Response
1.动态响应客户端的请求,控制发送给用户的信息。提到响应就得说说请求转发和重定向的区别和联系了。
区别:
-
request.getRequestDispatcher()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;服务器内部转发,整个过程处于同一个请求当中。
response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。不在同一个请求。重定向,实际上客户端会向服务器端发送两个请求。 所以转发中数据的存取可以用request作用域:request.setAttribute(), request.getAttribute()
,重定向是取不到request中的数据的。只能用session。 -
forward()更加高效,在可以满足需要时,尽量使用RequestDispatcher.forward()方法。
-
RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法。
sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。 - 重定向可以跨域访问,而转发是在web服务器内部进行的,不能跨域访问。
请求转发和重定向的应用场景:
1. forward: 访问 Servlet 处理业务逻辑,然后 forward 到 jsp 显示处理结果,浏览器里 URL 不变
2. redirect: 提交表单,处理成功后 redirect 到另一个 jsp,防止表单重复提交,浏览器里 URL 变了