java服务器端开发-servlet:203、表单提交中文参数_get/post解决编码问题

目录

一、前言

二、表单post提交中文参数,乱码问题

1、实例代码

(1)java代码:HelloServlet.java

(2)配置 web.xml 文件

(3)post 提交方式的表单

2、post提交方式,效果演示

***解决方式

三、表单get提交中文参数,乱码问题

(1)配置 web.xml 文件【无需修改】

(2)get 提交方式的表单

(3)java代码:HelloServlet.java【基本一样】

(4)效果演示说明

需要注意的是

解决方式1

解决方式2(不推荐)

四、如何知道tomcat默认的编码


一、前言

上一篇文章我们讲了 servlet 的一些知识点,详见博文:原创 java服务器端开发-servlet:2、Servlet执行过程介绍:常见错误及解决方式、响应数据包、get请求与post请求、编码相关等,既然讲了一些知识点,这篇我们就来演示一个案例:表单提交中文参数_get/post解决编码问题

二、表单post提交中文参数,乱码问题

1、实例代码

这里怎么建立 web 工程项目、包名等就不多说了,你可以参考我的这篇博文

java服务器开发-servlet:1_2、如何开发一个servlet,实战写一个servlet

(1)java代码:HelloServlet.java

package t01_表单提交中文参数_解决编码问题;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 表单提交中文参数_解决编码问题
 * @UpdateTime:2011年02月28日 下午17:30:00
 * @ProjectName: web02
 * @ClassName:HelloServlet
 * @CategoryName:java类
 * @author:luminal、邮箱 luminal_yyh@163.com
 * @since 1.0
 * @Description:(可以在这里描述这个类的作用)
 * 步骤:
 * 1、地址见:web.xml
 */
public class HelloServlet extends HttpServlet{
		protected void service(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {
			
			//设置post提交方式编码
			//让服务器按照指定的编码格式进行解码。
			//必须要放在getParameter方法之前执行。
			//只对post提交方式有效,一般表单使用post提交方式
			//request.setCharacterEncoding("utf-8");
			
			//step1:读请求参数
			//使用request对象,依据请求参数名,获取请求参数值
			//似key-value。参数名即key,参数值即value
			String name = request.getParameter("name");	
			System.out.println("name:" + name);
			
			//设置get提交方式编码
			//这种方式对get和post提交方式,都有效
			//如:(1)表单get提交方式、
			//(2)get提交方式,直接url地址请求参数中含中文
			//注意:tomact8.x 默认编码为UTF-8,get提交方式使用此行代码反而会乱码
			//name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
			
			
			//step2:处理请求,用于输出
			String msg = "<h1>hello,我是:"+name+"</h1>";
			
			
			//step3:输出处理结果
			//通过response,设置一个消息头(content-type),告诉
			//浏览器,服务器返回的数据类型和编码格式
			//此外,也设置了out.println()在输出时,使用的编码格式.
			//注释这句:浏览器将不能识别中文,
			//即上面的字符串msg的中文符号和汉字,将不能被识别
			response.setContentType("text/html;charset=utf-8");//设置【服务器编码和浏览器网页编码】
			
			//保存在PrintWriter对象里面
			PrintWriter out = response.getWriter();
			
			//将处理结果数据缓存到response对象上
			//-->处理结果,打包发送给浏览器
			//-->浏览器拆包,生成页面【详见Servlet执行过程介绍】
			out.println(msg);
			//关闭流
			out.close();
			
		}
}


(2)配置 web.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1">
	
	<display-name>web02</display-name>
	<servlet>
		<servlet-name>web02</servlet-name>
		<servlet-class>t01_表单提交中文参数_解决编码问题.HelloServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>web02</servlet-name>
		<url-pattern>/hello</url-pattern>
	</servlet-mapping>

</web-app>

(3)post 提交方式的表单

greeting_post.html

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body style="font-size:30px; font-style:italic;">
	<form action="hello" method="post">
		<fieldset>
			<legend>个人信息post</legend>
			姓名:<input name="name" /><br /> 年龄:<input name="age" /><br /> 城市:
			北京<input type="checkbox" name="city" value="bj" checked="checked" />
			上海<input type="checkbox" name="city" value="sh" /> 武汉<input
				type="checkbox" name="city" value="wh" /><br /> <input
				type="submit" value="提交" />

