前言:
传递的请求参数如何获取
GET方式: 参数放在URI后面
POST方式: 参数放在实体内容中
后台获取前台数据方法:
获取GET方式参数:
request.getQueryString();
获取POST方式参数:
request.getInputStream();
但是以上两种不通用,而且获取到的参数还需要进一步地解析。
用request.getParameter
代替。
核心的API:
request.getParameter("参数名"); 根据参数名获取参数值(注意,只能获取一个值的参数)
request.getParameterValue("参数名“);根据参数名获取参数值(可以获取多个值的参数)
request.getParameterNames(); 获取所有参数名称列表
request.setCharacterEncoding("utf-8");修改实体内容编码格式。
注意:
request.setCharacterEncoding可以设置Response容器的实体内部
编码格式,而对URL(GET)编码无效。先了解,下面会解释。
Html前台form表单输入框:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/haha/dd" method="Get">
用户名:<input type="text" name="name" /><br/>
密码:<input type="password" name="password" /><br/>
性别:
<input type="radio" name="性别" value="男"/>男
<input type="radio" name="性别" value="女"/>女<br/>
爱好:<br/>
<input type="checkbox" name="喜好" value="篮球"/>篮球<br/>
<input type="checkbox" name="喜好" value="足球"/>足球<br/>
<input type="checkbox" name="喜好" value="月球"/>月球<br/>
隐藏域:<input type="hidden" name="hiden" value="001" /><br/>
籍贯:
<select name="jiguan">
<option value="广东">广东</option>
<option value="广西">广西</option>
<option value="湖南">湖南</option>
</select>
<br/>
个人简介:
<textarea rows="5" cols="10" name="area"></textarea><br/>
<input type="submit" value="提交"/>
</form>
******************************************************************************
<form action="/haha/dd" method="Post">
用户名:<input type="text" name="name" /><br/>
密码:<input type="password" name="password" /><br/>
性别:
<input type="radio" name="性别" value="男"/>男
<input type="radio" name="性别" value="女"/>女<br/>
爱好:
<input type="checkbox" name="喜好" value="篮球"/>篮球<br/>
<input type="checkbox" name="喜好" value="足球"/>足球<br/>
<input type="checkbox" name="喜好" value="月球"/>月球<br/>
隐藏域:<input type="hidden" name="hiden" value="002" /><br/>
籍贯:
<select name="jiguan">
<option value="广东">广东</option>
<option value="广西">广西</option>
<option value="湖南">湖南</option>
</select>
<br/>
个人简介:
<textarea rows="5" cols="10" name="area"></textarea><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
servlet后台接受:
package a;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/dd")
public class dd extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getMethod());
Enumeration<String> enumeration=request.getParameterNames();
while(enumeration.hasMoreElements()) {
String name=enumeration.nextElement();
if("喜好".equals(name)) {
String[] str=request.getParameterValues(name);
System.out.println(name+": ");
for(String string:str) {
System.out.println(string);
}
}else {
System.out.println(name+": "+request.getParameter(name));
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
this.doGet(request,response);
}
}
乱码问题:
request中,在servlet中调用Request的getParameter方法返回的
是 字符串(“中国”),方法内部拿到数字后要转成字符,一定要查码表
由于request的设计者是外国人,所以默认查的是他们常用的ISO8859-1
这就是请求数据产生乱码的根源。
注意:
- Tomcat8以上版本默认编码格式是
UTF-8
- HttpServletRequest和HttpServletResponse容器默认编码格式是
iso-8859-1
Get和Post解码格式:
request容器保存的是浏览器的数据,一般是UTF-8格式。
request的方法如:getParameter解码格式会根据Get和Post来设置解码格式。因为Get和Post的取值放在不同地方。所以要分开考虑。
1. Get是URL解码方式。默认解码格式是Tomcat8编码格式。所以URL解码是UTF-8,
覆盖掉了request容器解码格式
2. Post是实体内容解码方式。默认解码格式是request编码格式。与Tomcat8编码格式无关
POST:
在测试中发现,tomcat服务器中Response容器默认以ISO8859-1
的编码解析数据,因此如果需要在参数中解析中文,需要设置
request.setCharacterEncoding("utf-8");
注意:要写在request.getParameter前面
- 设置参数查询的编码
- 该方法只能对Response容器的请求实体内容的数据编码起作用。POST提交的数据在实体内容中,所以该方法对POST方法有效!
- GET方法的参数放在URI后面,所以对GET方式无效!!!
Get:
虽然 Response容器默认以ISO8859-1
的编码解析数据
但是对于get请求提交的数据,在不同版本的tomcat中有不同的处理方式,在tomcat8及以上的版本,服务器默认以utf-8的编码方式处理请求参数
办法一:tomcat版本8以上不用指定编码格式,默认utf-8
而对于tomcat8以下的版本,服务器会默认以ISO8859-1的编码方式处理请求参数
方法二:编码二次转换 推荐
注意:
utf-8-》iso-8859-1》utf-8 原样
utf-8-》GBK-》utf-8 乱码
具体可以参考这篇:
https://blog.csdn.net/qq_38409944/article/details/80637345
现在基本都是Tomcat8以上版本 ,所以不存在编码问题,而如果是Tomcat8以下版本解决方案:
手动解码:String name =
new String(name.getBytes("iso-8859-1"),"utf-8");
方法三:设置指定解码URL的编码格式:URIEncoding="UTF-8" 不推荐 依赖服务器,有时候没法设置服务器
另外,在tomcat目录下的/conf中的server.xml中我们也可以手动配置tomcat默认的编码方式,在 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>这段代码中添加一个URIEncoding参数,可以配置tomcat的默认编码方式。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
但是不推荐。
方法四:请求参数的编码方式要采用请求体的编码方式 不推荐 依赖服务器,有时候没法设置服务器
useBodyEncodingForURI=true是说,。当useBodyEncodingForURI=true时,若请求体采用utf-8解析,则请求参数也要采用utf-8来解析。
server.html:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" />
Servlet:
doGet(){
request.setCharacterEncoding("utf-8");
}
分析:request.setCharacterEncoding("utf-8");
只是作用于实体内部,意思就是说对Post有效,对Get无效。
但是设置useBodyEncodingForURI="true"
后URL解码格式和实体内容解码格式一样。
注意:如果只是设置useBodyEncodingForURI="true
那get URL解码格式就是默认iso-8859-1
,因为实体内部默认是这个解码格式,即使Tomcat版本8以上默认编码格式为UTF-8也会被iso-8859-1
覆盖掉。
总结:
- 中文建议post而不是get
- Tomcat8版本以上默认是UTF-8对GET方法来说,对POST无效,
因为request.getParameter默认调用·iso-8859-1· - get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value¶me2=value2的形式附加在URI字段之后。
而Post是放在实体内部。 - 而request.setCharacterEncoding(charset);只对消息体中的数据起作用,对于URI字段中的参数不起作用。默认作用于POST,对POST无效。 当使用request.setCharacterEncoding(charset);时,只能解决表单方法为POST的中文乱码情况,而方法为GET的依然为乱码。
- request.setCharacterEncoding("UTF-8");
- useBodyEncodingForURI="true"目的是URL解码格式和实体内部解码格式相同。
- 如果使用JS编程时,在浏览器可以使用encodeURIComponent函数对中文参数进行编码后再拼装参数。
参考:
https://blog.csdn.net/sinat_26503455/article/details/53584139
https://www.cnblogs.com/keyi/p/6365649.html
https://blog.csdn.net/hackersaillen/article/details/46965357