本文的目的是介绍servletrequest参数只能取一次解决方法的详细情况,特别关注servlet获取请求的所有参数的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解
本文的目的是介绍servlet request参数只能取一次解决方法的详细情况,特别关注servlet获取请求的所有参数的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解servlet request参数只能取一次解决方法的机会,同时也不会遗漏关于HttpServletRequest request 相关方法 得到路径、HttpServletRequest 和 ServletRequest 有什么区别呢?、HttpServletRequest 接收参数的几种方法、HttpServletRequest参数小写的知识。
本文目录一览:- servlet request参数只能取一次解决方法(servlet获取请求的所有参数)
- HttpServletRequest request 相关方法 得到路径
- HttpServletRequest 和 ServletRequest 有什么区别呢?
- HttpServletRequest 接收参数的几种方法
- HttpServletRequest参数小写
servlet request参数只能取一次解决方法(servlet获取请求的所有参数)
解决方法,建一个包装类


package com.g4m.admin.conf;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.io.IOUtils;
/**
* Wrap the generic httpServletRequest
*/
public class HttpRequestWrapper extends HttpServletRequestWrapper {
private String body;
private ServletInputStream inputStream;
private BufferedReader reader;
private String requestURI;
private StringBuilder requestURL;
private String servletPath;
private Map<String, ?> params;
public HttpRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
if (!isMultipart()) {
preLoadBody(request);
}
}
private void preLoadBody(HttpServletRequest request) throws IOException {
Charset charset = Charset.forName(getCharacterEncoding());
byte[] bodyBytes = IOUtils.toByteArray(request.getInputStream());
body = new String(bodyBytes, charset);
inputStream = new RequestCachingInputStream(body.getBytes(getCharacterEncoding()));
}
public final boolean isMultipart() {
String contentType = getContentType();
return contentType != null && contentType.toLowerCase().startsWith("multipart/");
}
@Override
public final String getContentType() {
String _contentType = getParameter("_contentType");
if (_contentType != null) {
return _contentType;
}
return super.getContentType();
}
public String getBody() {
if (isMultipart()) {
throw new IllegalStateException("multipart request does not support preloaded body");
}
return body;
}
@Override
public String getMethod() {
String _method = getParameter("_method");
if (_method != null) {
return _method;
}
return super.getMethod();
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (inputStream != null) {
return inputStream;
}
return super.getInputStream();
}
@Override
public BufferedReader getReader() throws IOException {
if (reader == null) {
reader = new BufferedReader(new InputStreamReader(inputStream, getCharacterEncoding()));
}
return reader;
}
@Override
public final String getCharacterEncoding() {
String defaultEncoding = super.getCharacterEncoding();
return defaultEncoding != null ? defaultEncoding : "UTF-8";
}
public void setParams(Map<String, ?> params) {
this.params = params;
}
/**
* used to cache the request inputstream
*
* @author sylorl
* @date Mar 10, 2015
*/
private static class RequestCachingInputStream extends ServletInputStream {
private final ByteArrayInputStream inputStream;
public RequestCachingInputStream(byte[] bytes) {
inputStream = new ByteArrayInputStream(bytes);
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
}
@Override
public String getRequestURI() {
if (this.requestURI == null) {
return super.getRequestURI();
}
return super.getRequestURI();
}
@Override
public StringBuffer getRequestURL() {
if (this.requestURL == null) {
return super.getRequestURL();
}
return new StringBuffer(this.requestURL.toString());
}
@Override
public String getServletPath() {
if (servletPath == null) {
return super.getServletPath();
}
return this.servletPath;
}
public void setRequestURI(String requestURI, HttpServletRequest request) {
this.servletPath = requestURI;
this.requestURI = request.getContextPath() + requestURI;
this.requestURL = new StringBuilder().append(request.getProtocol())
.append("://")
.append(request.getLocalAddr())
.append("/")
.append(servletPath);
}
@Override
public String[] getParameterValues(String name) {
if (params != null) {
Object v = params.get(name);
if (v == null) {
return null;
} else if (v instanceof String[]) {
return (String[]) v;
} else if (v instanceof String) {
return new String[]{(String) v};
} else {
return new String[]{v.toString()};
}
}
return super.getParameterValues(name);
}
@Override
public String getParameter(String name) {
if (params != null) {
Object v = params.get(name);
if (v == null) {
return null;
} else if (v instanceof String[]) {
String[] strArr = (String[]) v;
if (strArr.length > 0) {
return strArr[0];
} else {
return null;
}
} else if (v instanceof String) {
return (String) v;
} else {
return v.toString();
}
}
return super.getParameter(name);
}
@Override
public Map<String, String[]> getParameterMap() {
if (params != null) {
Map<String, String[]> map = new HashMap<String, String[]>();
for (Object key : params.keySet()) {
Object v = params.get((String) key);
String[] strArr = null;
if (v == null) {
return null;
} else if (v instanceof String[]) {
strArr = (String[]) v;
} else if (v instanceof String) {
strArr = new String[1];
strArr[0] = (String) v;
} else {
strArr = new String[1];
strArr[0] = v.toString();
}
map.put((String) key, strArr);
}
return map;
}
return super.getParameterMap();
}
}
在过滤器中将request转成包装类