		</fieldset>
	</form>

</body>
</html>


2、post提交方式,效果演示

启动 tomact 容器、部署 web 项目。这两步不会的你可以参考我的这篇博文

java服务器开发-servlet:1_2、如何开发一个servlet,实战写一个servlet

如果部署不对,可能会报错 404:

如果部署成功,在谷歌浏览器输入地址:http://localhost:8080/web02/greeting_post.html

点击提交,如下图,出现了乱码    

***解决方式

我们把 HelloServlet.java 这句代码的注释打开

//设置post提交方式编码
//让服务器按照指定的编码格式进行解码。
//必须要放在getParameter方法之前执行。
//只对post提交方式有效,一般表单使用post提交方式
//request.setCharacterEncoding("utf-8");

重新部署 web 项目、输入地址、填写信息,效果如下:

三、表单get提交中文参数,乱码问题

(1)配置 web.xml 文件【无需修改】

(2)get 提交方式的表单

这个只是复制一份上面的 greeting_post.html ,命名为 greeting_get.html,

把提交方式由 post 改为 get,如:method="get"

然后把"个人信息post" 改为"个人信息get", 方便区别

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body style="font-size:30px; font-style:italic;">
	<form action="hello" method="get">
		<fieldset>
			<legend>个人信息get</legend>
			姓名:<input name="name" /><br /> 年龄:<input name="age" /><br /> 城市:
			北京<input type="checkbox" name="city" value="bj" checked="checked" />
			上海<input type="checkbox" name="city" value="sh" /> 武汉<input
				type="checkbox" name="city" value="wh" /><br /> <input
				type="submit" value="提交" />

		</fieldset>
	</form>

</body>
</html>


(3)java代码:HelloServlet.java【基本一样】

(4)效果演示说明

我们注释掉这两句代码

//只对post提交方式有效,一般表单使用post提交方式
//request.setCharacterEncoding("utf-8");

//这种方式对get和post提交方式,都有效
//注意:tomact 8.x以后默认为UTF-8,就不需要使用此行代码了
//name = new String(name.getBytes("ISO-8859-1"), "UTF-8");

我们重新部署,使用表单get提交方式,在浏览器输入地址:http://localhost:8080/web02/greeting_get.html

填入信息,点击提交,你会发现 get 提交方式并不会出现乱码。

或是在浏览器上直接输入,带中文参数的 get请求方式 链接:http://localhost:8080/web02/hello?name=yyh_帅气华

它也不会出现乱码的情况,如下:

需要注意的是

那是因为:Tomcat8.x默认编码格式是utf-8,Tomcat8之前默认编码格式的都是iso8859-1

我目前使用的是tomact8.5,而我那时候实习的时候最新的是 tomcat6

所以这个要看 tomact 的版本,如果默认情况下,tomcat8之前使用的的编码方式:iso8859-1

出现乱码的时候,那么它的解决方式如下:

解决方式1

把上面 java 代码这句打开

//name = new String(name.getBytes("ISO-8859-1"), "UTF-8");

如果是Tomcat8.x,它的默认编码格式是utf-8,使用上面这句代码,get提交方式反而会出现乱码,如下:

解决方式2(不推荐)

修改tomcat下的conf/server.xml文件

找到如下代码:    

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

这段代码规定了Tomcat监听HTTP请求的端口号等信息。可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat默认ISO-8859-1编码)以UTF-8的编码处理get请求。

修改完成后:

​
<Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

​

四、如何知道tomcat默认的编码

1、找到我的 tomact 8.5的安装路径:/ApacheTomcat/webapps/docs/config/http.html 

用文本编辑器 Sublime Text 打开 http.html ,搜索 URIEncoding,然后有说明:
This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used. 
翻译过来说是:默认使用了UTF-8编码

2、找到我的 tomact 7.0.100 的安装路径:/ApacheTomcat-7.0.100/webapps/docs/config/http.html 
用文本编辑器 Sublime Text 打开 http.html ,搜索 URIEncoding,然后有说明:
This specifies the character encoding used to decode the URI bytes,  after %xx decoding the URL. If not specified, ISO-8859-1 will be used. 
翻译过来说是:默认使用了ISO-8859-1编码

其实在上篇博文:原创 java服务器端开发-servlet:2、Servlet执行过程介绍:常见错误及解决方式、响应数据包、get请求与post请求、编码相关等 的第6点  6、编码相关的问题  也有对编码的相关说明,可以回顾复习一下

另外推荐的博文:

Tomcat8.x的版本中GET请求接收中文参数问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值