Java web基础总结五之—— HttpServletRequest与HttpServletResponse
在前面总结过,每当客户端给Web服务器发送一个http请求,web服务器就会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象就代表请求和响应,所以我们可以通过request对象获得请求相关的数据和操作。通过response对象进行对响应相关的数据封装和一些其他的操作。
一.HttpServletRequest与HttpServletResponse的实现类
我们会发现,HttpServletRequest与HttpServletResponse都是接口,那么它们在运行的时候的实现类是什么?是由谁负责实例化它们的实现类呢?
通过对上一篇文章的HelloWorldServlet进行调试,可以得到答案。HelloWorldServlet的部分代码的截图如下所示:
这张图是调试时获得的:
通过上面的图我们可以看到,HttpServletRequest与HttpServletResponse的对象req,resp的实际的类型是RequestFacade和ResponseFacade。这两个类都是org.apache.catalina.connector包下面的。也就是我使用的web服务器tomcat的两个类。所以还是由web容器来负责实例化HttpServletRequest与HttpServletResponse的对象。
二.HttpServletRequest简介
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中。
request常用的方法和操作:
1.获得客户端的信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分,去掉主机名的部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式,如GET,POST
2.获得请求头的一些方法
getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
3.获得请求参数,也就是客户端提交的数据的一些方法。
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法
4.HttpServletRequest实现转发
请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
5. request域
request对象同时也是一个域对象,我们通过request对象在实现转发时,可以把数据通过request对象带给其它web资源处理。下面是常用的一些对域中的属性的操作的方法:
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
6. Request的getParameter和getAttribute方法的区别。
由于request也是一个域对象,所以既可以从它获得参数,即Parameter。也可以获得域中的属性。但是他们的意义是完全不一样的。
getParameter(String name)获得客户端传送给服务器的参数值,该参数是由name指定的,通常是表单中的参数。而且参数只能是字符串形式的键值对。
getAttribute(String name):返回有name 指定的属性值,如果指定的属性值不存在,则会返回一个null值。这里存放的也是一个键值对,不同的是,这里的值可以是任意的类型。
三.HttpServletResponse简介
HttpServletResponse则是对服务器的响应对象。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
response常用的方法和操作:
1.常用的方法
addCookie(Cookie cookie) 向客户端写入Cookie
addHeader(java.lang.String name, java.lang.String value) 写入给定的响应头
encodeURL(java.lang.Stringurl) 默认cookie中包含Session ID,如果客户端不支持 Cookie,就在参数 url 中加入 Session ID 信息,可以解决用户禁用cookie的问题。
setStatus(intsc) 设置响应的状态码。
2. getOutputStream和getWriter方法的区别
getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
这两个方法写入的数据会作为响应消息的正文,与响应状态行和各响应头组合后输出到客户端。Serlvet的service方法结束后,web容器将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,web容器将调用close方法关闭该输出流对象。
3. HttpServletResponse实现重定向
重定向指的是一个web资源收到客户端请求后,web服务器通知客户端去访问另外一个web资源,这称之为请求重定向。实现方式是调用response.sendRedirect()方法。实现的原理就是给客户端返回了302状态码和location头。
四.转发forward和重定向Redirect的区别
转发是在服务器端实现的。一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
而重定向是在客户端实现的。一个web资源收到客户端请求后,通知客户端的浏览器去访问另外一个web资源,称之为请求重定向。所以调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL。
RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的其他资源; sendRedirect方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端将请求转发给另外一个资源,相当过程于对客户端不可见。
RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。也就是说,重定向生成了新的request对象和response对象。