Servlet处理get请求中文乱码问题

来源:互联网 发布:af淘宝旗舰店 编辑:程序博客网 时间:2024/05/22 12:21
1. 响应编码
  * 当使用response.getWriter()来向客户端发送字符数据时,如果在之前没有设置编码,那么默认使用iso,因为iso不支持中文,一定乱码
  * 在使用response.getWriter()之前可以使用response.setCharaceterEncoding()来设置字符流的编码为gbk或utf-8,当然我们通常会选择utf-8。这样使用response.getWriter()发送的字符就是使用utf-8编码的。但还是会出现乱码!因为浏览器并不知道服务器发送过来的是什么编码的数据!这时浏览器会使用gbk来解码,所以乱码!
  * 在使用response.getWriter()之前可以使用response.setHeader("Content-type","text/html;charset=utf-8")来设置响应头,通知浏览器服务器这边使用的是utf-8编码,而且在调用setHeader()后,还会自动执行setCharacterEncding()方法。这样浏览器会使用utf-8解码,所以就不会乱码了!
  * setHeader("Content-Type", "text/html;charset=utf-8")的快捷方法是:setContentType("text/html;charset=utf-8)。
2. 请求编码
  * 客户端发送给服务器的请求参数是什么编码:
    客户端首先要打开一个页面,然后在页面中提交表单或点击超链接!在请求这个页面时,服务器响应的编码是什么,那么客户端发送请求时的编码就是什么。
  * 服务器端默认使用什么编码来解码参数:
    服务器端默认使用ISO-8859-1来解码!所以这一定会出现乱码的!因为iso不支持中文!
  * 请求编码处理分为两种:GET和POST:GET请求参数不在请求体中,而POST请求参数在请求体中,所以它们的处理方式是不同的!
  * GET请求编码处理:
    > String username = new String(request.getParameter("iso-8859-1"), "utf-8");
    > 在server.xml中配置URIEncoding=utf-8
  * POST请求编码处理:
    > String username = new String(request.getParameter("iso-8859-1"), "utf-8");

    > 在获取参数之前调用request.setCharacterEncoding("utf-8");


实例:

JSP页面

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@ taglib uri="/struts-tags" prefix="s" %>    <% String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><base href="<%=basePath %>"/><script src="js/jquery-2.1.1.js" type="text/javascript"></script></head><body><script type="text/javascript">// 创建异步对象function createXMLHttpRequest() {try {return new XMLHttpRequest();//大多数浏览器} catch (e) {try {return ActvieXObject("Msxml2.XMLHTTP");//IE6.0} catch (e) {try {return ActvieXObject("Microsoft.XMLHTTP");//IE5.5及更早版本} catch (e) {alert("哥们儿,您用的是什么浏览器啊?");throw e;}}}}window.onload = function() {//文档加载完毕后执行var btn = document.getElementById("btn");btn.onclick = function() {//给按钮的点击事件注册监听/*ajax四步操作,得到服务器的响应把响应结果显示到h1元素中*//*1. 得到异步对象 */var xmlHttp = createXMLHttpRequest();/*2. 打开与服务器的连接  * 指定请求方式  * 指定请求的URL  * 指定是否为异步请求*/xmlHttp.open("GET", "<c:url value='/JsonServlet'/>"+"?name=萧12qw", true);/*3. 发送请求*/xmlHttp.send(null);//GET请求没有请求体,但也要给出null,不然FireFox可能会不能发送!/*4. 给异步对象的onreadystatechange事件注册监听器*/xmlHttp.onreadystatechange = function() {//当xmlHttp的状态发生变化时执行// 双重判断:xmlHttp的状态为4(服务器响应结束),以及服务器响应的状态码为200(响应成功)if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {// 获取服务器的响应结束var text = xmlHttp.responseText;// 获取h1元素var h1 = document.getElementById("h1");h1.innerHTML = text;}};};};</script><button id="btn">点击这里</button><h1 id="h1"></h1></body></html>

后台servlet代码

package com.servlet;import java.io.IOException;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils;import com.bbs.entity.User;import com.bbs.service.impl.UserServiceImpl;public class JsonServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//处理响应编码问题response.setHeader("Content-Type", "text/html;charset=utf-8");JSONObject json = new JSONObject();//相当于action中注入service服务层ServletContext servletContext = this.getServletContext();WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);UserServiceImpl u = (UserServiceImpl) webApplicationContext.getBean("userServiceImpl");User user = u.getById(3);//处理请求编码问题String name = new String(request.getParameter("name").getBytes("iso-8859-1"), "utf-8");json.accumulate("user", user);json.accumulate("name", name);json.accumulate("city", "北京");System.out.println(json.toString());response.getWriter().print(json.toString());}}

点击后的输出结果为:(user为自定义的对象,此处未给出其代码)

{"name":"萧12qw","user":{"id":3,"sex":0,"email":"","age":0,"name":"xiao","state":"","password":"jiang","registerTime":{"nanos":0,"time":1427091681000,"minutes":21,"seconds":21,"hours":14,"month":2,"timezoneOffset":-480,"year":115,"day":1,"date":23}},"city":"北京"}

0 0
原创粉丝点击