JSP页面表单数据通过Ajax,以json格式发送到后台处理,最后返回json对象,显示在页面上。

原意就打算了解一下json格式数据的传递,没打算做的多复杂,但乱码问题搞得我头都大了。

直接贴代码解释

JS文件

$("#register").click(function(){
        var userFormTemp = $("form").serialize();
        var userFormDecode = decodeURIComponent(userFormTemp,true);
        var userForm = encodeURI(encodeURI(userFormDecode));
        $.ajax({
            type : "post",
            url : "UserServlet",
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            data : {user : userForm},
            dataType : "json",
            success : function(data){
                $("#uname").text(data.userName);
                $("#addr").text(data.address);
                $("#pho").text(data.phone);
                $("#hob").text(data.hobby);
            },
            error : function(textStatus,e){
                alert(e.status);
            }
        });
    });

相关行解释:

1.var userFormTemp = $("form").serialize();

学习Ajax时看到这个方法觉得有意思就拿来试验一下,serialize() 方法通过序列化表单值,创建 URL 编码文本字符串。输出的格式为:name=value&name1=value1&name2=value2...

类似于路径后面的参数列表。get方式提交也可以直接加到路径后面传送。

ajax使用与寻常无异,就是数据类型改为json:dataType : "json"。

 

Form2Json文件

因为要使用json格式传递数据,后台先将序列化表单后的字符串转换成json格式的字符串然后再装换成json对象。

public class Form2Json {
    public JSONObject string2Json(String stringForForm) throws Exception{
        String form2Json[] = stringForForm.split("&");
        String jsonForStringTemp = "";
        for (int i=0;i<form2Json.length;i++){
            int index = form2Json[i].indexOf("=");
            jsonForStringTemp += "\""+form2Json[i].substring(0, index)+"\""
                +":"+"\""+URLDecoder.decode(form2Json[i].substring(index+1,form2Json[i].length()),"UTF-8")+"\""+",";
        }
        String jsonForString = "{" + jsonForStringTemp +"}";
        JSONObject jo = JSONObject.fromObject(jsonForString);
        return jo;
    }
}

主要就是做些字符串的截取。

 

Servlet文件

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
       
        PrintWriter out = response.getWriter();
        String s = request.getParameter("user");
        s = URLDecoder.decode(s,"UTF-8");
        Form2Json f2j = new Form2Json();
        JSONObject jo = null;
        try{
            jo = f2j.string2Json(s);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        out.print(jo);
        out.flush();
        out.close();
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request,response);
    }

jsp文件

<html>
  <head>
   
    <title>Json</title>
   
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <script src="js/jquery-1.9.1.js"></script>
    <script src="js/testJquery.js"></script>
   
  </head>
 
  <body>
    <form id="">
        <table border="1" width="400" style="border-collapse:collapse">
        <colgroup>
            <col width="150">
            <col width="250">
        </colgroup>
            <tr>
                <td>用户名:</td>
                <td>
                    <input type="text" name="userName" id="userName">
                    <div id="userDiv" style="color:red">*</div>
                </td>
            </tr>
            <tr>
                <td>性别:</td>
                <td>
                    男<input type="radio" name="sex" id="male" value="male">
                    女<input type="radio" name="sex" id="female" value="female">
                </td>
            </tr>
            <tr>
                <td>密码:</td>
                <td>
                    <input type="password" name="pwd" id="pwd">
                    <div id="pwdDiv" style="color:red">*</div>
                </td>
            </tr>
            <tr>
                <td>确认密码:</td>
                <td>
                    <input type="password" name="pwdA" id="pwdA">
                    <div id="pwdADiv" style="color:red"></div>
                </td>
            </tr>
            <tr>
                <td>地址:</td>
                <td>
                    <input type="text" name="address" id="address">
                    <div id="userDiv" style="color:red"></div>
                </td>
            </tr>
            <tr>
                <td>电话:</td>
                <td>
                    <input type="text" name="phone" id="phone">
                    <div id="phoneDiv" style="color:red"></div>   
                </td>
            </tr>
            <tr>
                <td>爱好:</td>
                <td>
                    音乐<input type="checkbox" name="hobby" id="music" value="音乐">
                    游戏<input type="checkbox" name="hobby" id="game" value="游戏">
                    读书<input type="checkbox" name="hobby" id="read" value="读书">
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="button" id="register" value="注册">
                    <input type="reset" value="清空">
                </td>
            </tr>
        </table>
        <div id="uname"></div>
        <div id="addr"></div>
        <div id="pho"></div>
        <div id="hob"></div>
    </form>
  </body>
</html>

serialize()中文乱码问题解决方法:

1.serialize主动调用了encodeURIComponent()方法进行了编码;;

2.所以得先调用decodeURIComponent()方法进行解码;

3.然后还得两次调用 encodeURI()方法进行编码;

4.后台调用URLDecoder.decode()方法解码;

5.本来应该大概经过上面四步就可以解决中文乱码问题,但不知道为什么,后台获取到的字符串中文还是乱码,(⊙﹏⊙b汗),于是我就将截取到的字符串再做一次解码,然后...就没然后了。

 

本来还打算试一下serializeArray() 方法,但看到API里面介绍说serializeArray()返回的是 JSON 对象而非 JSON 字符串。需要使用插件或者第三方库进行字符串化操作。所以我就缓缓再看。

 

追加

其实serializeArray()用法也差不多,因为它得到的是一个JSON对象,所以先得将他解析成字符串,现在较新的浏览器都提供了原生的JSON支持,JSON.stringify(),能将JSON对象解析成JSON格式的字符串。

格式为:

[
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]

/*

后台转换成JSON对象时必须拼接字符串类似格式为:

{“user”:

[
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]

}*/

好吧,我错了。上面注释的一段没用。

因为serializeArray()返回的Array<Object> 格式,后台字符串转换成JSON对象要用JSONArray.fromObject();

 

附:

JS中

JSON字符串转换为JSON对象

1.eval("(" + value+ ")");

2.value.parseJSON();

3.JSON.parse(value);

JSON对象转化为JSON字符串。

1.obj.toJSONString();

2.JSON.stringify(obj);

 

JAVA中

。。。。。。