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