开发项目用Ajax的Post方法提交信息到请求的servlet,输出遇到中文乱码,纠结了好几天,总结了网络上很多高手的心得,用了两步解决了乱码:
- 在JS端,对提交的字符串进行两次编码:
<%@page contentType="text/html" pageEncoding="gbk"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> <title>JSP Page</title> <script type="text/javascript"> var req; function validate() { //获取表单提交的内容 var idField = document.getElementById("userName").value; //要发送的字符串数据 var content = "id=hello&message=" + idField + "&say=我是帅哥"; //重点:对content含中文字符的字符串进行两次编码 content = encodeURI(content); content = encodeURI(content); var url = "validate.do"; //创建一个XMLHttpRequest对象req if(window.XMLHttpRequest) { //IE7, Firefox, Opera支持 req = new XMLHttpRequest(); }else if(window.ActiveXObject) { //IE5,IE6支持 req = new ActiveXObject("Microsoft.XMLHTTP"); } req.open("post", url, true); req.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); req.onreadystatechange = callback; //send函数发送请求,参数 req.send(content); } function callback() { //alert(req.readyState); //alert(req.status); if(req.readyState == 4 && req.status == 200) { //alert(req.status); //alert(req.responseText); var check = req.responseText; show (check); } } function show(str) { document.getElementById("info").innerHTML = str; } </script> </head> <body> <h1>Test Ajax</h1><p> <form action="" method="get" name="form"> <br> 输入用户名: <input type="text" size="10" maxlength="8" id="userName" name="name" onblur="validate()"> <span id="info"></span> <br> 输入商品名: <input type="submit" name="refer" > </form> </body> </html>
- 在servlet端,对接收的数据的进行一次解码:
package com.model; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.net.URLDecoder; /** * * @author Gavin */ public class DoAjaxServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=gbk"); request.setCharacterEncoding("gbk"); PrintWriter out = response.getWriter(); try { response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); //这里有个小问题:如果写成String put = null;将会输出一个null后面再加上增加的字符 String put = ""; for(Enumeration<String> e = request.getParameterNames(); e.hasMoreElements(); ) { String h = (String) e.nextElement(); String c = (String)request.getParameter(h); put += c; } //重点在这里,对接受到的信息进行解码 String putDecoded = java.net.URLDecoder.decode(put,"utf-8"); System.out.println(pute); out.write("message is:" + putDecoded); } finally { out.close(); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } @Override public String getServletInfo() { return "Short description"; }// </editor-fold> }