如果你知道了这三者的区别,请忽略
最近碰到了servlet对入参获取方式的处理问题,因为二方库处理不当,导致了获取不到入参的情况,之前也知道这三个方法不兼容,现简单介绍下
1、这三个获取入参的方法,是互斥的,也就是使用了其中一个,再使用另外的两,是获取不到数据的
(Content-Type为 multipart/form-data除外,此时getParameter只能获取在url串当中的入参,但getInputStream与getReader还可以有其中一个获取请求的流数据)
2、getInputStream() 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时,会解析所有的入参放如这个map(processParameters方法),后面的get直接从map里面获取,他里面只有用parametersParsed didQueryParameters这两标记判断是否已经解析过,所以如果要多线程getParameter,结果你懂得,但同一个线程上N次getParameter肯定没问题,因为后面都只是map的get操作,至于getParameterNames,getParameterValues,getParameterMap这些方法,只是从map里面捞数据而已
如果要避免冲突,有两个方案
1、坚决只使用其中一种办法去获取入参,就如坚决维护一党专政一样
2、重写request里面的这三个方法,把数据保持住,后面可以随便使,要修改兼容的方法很多,风险比较大,当然这也违背了最初的设计初衷
相关推荐
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 ...
- **读取请求体**:`getInputStream()`或`getReader()`用于读取POST请求中包含的数据。 4. **HttpServletResponse接口**: - **设置响应状态码**:`setStatus(int code)`用于设置HTTP响应的状态码,如200(成功)...
- 对于`POST`请求,可以使用`getInputStream()`或`getReader()`来读取请求体的数据,常用于上传文件或处理JSON、XML等格式的数据。 9. **国际化与本地化** - `getLocale()`:返回请求的首选语言区域。 - `...
6. **读取请求体内容**:对于POST请求,如果数据在请求体中,可以使用`getInputStream()`或`getReader()`来读取。 7. **分发请求**:`RequestDispatcher`接口的`forward()`和`include()`方法允许我们在服务器端将...
可以通过`getInputStream()`或`getReader()`方法读取请求体数据。 #### 五、扩展Servlet - **实现Servlet接口**:要创建自己的Servlet,需要实现`javax.servlet.Servlet`接口,至少重写`service()`方法。 - 示例...
2. **获取请求参数**:在`HttpServletRequest`对象中,我们可以调用`getParameter()`方法来获取请求URL上的查询参数,例如`request.getParameter("paramName")`。如果参数有多个值,可以使用`getParameterValues()`...
如果参数包含在POST请求体中,比如在一个表单提交或JSON数据中,你需要使用`getInputStream()`或`getReader()`来读取请求体。对于JSON数据,通常会用到Jackson或Gson库进行解析: ```java import ...
| 6 | `ServletInputStream getInputStream()` | 获取请求体中的二进制输入流 | | 7 | `String getParameter(String name)` | 返回指定名称的参数值 | | 8 | `Enumeration getParameterNames()` | 返回所有可用参数...
- 对于POST、PUT和DELETE请求,可以通过`getReader()`获取`BufferedReader`对象读取文本数据,或者通过`getInputStream()`获取`ServletInputStream`对象处理二进制数据。 - 无论哪种请求方式,都可以通过`...
1. forward(ServletRequest request, ServletResponse response):用于将请求从一个Servlet或JSP页面转发到另一个资源。 2. include(ServletRequest request, ServletResponse response):允许一个Servlet将请求的...
在 Java 中,我们可以使用 `getInputStream()` 方法或 `getReader()` 方法来获取 Request Body 中的数据。 ```java public String getRequestData(HttpServletRequest httpServletRequest) { ...
在实际开发中,`request`对象还提供其他功能,如获取请求参数(`request.getParameter()`),读取请求体数据(`request.getInputStream()`或`request.getReader()`),检查请求是否是安全的(`request.isSecure()`)...
- POST请求时,可以通过`getInputStream()`或`getReader()`获取请求正文中携带的数据。 4. **通用方法**: - `getParameter(String name)`:获取请求参数的值。 - `getParameterValues(String name)`:获取请求...
4. **获取请求数据**:`getInputStream()`返回一个`ServletInputStream`对象,用于读取请求体中的二进制数据;`getReader()`返回一个`BufferedReader`,用于读取请求体中的文本数据。 5. **获取客户端信息**:`...
- 读取请求体(POST数据):`getInputStream()` 或 `getReader()` 四、案例:用户登录 1. 用户登录案例需求 用户提交用户名和密码,服务器验证信息,成功则允许登录,失败则显示错误信息。 2. 开发步骤 - 创建...
- `ServletInputStream getInputStream()`:获取输入流。 - `String getParameter(String name)`:根据参数名获取对应的单个参数值。 - `Enumeration getParameterNames()`:获取所有的参数名。 - `String[] ...
6. **getInputStream()**:返回一个ServletInputStream,用于读取请求体中的原始二进制数据。 7. **getParameter(String name)**:返回名为`name`的请求参数的值,适用于GET和POST请求。 8. **getParameterNames()...
5. **读取请求体**:对于POST请求,如果数据在请求体中,可以使用`getInputStream()`或`getReader()`来读取。 `HttpServletResponse`接口则是服务器向客户端发送响应的工具。它允许我们设置响应状态码、HTTP头部和...