一、中文乱码问题
//解决中文乱麻问题的方法1,页面端发出的数据作一次encodeURI,我做了下测试在页面端不对数据做encodeURI也可以解决乱码(ie可能出现问题)。服务器段使用new String(old.getBytes("iso8859-1"),"UTF-8");
//解决中文乱麻问题的方法2,页面端发出的数据作两次encodeURI,服务器段使用URLDecoder.decode(old,"UTF-8")
1.注册页面
register.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>用户注册</title> <script type="text/javascript" src="js/jquery-1.8.2.js"></script> <script type="text/javascript" src="js/verify_jquery_text_encoding.js"></script> </head> <body> 这是一个简单的注册页面<br/> <!--ajax方式下不需要使用表单来进行数据提交,因此不用写表单标签--> <!--ajax方式不需要name属性,需要一个id的属性--> <input type="text" id="userName" /> <input type="button" value="校验" onclick="verify()"/> <!--这个div用于存放服务器段返回的信息,开始为空--> <!--id属性定义是为了利用dom的方式找到某一个节点,进行操作--> <div id="result"></div> <!--<div id="result">123</div><div>456</div>--> <!--<span>123</span><span>456</span>--> <!--div和span的直观差异,div中的内容独占行,span中的内容和前后其他内容相处良好--> </body> </html>
2.verify_jquery_text_encoding.js
function verify(){ // window.alert("按钮被点击了!"); //1.通过jquery得到节点对象 var jo=$("#userName"); //alert(jo.val()); //通过val()方法得到节点对象的值,这时中文字符正常,但是传到服务器端的中文因为编码变成乱码 //解决中文乱麻问题的方法1,页面端发出的数据作一次encodeURI,也可以不写。服务器段使用new String(old.getBytes("iso8859-1"),"UTF-8"); //解决中文乱麻问题的方法2,页面端发出的数据作两次encodeURI,服务器段使用URLDecoder.decode(old,"UTF-8") //var url = "AJAXServer?name=" + encodeURI(encodeURI($("#userName").val())); var username=encodeURI(encodeURI(jo.val())); //window.alert(username); var url="Servlet_text_encoding?name="+username; //2.jquery对ajax的xmthttprequest的封装。jQuery.get(url, [data], [callback], [type]) ,通过远程 HTTP GET 请求载入信息。 $.get(url,null,callback); } //回调函数 function callback(data){ // window.alert("执行servlet成功,执行回调函数"); //3.接收服务器端的数据 //alert(data); //4.将服务器返回的数据动态的显示在页面上 var ro=$("#result"); //jquery的.html(value)方法,可以为节点赋值 ro.html(data); }
3.Servlet_text_encoding
package com.ru.ajax; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.net.URLDecoder; public class Servlet_text_encoding extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try{ // request.setCharacterEncoding("UTF-8"); // response.setContentType("text/html;charset=gb18030"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); //设置session Integer inte = (Integer) request.getSession().getAttribute("total"); int temp = 0; if (inte == null) { temp = 1; } else { temp = inte.intValue() + 1; } request.getSession().setAttribute("total",temp); //1.取参数 String old = request.getParameter("name"); //中文乱码问题 //第一种解决方法,只需要在这里改变字符串编码即可,不需要在js中对编码进行操作 //String name = new String(old.getBytes("iso8859-1"),"UTF-8"); //System.out.println(name); //第二种方法, String name = URLDecoder.decode(old, "UTF-8"); //2.检查参数是否有问题 if(name == null || name.length() == 0){ out.println("用户名不能为空"); } else{ // String name = URLDecoder.decode(old,"UTF-8"); // byte[] by = old.getBytes("ISO8859-1"); // String name = new String(by,"utf-8"); // String name = URLDecoder.decode(old,"utf-8"); //3.校验操作 // String name = old; if(name.equals("如")){ //4。和传统应用不同之处。这一步需要将用户感兴趣的数据返回给页面段,而不是将一个新的页面发送给用户 //写法没有变化,本质发生了改变 out.println("用户名[" + name + "]已经存在,请使用其他用户名, " + temp); } else{ out.println("用户名[" + name + "]尚未存在,可以使用该用户名注册, " + temp); } } } catch(Exception e){ e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
二.缓存问题解决-时间戳(在url后面加一个参数&t=nowdate)
function verify(){ // window.alert("按钮被点击了!"); //1.通过jquery得到节点对象 var jo=$("#userName"); //alert(jo.val()); //通过val()方法得到节点对象的值,这时中文字符正常,但是传到服务器端的中文因为编码变成乱码 //解决中文乱麻问题的方法1,页面端发出的数据作一次encodeURI,服务器段使用new String(old.getBytes("iso8859-1"),"UTF-8"); //解决中文乱麻问题的方法2,页面端发出的数据作两次encodeURI,服务器段使用URLDecoder.decode(old,"UTF-8") //var url = "AJAXServer?name=" + encodeURI(encodeURI($("#userName").val())); var username=encodeURI(encodeURI(jo.val())); //window.alert(username); var url="Servlet_text_encoding?name="+username; var url2=convertUrl(url); //2.jquery对ajax的xmthttprequest的封装。jQuery.get(url, [data], [callback], [type]) ,通过远程 HTTP GET 请求载入信息。 $.get(url2,null,callback); } //回调函数 function callback(data){ // window.alert("执行servlet成功,执行回调函数"); //3.接收服务器端的数据 //alert(data); //4.将服务器返回的数据动态的显示在页面上 var ro=$("#result"); //jquery的.html(value)方法,可以为节点赋值 ro.html(data); } //给url添加时间戳 。保证不同的url是ie不从缓存中取数据 function convertUrl(url){ //valueof()用于返回指定对象的原始值 var nowDate=(new Date()).valueOf(); //在每个url后面加一个t的参数值保证每个url都不同 if(url.indexOf("?")>=0){ url=url+ "&t="+nowDate; }else{ url=url+"?t="+nowDate; } //这里主意已定要有返回值 return url; }