010_01Servlet Request&Response

  HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息

  HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法

request常用方法:

  获得客户机信息

    getRequestURL方法返回客户端发出请求时的完整URL。

    getRequestURI方法返回请求行中的资源名部分。

    getQueryString 方法返回请求行中的参数部分。

    getRemoteAddr方法返回发出请求的客户机的IP地址

    getRemoteHost方法返回发出请求的客户机的完整主机名

    getRemotePort方法返回客户机所使用的网络端口号

    getLocalAddr方法返回WEB服务器的IP地址。

    getLocalName方法返回WEB服务器的主机名

    getMethod得到客户机请求方式

  获得客户机请求

    getHead(name)方法

    getHeaders(String name)方法

    getHeaderNames方法

  获得客户机请求参数(客户端提交的数据)

    getParameter(name)方法

    getParameterValues(String name)方法

    getParameterNames方法

RequestDispather:

  表示请求分发器,它有两个方法:

    forward():把请求转发给目标组件

    include():包含目标组件的响应结果

  得到RequestDispatcher对象

    1、ServletContext对象的getRequestDispather(String path1) path1必须用绝对路径,即以”/”开头,若用相对路径会抛出异常IllegalArgumentException

    2、ServletRequest对象的getRequestDispatcher(String path2) path2可以用绝对路径也可以用相对路径

dispatcher.forward(request,response)的处理流程:

  1、清空用于存放响应正文数据的缓冲区

  2、如果目标组件为Servlet或JSP,就调用它们,把它们产生的响应结果发送到客户端;如果目标组件为文件系统中的静态HTML文档,就读取文档中的数据并把它发送给客户端。

    特点:1、由于forward()方法先清空用于存放响应正文数据的缓冲区,因此源组件生成的响应结果不会被发送到客户端,只有目标      组件生成的响应结果才会被送到客户端。

       2、如果源组件在进行请求转发之前,已经提交了响应结果(如调用了response的flush或close方法),那么forward()方法会抛出IllegalStateException。为了避免该异常,不应该在源组件中提交响应结果。

include()方法的处理流程:

  1、如果目标组件为Servlet或JSP,就执行它们,并把它们产生的响应正文添加到源组件的响应结果中;如果目标组件为HTML文档,就直接把文档的内容添加到源组件的响应结果中。

  2、返回到源组件的服务方法中,继续执行后续代码块。

     特点: 1、源组件与被包含的目标组件的输出数据都会被添加到响应结果中。

         2、在目标组件中对响应状态代码或者响应头所做的修改都会被忽略。

重定向机制的运作流程:

  1、用户在浏览器端输入特定URL,请求访问服务器端的某个组件

  2、服务器端的组件返回一个状态码为302的响应结果。

  3、当浏览器端接收到这种响应结果后,再立即自动请求访问另一个web组件

  4、浏览器端接收到来自另一个web组件的响应结果。 HttpServeltResponse的sendRedirect(String location)用于重定向

  特点:

    Servlet源组件生成的响应结果不会被发送到客户端。response.sendRedirect(String location)方法一律返回状态码为302的响应结果。

    如果源组件在进行重定向之前,已经提交了响应结果,会抛出IllegalStateException。为了避免异常,不应该在源组件中提交响应结果。

    在Servlet源组件重定向语句后面的代码也会执行。

    源组件和目标组件不共享同一个ServletRequest对象。

    对于sendRedirect(String location)方法的参数,如果以“/”开头,表示相对于当前服务器根路径的URL。以“http"//”开头,表示一个完整路径。

    目标组件不必是同一服务器上的同一个web应用的组件,它可以是任意一个有效网页。

response细节:

  getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。   

  getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 会抛异常。

  Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。

  Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象

posted @ 2015-06-19 12:51  woodrow_woo  阅读(114)  评论(0编辑  收藏  举报