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

Servlet Request的 getInputStream() getReader() getParameter()

 
阅读更多

如果你知道了这三者的区别,请忽略

最近碰到了servlet对入参获取方式的处理问题,因为二方库处理不当,导致了获取不到入参的情况,之前也知道这三个方法不兼容,现简单介绍下

 

 

1、这三个获取入参的方法,是互斥的,也就是使用了其中一个,再使用另外的两,是获取不到数据的

Content-Type multipart/form-data除外,此时getParameter只能获取在url串当中的入参,但getInputStreamgetReader还可以有其中一个获取请求的流数据)

2getInputStream() getReader()只能使用一次,getParameter单线程上可重复使用

 

为什么要这么设计呢?

 

And for good reason. It would require the servlet infrastructure to keep a copy of the input in case the servlet decided to replay reopen. That would be an unwarranted overhead.

减少不必要的资源浪费呗。

 

因此tomcat servlet的输入流父类ServletInputStream以及其实现类CoyoteInputStream等,继承了InputStream,但没重写reset markSupported mark这三方法,因此数据的解析是一次性的,

同样,CoyoteReader,也没有重写父类Reader的这三方法,因此也是一次性读取的,两者最终读取的都是InputBuffer里面封装的字节数据

 

而其他的输入流,比如ByteArrayInputStream,三方法重写了,组合使用后数据是可重复读取的,里面可以设置mark标签,前面读取过,后面可以继续读取数据,具体可以写代码测试

 

对于getParameter,也只是其帮我们处理好了数据而已,底层是getInputStream读取了数据,然后解析出来而已,可查看org.apache.catalina.connector.Request  org.apache.tomcat.util.http.Parameters的实现,tomcat7.0.47采用了LinkedHashMap存储了解析出来后的入参(老版本基于hashtable),当第一次getParameter时,会解析所有的入参放如这个mapprocessParameters方法),后面的get直接从map里面获取,他里面只有用parametersParsed didQueryParameters这两标记判断是否已经解析过,所以如果要多线程getParameter,结果你懂得,但同一个线程上NgetParameter肯定没问题,因为后面都只是mapget操作,至于getParameterNames,getParameterValues,getParameterMap这些方法,只是从map里面捞数据而已

 

如果要避免冲突,有两个方案

1、坚决只使用其中一种办法去获取入参,就如坚决维护一党专政一样

 

2、重写request里面的这三个方法,把数据保持住,后面可以随便使,要修改兼容的方法很多,风险比较大,当然这也违背了最初的设计初衷

分享到:
评论

相关推荐

    servlet2.4doc

    A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both. Filters perform filtering in the ...

    day14_servlet&http&request_java_httprequestservlet_milejfl_

    - **读取请求体**:`getInputStream()`或`getReader()`用于读取POST请求中包含的数据。 4. **HttpServletResponse接口**: - **设置响应状态码**:`setStatus(int code)`用于设置HTTP响应的状态码,如200(成功)...

    4 JSP内建对象之request

    - 对于`POST`请求,可以使用`getInputStream()`或`getReader()`来读取请求体的数据,常用于上传文件或处理JSON、XML等格式的数据。 9. **国际化与本地化** - `getLocale()`:返回请求的首选语言区域。 - `...

    JSP的Request对象练习源代码

    6. **读取请求体内容**:对于POST请求,如果数据在请求体中,可以使用`getInputStream()`或`getReader()`来读取。 7. **分发请求**:`RequestDispatcher`接口的`forward()`和`include()`方法允许我们在服务器端将...

    Servlet学习笔记2

    可以通过`getInputStream()`或`getReader()`方法读取请求体数据。 #### 五、扩展Servlet - **实现Servlet接口**:要创建自己的Servlet,需要实现`javax.servlet.Servlet`接口,至少重写`service()`方法。 - 示例...

    JAVA100例之实例84Request

    2. **获取请求参数**:在`HttpServletRequest`对象中,我们可以调用`getParameter()`方法来获取请求URL上的查询参数,例如`request.getParameter("paramName")`。如果参数有多个值,可以使用`getParameterValues()`...

    获取request的参数

    如果参数包含在POST请求体中,比如在一个表单提交或JSON数据中,你需要使用`getInputStream()`或`getReader()`来读取请求体。对于JSON数据,通常会用到Jackson或Gson库进行解析: ```java import ...

    JSP九大内置对象详解

    | 6 | `ServletInputStream getInputStream()` | 获取请求体中的二进制输入流 | | 7 | `String getParameter(String name)` | 返回指定名称的参数值 | | 8 | `Enumeration getParameterNames()` | 返回所有可用参数...

    servlet示例

    - 对于POST、PUT和DELETE请求,可以通过`getReader()`获取`BufferedReader`对象读取文本数据,或者通过`getInputStream()`获取`ServletInputStream`对象处理二进制数据。 - 无论哪种请求方式,都可以通过`...

    JAVA servlet API说明文档

    1. forward(ServletRequest request, ServletResponse response):用于将请求从一个Servlet或JSP页面转发到另一个资源。 2. include(ServletRequest request, ServletResponse response):允许一个Servlet将请求的...

    java 获取request中的请求参数代码详解

    在 Java 中,我们可以使用 `getInputStream()` 方法或 `getReader()` 方法来获取 Request Body 中的数据。 ```java public String getRequestData(HttpServletRequest httpServletRequest) { ...

    JSP request(return String)用法详例

    在实际开发中,`request`对象还提供其他功能,如获取请求参数(`request.getParameter()`),读取请求体数据(`request.getInputStream()`或`request.getReader()`),检查请求是否是安全的(`request.isSecure()`)...

    第20章 Request和Response.pdf

    - POST请求时,可以通过`getInputStream()`或`getReader()`获取请求正文中携带的数据。 4. **通用方法**: - `getParameter(String name)`:获取请求参数的值。 - `getParameterValues(String name)`:获取请求...

    javaWEB总结(6):ServletRequest

    4. **获取请求数据**:`getInputStream()`返回一个`ServletInputStream`对象,用于读取请求体中的二进制数据;`getReader()`返回一个`BufferedReader`,用于读取请求体中的文本数据。 5. **获取客户端信息**:`...

    Java Web笔记.docx

    - 读取请求体(POST数据):`getInputStream()` 或 `getReader()` 四、案例:用户登录 1. 用户登录案例需求 用户提交用户名和密码,服务器验证信息,成功则允许登录,失败则显示错误信息。 2. 开发步骤 - 创建...

    jsp9大内置对象

    - `ServletInputStream getInputStream()`:获取输入流。 - `String getParameter(String name)`:根据参数名获取对应的单个参数值。 - `Enumeration getParameterNames()`:获取所有的参数名。 - `String[] ...

    JSP内置对象:Request和Response的简单介绍及使用

    6. **getInputStream()**:返回一个ServletInputStream,用于读取请求体中的原始二进制数据。 7. **getParameter(String name)**:返回名为`name`的请求参数的值,适用于GET和POST请求。 8. **getParameterNames()...

    HttpServletRequest和HttpServletResponse的讲解

    5. **读取请求体**:对于POST请求,如果数据在请求体中,可以使用`getInputStream()`或`getReader()`来读取。 `HttpServletResponse`接口则是服务器向客户端发送响应的工具。它允许我们设置响应状态码、HTTP头部和...

Global site tag (gtag.js) - Google Analytics