import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @author haosenwei[haosenwei@dubmic.com]
* @date 2019-05-16 22:17
* <p>Copyright 2008-2019 snsndk.com</p>
*/
@Component
public class LogCostFilter implements Filter {
@Override
public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
long start = System.currentTimeMillis();
filterChain.doFilter(new HttpRequestWrapper((HttpServletRequest) servletRequest),servletResponse);
System.out.println("Execute cost="+(System.currentTimeMillis()-start));
}
@Override
public void destroy() {
}
}
在代码中就可以多次获取了
ServletInputStream inputStream = req.getInputStream();
String s = convertStreamToString(inputStream);
System.out.println(s);
Map<String, String[]> parameterMap = req.getParameterMap();
parameterMap.forEach((s1, strings) -> {
System.out.println(s1 + "=" + Arrays.toString(strings));
});
HttpServletRequest request 相关方法 得到路径
//--------------------------POST---------------
username=qqqq
password=wwww
http://192.168.1.211:8080/demo/index.jsp
------------------------------------------------>
request.getContextPath() =/demo
request.getMethod() =POST
request.getRequestURI() =/demo/reg
request.getRequestURL() =http://192.168.1.211:8080/demo/reg
request.getServletPath() =/reg
//-----------------------GET------------------->
http://192.168.1.211:8080/demo/index.jsp?username=1&password=1&email=1
request.getContextPath() =/demo
request.getMethod() =GET
request.getQueryString() =username=1&password=1&email=1
request.getRequestURI() =/demo/index.jsp
request.getRequestURL() =http://192.168.1.211:8080/demo/index.jsp
request.getServletPath() =/index.jsp
HttpServletRequest 和 ServletRequest 有什么区别呢?
最近在整理学过的东西,因为以前用的基本都是框架,对于底层的servlet的一些机制其实还不太了解。所以想问一下"HttpServletRequest 和 ServletRequest 有什么区别呢?", HttpServletRequest 继承自ServletRequest ,只是添加了与http相关的方法,这些都知道,现在主要想知道这两个东西什么地方什么时候用.HttpServletRequest 接收参数的几种方法
我们经常用 servlet 和 jsp, 经常用 request.getParameter () 来得到数据。
request.getParameter()
request.getInputStream()
request.getReader()
这三个方法都是从 request 对象中得到提交的数据,但是用途不同。
要根据 <form> 表单提交数据的编码方式选择不同的方法。
HTML 中的 form 表单的一个关键属性 enctype:
1. enctype=application/x- www-form-urlencoded
这种编码方式是默认的编码方式。
编码后的结果通常是 field1=value2&field2=value2&… 的形式,如 name=aaaa&password=bbbb。
通常使用的表单也是采用这种方式编码的,Servlet 的 API 提供了对这种 编码方式解码的支持,只需要调用 ServletRequest 类中的 getParameter () 方法就可以得到用户表单中的字段和数据。
不足:
这种编码方式( application/x-www-form-urlencoded )虽然简单,但对于传输大块的二进制数据显得力不从心。
2. 对于传输大块的二进制数这类数据,浏览器采用了另一种编码方式,即 "multipart/form-data" 的编码方式:
浏览器可以很容易将表单内的数据和文件放在一起发送。这种编码方式先定义好一个不可能在数据中出现的字符串作为 分界符,然后用它将各个数据段分开,而对于每个数据段都对应着 HTML 页面表单中的一个 Input 区,包括一个 content-disposition 属性,说明了这个数据段的一些信息,如果这个数据段的内容是一个文件,还会有 Content-Type 属性,然后就是数据本身,如果以这种方式提交数据就要用 request.getInputStream () 或 request.getReader () 得到 提交的数据,用 request.getParameter () 是得不到提交的数据的。
3. 需要注意的是:
request.getParameter ()、 request.getInputStream ()、request.getReader () 这三种方法是有冲突的,因为流只能被读一次。
比如:
当 form 表单内容采用 enctype=application/x-www-form-urlencoded 编码时,先通过调用 request.getParameter () 方法得到参数后,再调用 request.getInputStream () 或 request.getReader () 已经得不到流中的内容,因为在调用 request.getParameter () 时系统可能对表单中提交的数据以流的形式读了一次,反之亦然。
当 form 表单内容采用 enctype=multipart/form-data 编码时,即使先调用 request.getParameter () 也得不到数据,所以这时调用 request.getParameter () 方法对 request.getInputStream () 或 request.getReader () 没有冲突,即使已经调用了 request.getParameter () 方法也可以通过调用 request.getInputStream () 或 request.getReader () 得 到表单中的数据,而 request.getInputStream () 和 request.getReader () 在同一个响应中是不能混合使用的,如果混合使用就会抛异常。
如:
- BufferedReader reader = request.getReader();
- while ((line = reader.readLine()) != null)
- jb.append(line);
- String jbstring=jb.toString();
- String uname=request.getParameter("uname");
- System.out.println("uname:"+uname);
HttpServletRequest参数小写
在spring MVC中遵循RequestParam值不区分大小写之后,我向HttpServletRequest
方法中添加了参数。但是我添加了将近20个IF条件,以拥有完整的不区分大小写的URL。
我知道,这完全是痛苦而丑陋的编码方式。我要求任何人对此提供令人惊奇的解决方案。
我需要一个不区分大小写的请求参数。正在发送的请求参数是orgID。该参数将以不同的方式出现。比如说Orgid
,oRgid
,orGid
,orgID
......等上
我不能直接这样做request.getParamter ("orgID")
。为此,我添加了许多if条件。:-(正如我所说,完全难看的编码。
今天关于servlet request参数只能取一次解决方法和servlet获取请求的所有参数的分享就到这里,希望大家有所收获,若想了解更多关于HttpServletRequest request 相关方法 得到路径、HttpServletRequest 和 ServletRequest 有什么区别呢?、HttpServletRequest 接收参数的几种方法、HttpServletRequest参数小写等相关知识,可以在本站进行查询。
本文标签: