Java Web编码问题

以utf-8编码为例:
下面是一个jsp页面form.jsp

<%@page contentType = "text/html; charset = utf-8" language = "java" pageEncoding = "utf-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head>
	<title>收集参数的表单</title>
	<meta charset="UTF-8">
</head>
<body>
	<form id = "form1" method = "post" action = "aa" >
		用户名:<br/>
		<input type = "text" name = "name"> <hr/>&nbsp;&nbsp;别:<br/>
		男:<input type = "radio" name = "gender" value = "男">
		女:<input type = "radio" name = "gender" value = "女"><hr/>
		喜欢的颜色:<br/>
		红:<input type = "checkbox" name = "color" value = "红">
		绿:<input type = "checkbox" name = "color" value = "绿">
		蓝:<input type = "checkbox" name = "color" value = "蓝"><hr/>
		来自的国家:<br/>
		<select name = "country">
			<option value ="中国">中国</option>
			<option value ="美国">美国</option>
			<option value ="俄罗斯">俄罗斯</option>
		</select><hr/>
		<input type ="submit" value = "提交">
		<input type = "reset" value = "重置">
	</form>
</body>
</html>

    page指令中contentType = "text/html; charset = utf-8"用于指定数据类型和服编码方式。charset = utf-8 表示服务器返回该页面到浏览器采用的编码方式,同时也指以post方式提交表单参数的编码方式。
    **pageEncoding = “utf-8”**表示该jsp文件自身采用的编码格式,也就是告诉服务器使用什么编码翻译jsp文件成java文件。
    在head中的 **meta charset=“UTF-8”**表示page指令中contentType未指定编码时采用的默认编码格式

    当表单以post方式提交到FirstServlet.java

package lee;

import java.net.URLDecoder;  
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;  

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="firstServlet", urlPatterns={"/firstServlet"})//注解方式配置
public class FirstServlet extends HttpServlet
{
	public void service(HttpServletRequest request, 
		HttpServletResponse response) throws IOException{
		//设置编码方式
		request.setCharacterEncoding("utf-8");//在执行request.getParameter("");之前设置查询码表,按照utf-8进行解码
		response.setContentType("text/html; charset=utf-8");//告诉浏览器用utf-8解析
		//获取name的请求参数值
		String name = request.getParameter("name");
		//获取gender的请求参数值
		String gender = request.getParameter("gender");
		//获取color的请求参数值
		String[] color = request.getParameterValues("color");
		//获取country的请求参数值
		String national = request.getParameter("country");

		//获取页面输出流

		/**PrintStream是用来操作字节流,所以utf-8国际编码输出会出现乱码*/
		//PrintStream out = new PrintStream(response.getOutputStream());

		/**PrintWriter是用来操作字符流,如果处理中文则用PrintWriter*/
		PrintWriter out = response.getWriter();


		//输出HTML页面标签
		out.println("<html>");
		out.println("<head>");
		out.println("<title>ServletTest测试</title>");
		out.println("</head>");
		out.println("<body>");
		//输出请求参数值 name
		out.println("您的名字:" + name + "<hr/>");
		//输出请求参数值 gender
		out.println("您的性别是:" + gender + "<hr/>");
		//输出请求参数值:color
		out.println("您喜欢的颜色:");
		for(String c:color){
			out.println(c + " ");
		}
		out.println("<hr/>");
		//输出请求参数的值:national
		out.println("您来自的国家:" + national + "<hr/>");
		out.println("</body>");
		out.println("</html>");
	}
}

    由于之前使用的utf-8进行提交表单的,在解析参数request.getParameter("");之前设置查询码表,按照utf-8进行解码request.setCharacterEncoding(“utf-8”);
    在响应时告诉浏览器用utf-8解析response.setContentType(“text/html; charset=utf-8”);
    另外输出PrintStream是用来操作字节流,所以输出utf-8国际编码会出现乱码;PrintWriter是用来操作字符流,如果处理中文则用PrintWriter。

    最后附上web.xml配置

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  >

	<servlet>
		<servlet-name>firstServlet</servlet-name>
		<servlet-class>lee.FirstServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>firstServlet</servlet-name>
		<url-pattern>/aa</url-pattern>
	</servlet-mapping>

</web-app>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值