Servlet中request请求Get和Post方法以及乱码解决

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 前言: 传递的请求参数如何获取 GET方式: 参数放在URI后面 POST方式: 参数放在实体内容中 后台获取前台数据方法: 核心的API: request.getParameter("参数名"); 根据参数名获取参数值(注意,只能获取一个值的参数) request.

前言:

传递的请求参数如何获取

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  
这就是请求数据产生乱码的根源。

注意:

  1. Tomcat8以上版本默认编码格式是UTF-8
  2. 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覆盖掉。

总结:

  1. 中文建议post而不是get
  2. Tomcat8版本以上默认是UTF-8对GET方法来说,对POST无效,
    因为request.getParameter默认调用·iso-8859-1·
  3. get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value&parame2=value2的形式附加在URI字段之后。
    而Post是放在实体内部。
  4. 而request.setCharacterEncoding(charset);只对消息体中的数据起作用,对于URI字段中的参数不起作用。默认作用于POST,对POST无效。 当使用request.setCharacterEncoding(charset);时,只能解决表单方法为POST的中文乱码情况,而方法为GET的依然为乱码。
  5. request.setCharacterEncoding("UTF-8");
  6. useBodyEncodingForURI="true"目的是URL解码格式和实体内部解码格式相同。
  7. 如果使用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

目录
相关文章
|
5月前
|
XML 数据格式
XML配置Servlet文件,不使用注解配置路径的方法
XML配置Servlet文件,不使用注解配置路径的方法
序-Servlet和SpringMVC的联系和区别-配置路径先想好使用的使用的方法,然后匹配的需要的技术
序-Servlet和SpringMVC的联系和区别-配置路径先想好使用的使用的方法,然后匹配的需要的技术
|
6月前
|
存储 Java 应用服务中间件
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(2)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
67 2
|
6月前
|
Web App开发 XML Java
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(1)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
114 2
|
6月前
|
应用服务中间件 Linux
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nes
org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nes
157 0
|
6月前
Request通用方式获取请求参数及Servlet模板创建
Request通用方式获取请求参数及Servlet模板创建
53 0
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
37 3
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
34 1
|
3月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
57 0
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
29 0