开发者社区> codingcoge> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 前言: 传递的请求参数如何获取 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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Servlet 的运行原理
Servlet 的运行原理
272 0
Servlet第四篇【request对象常用方法、应用】(一)
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
50 0
Servlet(一)
关于Servlet的相关介绍
99 0
Java Web(二) Servlet中response、request乱码问题解决
三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身、博客坚持。
66 0
servlet
servlet相关类包括Servlet、ServletConfig、ServletContext、GenericServlet、HttpServlet等。 Servlet Servlet定义了所有servlet必须实现的功能,每一个Servlet都是运行在web服务中的一个小的java程序,用于接收并响应来自web客户端的请求。
699 0
Servlet第四篇【request对象常用方法、应用】
什么是HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
1113 0
Servlet
一、servlet的概述 servlet是采用java编写的运行在服务器上的程序,用于接受用户的请求,并针对请求产生响应。javax.servlet.Servlet是servlet的顶层接口,主要方法有init和destory,service三个方法。
1015 0
servlet乱码问题总结
在学习时servlet乱码问题还是挺严重的,总结一下有三种情况  1.新建HTML页面后浏览出现乱码 2.以post形式请求时出现乱码 3.以get形式请求时出现乱码 让我们一个一个来解决吧 1.
856 0
servlet输出流乱码
PrintWriter out = response.getWriter();  servlet输出流乱码解决思路:如果你打算返回一个文本型的(text/*)页面,不论是HTML还是纯文本,通常都需要调用response.getWriter()方法。
636 0
+关注
codingcoge
种一棵树最好的时间是十年前,其次是现在。 java自学后台ing,请多指教 Github: https://github.com/jjc123
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载