`
wade6
  • 浏览: 270155 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Servlet学习整理(四)—— ServletRequest和ServletResponse

 
阅读更多

基于Servlet的web应用交互过程

web应用一般是基于http的请求响应模式,一个使用servlet实现的web应用典型的交互过程如下:

 

1) 客户端向web服务器发起一个HTTP请求;
2) HTTP请求被web服务器接受,并移交给servlet引擎;
3) servlet引擎根据配置决定调用那个servlet,并把request对象、response对象传给它。
4) servlet通过request获取用户信息和请求的内容,servlet处理完请求后把要返回的信息放入response对象;
5)一旦servlet完成了请求的处理,servlet引擎就会刷新response,把控制权返回给web服务器;
6)web服务器将从servlet引擎获取的内容返回给客户端;

 

 

ServletRequest和ServletResponse

在Servlet规范中,ServletRequest代表客户端对服务器的请求,ServletResponse代表服务器给给客户端的响应;

 

其中,最重要的是HttpServletRequest 和 HttpServletResponse 这两个子接口;

 

这两个接口就是对http协议的请求和响应做面向对象的封装。

 

 

HttpServletRequest

在基于servlet的web应用交互中,客户端通过http协议发送请求至服务器,请求中会包含很多信息,如客户端的浏览器信息以及请求内容等等;这些信息被包含在http头和消息体中,并且以name-value的形式存在,一个name可以对应多个value。

 

web服务器接到客户端的http请求后会转发给内部的servlet容器处理;

 

serlve容器拿到请求后,会解析http请求包含的信息,然后将这些信息封装成HttpServletRequest对象,并传给合适的servlet实例进行处理;

 

1、请求参数

 

通过HttpServletRequest的下列方法,可以获取这些参数信息:

 

  • getParameter(String arg0)
  • getParameterNames()
  • getParameterValues(String arg0)

 

需要注意的是getParameterValues(String arg0)获取的是与arg0对应的value数组,getParameter(String arg0)获取的是value数组中的第一个值;

 

如果过URI中的参数为a=1;POST中的参数为a=2,a=3;请求中的参数a={1,2,3}。

 

如果想获取请求的路径参数,则必须通过解析方法getRequestURI()或getPathInfo()返回的字符串。

 

2、属性

 

request的属性就是一些对象;

 

容器可以将一些不能通过默认接口表达的信息通过属性的方式设置到request中;

 

也可以设置一些属性用来在servlet之间的通信

 

request对象中的关于属性方法有:

  • getAttribute(String arg0)
  • getAttributeNames()
  • setAttribute(String arg0,Object arg1)

与参数不同,这里一个属性名称只能关联一个value。

 

以“java.”或“javax.”为前缀的属性名是规范保留的,类似的“sun.”“com.sun”是sun公司的保留字,这些保留的前缀是不能使用的。

 

3、头信息

 

通过HttpServletRequest的下列方法,servlet可以获取http请求的头信息:

  • getHeader
  • getHeaders
  • getHeaderNames

getHeader 方法返回头的名称。一个名称可以关联多个头信息,如果在这种情况下,getHeader

方法返回第一个头信息。

 

getHeaders返回与一个名称关联的所有头信息存放在Enumeration对象中。

 

HttpServletRequest提供了一些提取头信息的类型转换方法,如:getIntHeader 把头信息中的数据转换成int型等。

 

4、请求路径

 

一个请求映射到一个servlet上,其请求路径包含了很多重要的部分,包括Context Path、Servlet Path、PathInfo。

 

其对应的方法有如下三个:

 

  • getContextPath
  • getServletPath
  • getPathInfo

 

除了编码方式不同外,下列等式是正确的:

 

requestURI = contextPath + servletPath + pathInfo

 

例如:

 

配置关系如下

 

Conteext Path: /catalog

 

Servlet:LawnServlet

Servlet Mapping Pattern:/lawn/*

 

Servlet:GardenServlet

Servlet Mapping Pattern:/garden/*

 

Servlet:JSPServlet

Servlet Mapping Pattern:*.jsp

 

注意下面的路径的组成

 

 

/catalog/lawn/index.htm;ContextPath:/catalog;ServletPath:/lawn;PathInfo:/index.html

 

/catalog/garden/implements/;ContextPath:/catalog;ServletPath:/garden;PathInfo:/implements/

 

/catalog/help/feedback.jsp;ContextPath:/catalog;ServletPath:/help/feedback.jsp;PathInfo:null

 

 

5、路径转换方法

 

在API中有两个简单的方法允许开发者获得文件系统的路径:

  • ServletContext.getRealPath
  • HttpServletRequet.getPathTranslated

getRealPath(String aPath)方法返回本地文件系统的绝对路径。

 

getPathTranslated方法计算出请求pathInfo中的绝对路径。

 

以上的两个方法,servlet引擎不能辨认文件的路径是否有效,当web应用调用一个不确定远程文件系统,或数据库路径中的文件时,会返回null。

 

 

6、cookie

 

 

HttpServletRequest接口中提供了getCookies方法来返回请求中的cookies数组;

 

在每次客户端请求时cookies数据就从客户端发送给服务器。

 

客户端返回的cookie信息是cookie的name和cookie的value。

 

当cookie被发送至浏览器时,cookie的信息就会被设置。

 

 

7、SSL属性

 

如果一个请求是通过一个安全协议进行传输的,例如HTTPS,那么这个信息必须通过ServletRequest的isSecure方法进行暴露。而且web容器必须将下列属性暴露给开发人员:

 

Attribute Atrribute Name Java type
Cipher suite javax.servlet.request.cipher_suite String
bit size of the algo-rithm javax.servlet.request.key_size Integer

 

 

 

 

 

如果过一个请求中包含一个SSL证书信息,servlet引擎必须把它作为一个数组对象暴露给servlet开发者,可以通过ServletRequest属性中的javax.servlet.request.X509Certificate属性获得,该数组的类型为java.security.cert.X509Certificate。

 

数组排列的顺序是按照信任程度的升序,第一个证书是客户端设置的,第二个用来验证第一个,以此类推。

 

8、国际化

 

客户端可以通过http头信息的Accept-Language来告诉web服务器客户端想要哪一种语言的响应;

 

ServletRequest中提供的相关方法如下:

  • getLocale
  • getLocales

getLocale方法将返回客户端首选的Locale。

 

getLocales方法返回一个Enumeration,从首选的locale开始递减。

 

如果客户端没有制定首选的locale,servlet引擎一定要提供一个默认的locale供getLocale方法返回,getLocales方法必须包含一个默认的locale的locale element

 

 

9、请求数据的编码

 

 

有许多web浏览器不发送带有“content-type”头信息的字符编码限定符,而由读取http请求的代码来决定字符的编码方式。

 

默认情况下,如果客户端请求未定义编码限定符,容器(如tomcat)会用“ISO-8859-1”去创建request reader和解析POST的数据;

 

为了向开发者指明客户端没有发送字符编码信息的情况,容器对getCharacterEncoding方法返回null。

 

如果客户端不设置字符编码方式,并且request不是按照以上缺省编码方式(ISO-8859-1)来编码,则会发生问题。

 

为了解决这个问题,在接口ServletRequest中加入了一个新的方法setcharacterencoding(string encoding)。开发者可以调用这个方法来替换包容器提供的缺省字符编码方式。

 

但是,必须在从request中分析任何post数据或者读取任何输入之前调用这个方法。一旦数据已被读取,则调用这个方法将不会影响编码方式

 

注意:自从Tomcat5.x开始,GET和POST方法提交的信息,tomcat采用了不同的方式来处理编码,对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使用默认的iso-8859-1编码。而GET请求则不同,Tomcat对于GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,而会永远使用iso-8859-1编码

 

 

10、request对象的生命周期

 

request对象只有在servlet的service()方法或者filter的doFilter()方法中才有效;

 

为了避免创建request对象的性能消耗,容器会重用request对象

 

所以不能在上述范围以外持有对request的引用,否则会出现难以预料的错误。

HttpServletResponse

请求被servlet处理后,一般都会返回处理的结果信息,这些信息被封装到HttpServletResponse对象中并返回给servlet容器;

 

servlet容器将HttpServletResponse对象转化成http响应交给web服务器,web服务器得到响应后将其转发给客户端;

 

1、缓存

 

为了提高效率,servlet容器允许将发送给客户端的内容进行缓存;典型的服务器都会使用缓存,并且允许servlet指定缓存参数。

 

ServletRequest接口中关于缓存的方法如下:

  • getBufferSize
  • setBufferSize
  • isCommitted
  • Reset
  • resetBuffer
  • flushBuffer

这些方法只在servlet调用ServletOutputStream或者Writer之前有效。

 

当使用的缓存已满时,容器必须立刻刷新把缓存的内容发送到客户端,如果这是第一个被发送到客户端的数据,那么response也会被认为是已提交。

 

2、头信息

 

servlet可以通过ServletResponse接口设置响应的头信息,如下方法:

  • setHeader
  • addHeader
  • setIntHeader
  • setDateHeader
  • addIntHeader
  • addDateHeader

在response被提交前头信息必须被设置,否则无效。

 

开发人员有责任设置Content-Type头信息,用来表示servlet生成的内容类型。

 

HTTP1.1规范没有要求设置这个头信息,所以当开发人员没有设置这个类型时容器没必要设置一个默认值。

 

3、简单的方法

 

在HttpServletResponse接口中有下列简单的方法:

  • sendRedirect
  • sendError

sendRedirect方法会设置合适的头信息和消息体,使客户端重定向到两一个url;

 

如果参数是一个相对路径,底层容器会将其转换成绝对路径发送给客户端;如果转换失败则抛出IllegalArgumentException;

 

sendError方法同上。

 

4、国际化

 

servlet应该设置一个response的local和字符编码。

 

local使用ServletRespnse的setLocal方法,如果response被提交前没有设置local,容器的默认local会被使用。

 

setCharacterEncoding用来设置字符编码,response默认的编码方式是“ISO-8859-1”。

 

5、response对象的关闭

 

当一个response对象被关闭,容器必须立即将缓存中的内容发送给客户端。下列条件表示servlet已经满足请求的内容并关闭response对象:

 

  • servlet方法service结束;
  • response中通过setContentLength设置的指定数量的信息被写入到response;
  • 调用sendError方法;
  • 调用sendRedirect方法。

 

6、response对象的生命周期

 

同request对象的生命周期。

 

 

问题:

 

1、HttpServletRequest对象是怎么被容器重用的?

 

可以参考http://bbs.csdn.net/topics/300088535

 

 

 

 

 

 

 

分享到:
评论
4 楼 15533921258 2016-12-18  
楼主写的真不错啊,很多人的博客只说客户端发一次请求就会生成httprequest对象,却不说这个httpreuest是在哪里生成的,楼主写出来了,谢谢。
3 楼 御兰草 2014-08-01  
饿都是倒萨大师傅斯蒂芬发是
2 楼 御兰草 2014-08-01  
的大师傅大师傅大师傅发
1 楼 御兰草 2014-08-01  
还不错啊啊地方

相关推荐

    超全面javaweb教程28天第9天 7 Servlet相关类之ServletRequest和Servletresponse对象的简单介绍

    超全面javaweb教程28天第9天_7_Servlet相关类之ServletRequest和Servletresponse对象

    tomcat技术文档.doc

    客户请求访问servlet时-----servlet容器创建一个servletRequest 和servletResponse对象 servletRequest包含请求,-----servlet容器吧这两个对象传给所请求的servlet,-----servlet将相应的结果写入servletResponse...

    学习servlet的实例和参考api

    类 ServletConfig ServletOutputStream ServletContext ServletInputStream ServletResponse GenericServlet ServletRequest Servlet <br>javax.servlet.http<br>接口 类 HttpSession Cookie...

    servlet-api-2.4.jar.zip

    javax.servlet.ServletResponse javax.servlet.ServletException javax.servlet.http.HttpServlet javax.servlet.http.HttpSession javax.servlet.RequestDispatcher javax.servlet.SingleThreadModel javax.servlet...

    servlet2.4doc

    doFilter(ServletRequest, ServletResponse, FilterChain) - Method in interface javax.servlet.Filter The doFilter method of the Filter is called by the container each time a request/response pair is ...

    javax.servlet.jar下载

    javax.servlet.ServletResponse.class javax.servlet.ServletConfig.class javax.servlet.ServletInputStream.class javax.servlet.ServletOutputStream.class javax.servlet.FilterChain.class javax.servlet....

    servlet-api.jar

    既然开发jsp、servlet的程序,就应该知道这是基于http(请求、响应)协议的,那么在这里请求和响应就对应为servlet-api.jar中的ServletRequest和ServletResponse接口,接口中定义了作为一个请求和一个响应信息应该具备...

    Servlet过滤器使用

    b、doFilter(ServletRequest,ServletResponse,FilterChain): 这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器。 ...

    java-servlet-api.doc

    当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。 Servlet也可以执行ServletRequest接口和ServletResponse接口。...

    servletAPI中文版(TXT格式,自己翻译)

    void service(ServletRequest request, ServletResponse response)throws ServletException,IOException 处理request对象中描述的请求,使用response对象返回请求结果 String getServletInfo() 返回描述servlet的一...

    JavaWeb核心之Servlet-源代码

    JavaWeb核心之Servlet。...2)service(ServletRequest request,ServletResponse response) 何时执行:每次请求都会执行 ServletRequest :代表请求 认为ServletRequest 内部封装的是 http请求的信息

    servlet temple

    每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 ...

    购物车源码

    public void doFilter ServletRequest sRequest ServletResponse sResponse FilterChain chain throws IOException ServletException { HttpServletRequest request HttpServletRequest sRequest; String ...

    ServletRequest过滤程序

    提供了ServletRequest过滤程序,重新构造对象内容,并有效规避request.getParameter()、request.getInputStream()冲突的问题,同时提供了对跨站脚本攻击XSS和SQL注入的过滤程序。

    手动创建servlet 含源码

    介绍了什么是servlet,怎么通过get和post方式访问servlet,手动创建servlet,内含源码

    Filter_Listener相信代码使用

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest reque=(HttpServletRequest) request; System.out...

    javaWEB总结(6):ServletRequest

    javaWEB总结(6):ServletRequest测试代码

    Servlet 详解

    文章目录一、Servlet 的定义二、Servlet 的生命周期1、Servlet 出生2、Servlet 服务3、Servlet 销毁三、Servlet 中的接口1、ServletRequest 和 ServletResponse2、ServletRequest3、ServletResponse4、ServletConfig...

    2019考试大纲1

    考试大纲API方面,包括Servlet, HttpServlet, ServletRequest, ServletResponse, HttpServletRe

    Java™ Servlet 规范.

    2.3.1 加载和实例化 ................................................................................................................................16 2.3.2 初始化 ........................................

Global site tag (gtag.js) - Google Analytics