`
personbeta
  • 浏览: 159919 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ServletRequest的一个小知识点

阅读更多

看到有人直接通过ServletRequest.getInputStream()中读取Post中的body,代码大概如下:

 

        String charset = request.getCharacterEncoding(); 
         if (charset == null) { 
             charset = DEFAULT_ENCODE; 
         } 
         BufferedReader in = new BufferedReader(new  InputStreamReader(request 
                 .getInputStream(), charset)); 
  
         // Read the request 
         CharArrayWriter data = new CharArrayWriter(); 
         char[] buf = new char[8192]; 
         int ret; 
         while ((ret = in.read(buf, 0, 8192)) != -1) { 
             data.write(buf, 0, ret); 
         } 
         return data.toString(); 

 

当时心里有个疑问:为什么不直接通过调用request.getParameter()来获取相应的值呢?虽然至今也没想到答案,但是通过查看servlet规范了解到了ServletRequest的一个小知识,规范原文如下:

 

SRV.3.1.1 When Parameters Are Available
The following are the conditions that must be met before post form data will
be populated to the parameter set:
1. The request is an HTTP or HTTPS request.
2. The HTTP method is POST.
3. The content type is application/x-www-form-urlencoded.
4. The servlet has made an initial call of any of the getParameter family of methods
on the request object.
If the conditions are not met and the post form data is not included in the
parameter set, the post data must still be available to the servlet via the request
object’s input stream. If the conditions are met, post form data will no longer be
available for reading directly from the request object’s input stream.

 

英文比较简单,就不翻译了。

 

 

 

补充:对之前问题“为什么不直接通过调用request.getParameter()来获取相应的值呢”的解答

 

不使用request.getParameter()来获取,而是在自己业务逻辑代码中处理有以下几种可能:
1、request的body内容不是“参数名=参数值”的形式,而单纯是一段文字或者二进制字节流,这样就不可能通过request.getParameter()来获取参数值;

2、如果request的body内容的格式是固定的,那么在程序代码中可以针对这种特定的格式进行优化处理;

3、如果request的body内容比较长,并且网络环境又不好,那么直接调用request.getParameter()将会阻塞较长时间。并且如果body的内容允许边接受边处理的话(比如xml),那么通过自己的业务逻辑代码来处理body内容效率将会更高;


以上答案仅仅是本人的理解,仅供参考。
 

 

 

0
1
分享到:
评论
2 楼 jiangsha 2012-09-05  
注意流只能被读取一次,先读流后,request.getParameter()就会是空的
1 楼 snow0613 2012-09-04  
呃,如果是文件上传的话,是没办法通过getParameter来获取参数值

相关推荐

    javaWEB总结(6):ServletRequest

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

    ServletRequest过滤程序

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

    ServletRequest使用介绍.docx

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

    java-servlet-api.doc

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

    Java+javabean

    The method setAttribute String Object in the type ServletRequest is not applicable for the arguments String int

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

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

    javaee-ServletRequest 类相关源代码解析

    NULL 博文链接:https://sunfish.iteye.com/blog/1485374

    tomcat技术文档.doc

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

    用装饰模式装饰HttpServletRequest对象

    首先,提出了一个与Servlet Filter有关的问题,并解释了随之而引入的装饰模式。然后,讨论了如何在Servlet环境下使用此模式,并列出了使用此模式的几个比较有名的基于Servlet的项目。最后,文章通过实现一个删除空白...

    郑州大学软件学院机试题-2011-2012_JSP程序设计

    2. FilterChain接口中仅定义一个方法:public void doFilter(ServletRequest req,ServletResponse res),该方法的作用是。() (1分) A.用于将请求/响应继续沿过滤器链向后传给下一个过滤器。如果调用该方法的过滤...

    java web 修改request携带的参数信息

    一个非常棒的程序,用于修改request携带的参数信息。使用了filter等技术。

    HttpServletRequest详解.docx

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

    手动创建servlet 含源码

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

    EL表达式的详细使用

    将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request...

    JavaWeb核心之Servlet-源代码

    案例一、完成用户登录功能 案例二、记录成功登录系统的人次。 实现步骤: 1)创建类实现Servlet接口 2)覆盖尚未实现的方法---service方法 3)在web.xml进行servlet的配置 但在实际开发中,我们不会直接去实现...

    servlet-api.jar

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

    5.Tomcat服务器运行原理.doc

    Tomcat服务器创建一个ServletRequest对象,在ServletRequest对象中包含了客户请求信息及其他关于客户的信息,如请求头,请求正文,以及客户机的IP地址等

    jsp内置对象的用法

    config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象) 序号 方 法 说 明 ...

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

    基本类和接口 一、javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了...String getServletInfo() 返回描述servlet的一个字符串 void destory() 当servlet将要卸载时由servlet引擎调用

    超级有影响力霸气的Java面试题大全文档

     SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。...

Global site tag (gtag.js) - Google Analytics