看到有人直接通过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内容效率将会更高;
以上答案仅仅是本人的理解,仅供参考。
分享到:
相关推荐
javaWEB总结(6):ServletRequest测试代码
提供了ServletRequest过滤程序,重新构造对象内容,并有效规避request.getParameter()、request.getInputStream()冲突的问题,同时提供了对跨站脚本攻击XSS和SQL注入的过滤程序。
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息;
当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。 Servlet也可以执行ServletRequest接口和ServletResponse接口。...
The method setAttribute String Object in the type ServletRequest is not applicable for the arguments String int
超全面javaweb教程28天第9天_7_Servlet相关类之ServletRequest和Servletresponse对象
NULL 博文链接:https://sunfish.iteye.com/blog/1485374
客户请求访问servlet时-----servlet容器创建一个servletRequest 和servletResponse对象 servletRequest包含请求,-----servlet容器吧这两个对象传给所请求的servlet,-----servlet将相应的结果写入servletResponse...
首先,提出了一个与Servlet Filter有关的问题,并解释了随之而引入的装饰模式。然后,讨论了如何在Servlet环境下使用此模式,并列出了使用此模式的几个比较有名的基于Servlet的项目。最后,文章通过实现一个删除空白...
2. FilterChain接口中仅定义一个方法:public void doFilter(ServletRequest req,ServletResponse res),该方法的作用是。() (1分) A.用于将请求/响应继续沿过滤器链向后传给下一个过滤器。如果调用该方法的过滤...
一个非常棒的程序,用于修改request携带的参数信息。使用了filter等技术。
HttpServletRequest 详解 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
介绍了什么是servlet,怎么通过get和post方式访问servlet,手动创建servlet,内含源码
将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request...
案例一、完成用户登录功能 案例二、记录成功登录系统的人次。 实现步骤: 1)创建类实现Servlet接口 2)覆盖尚未实现的方法---service方法 3)在web.xml进行servlet的配置 但在实际开发中,我们不会直接去实现...
既然开发jsp、servlet的程序,就应该知道这是基于http(请求、响应)协议的,那么在这里请求和响应就对应为servlet-api.jar中的ServletRequest和ServletResponse接口,接口中定义了作为一个请求和一个响应信息应该具备...
Tomcat服务器创建一个ServletRequest对象,在ServletRequest对象中包含了客户请求信息及其他关于客户的信息,如请求头,请求正文,以及客户机的IP地址等
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象) 序号 方 法 说 明 ...
基本类和接口 一、javax.servlet.Servlet接口 servlet抽象集是javax.servlet.Servlet接口,它规定了...String getServletInfo() 返回描述servlet的一个字符串 void destory() 当servlet将要卸载时由servlet引擎调用
SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。...