AJAX - $.post(url,data,function,type)-3(参数形式value-type-json)

前端之家收集整理的这篇文章主要介绍了AJAX - $.post(url,data,function,type)-3(参数形式value-type-json)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

上一篇http://www.jb51.cc/article/p-eplduxhq-bpe.html讲解到如果传到后台的参数为:

queryString = $('#editform').serializeArray();//JSON Object
queryString = JSON.stringify(queryString);//JSON string

 $.post(url,{mydata:queryString},function(data){ });
 即,参数形式为 {mydata:json}

如果形式为

queryString = $('#editform').serializeArray();//JSON Object
queryString = JSON.stringify(queryString);//JSON string

 $.post(url,queryString,function(data){ });

    即,参数形式为 : json

此时后台如何接收?

就像第一篇所讲解的那样,使用request.getReader。。。从而获取String!

后台接收方法

package com.atgui.ajax.app.servlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.codehaus.jackson.map.ObjectMapper;


public class PostServlet4 extends HttpServlet {

    /** * queryString = $('#editform').serializeArray(); queryString = JSON.stringify(queryString);//string */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
        System.out.println("postServlet destroy() ......");
    }

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

        doPost(request,response);
    }

    public void doPost(HttpServletRequest request,IOException {

        response.setContentType("application/json");
        PrintWriter out = response.getWriter();

        //queryString = $('#editform').serializeArray();//object
        //queryString = JSON.stringify(queryString);//string
        String jsonString =getStringFromReq(request) ;
        System.out.println("jsonString..."+jsonString);

        ObjectMapper objectMapper = new ObjectMapper();
        String resultJson = objectMapper.writeValueAsString(jsonString);
        System.out.println("resultJson ..."+resultJson);

        out.print(resultJson);
        out.flush();
        out.close();
    }

    public void init() throws ServletException {

        // Put your code here
        System.out.println("postServlet init().......");
    }

    public String getStringFromReq(HttpServletRequest request) {

        StringBuilder sb = new StringBuilder();  
        try {
            BufferedReader reader = request.getReader();
            char[]buff = new char[1024];  
            int len;  
            while((len = reader.read(buff)) != -1) {
                sb.append(buff,0,len);  
            }  
        }catch (IOException e) {  
                 e.printStackTrace();  
        }  
        String resultString = sb.toString();

        return resultString;

    }

}

result as follows :

//初始化servlet
postServlet init().......

//读取到的string
jsonString...[{"name":"username","value":"yanshi02"},{"name":"password","value":"123456"}]

//返回json
resultJson ..."[{\"name\":\"username\",\"value\":\"yanshi02\"},{\"name\":\"password\",\"value\":\"123456\"}]"

【特别提醒】

① 若直接返回 jsonString,那么JSP页面可以正常解析并遍历JSON数组;

【就像系列-2所描述的那样,此时的jsonString type 为string;所以JSP使用data的时候一定要判断一下 typeof data,如果为object,那么可以试着直接作为json object使用。如果为string,必须进行转换解析!】

  • 转换为JSON数组对象
  • 进行解析遍历

② 若使用objectMapper再次转换,则JSP页面不可以正常解析为JSON对象,不可正常遍历JSON数组对象,而是以字符串数组对象遍历!

  • 拿到返回数据
  • 进行转换
  • 遍历!【以字符数组的形式遍历了】

题外话:

为什么不使用request.getParameterMap?

因为这里传输的为JSON数组字符串,没有username=yanshi02&password=123456 的形式!不能拆解为 key :value !!!

如下所示为使用 request.getParameterMap

key :[{"name":"username","value":"123456"}]
value:

如果不进行第二步转换,直接传参
queryString = $('#editform').serializeArray();//JSON数组对象
那么,返回来的是字符串拼接的形式:

jsonString...username=admin&password=123456
resultJson ..."username=admin&password=123456"

//...

out.println(resultJson);
//这里返回的是经过objectMapper转换后的resultJson 
//如果返回jsonString,JSP可以拿到data,但是解析出错!
  • 拿到返回数据
  • 尝试解析为JSON对象 【失败,仍旧为string】
  • 遍历!【以字符数组遍历】

【JSP】页面

<body>
    This is my JSP page. <br>
    <form id=@H_403_327@"editform" action=@H_403_327@"postServlet4" method=@H_403_327@"post">
        <input type=@H_403_327@"text" name=@H_403_327@"username" value=@H_403_327@""/>
        <input type=@H_403_327@"password" name=@H_403_327@"password" value=@H_403_327@""/>

    </form>
    <input name=@H_403_327@"post" type=@H_403_327@"button" value=@H_403_327@"提交"/>
    <div id=@H_403_327@"content"></div>
  </body>
  • JSON解析:
$.post(url,function(data){

                    alert(typeof data+",返回的内容为 "+data);
                    //var jsonReturn = this.data;
                    //var jsonReturn = eval("("+data+")");
                    //var jsonReturn = $.parseJSON(data);
                    var jsonReturn = JSON.parse(data);//将JSON字符串转换为对象
                    alert(typeof jsonReturn+" 转换后内容 "+jsonReturn);

                   // 第一种json数组遍历方式
                    for(var i=0;i<jsonReturn.length;i++){
                        for(var key in jsonReturn[i]){
                         alert(key+':'+jsonReturn[i][key]);
                         $("#content").append(jsonReturn[i][key]);
                         }
                     }
                }

总结 :

经过几篇各种形式的传参–后台解析–返回json,总结分析如下:

① 如果你后台的jsonString 现在为string 非object。那么不要再使用objectMapper进行转换!!!

② 如果你获得最终json是用objectMapper从其他数据,比如map,转换得到,那么这个json很可能为object,jsp页面可以直接使用data.key !

原文链接:https://www.f2er.com/ajax/161435.html

猜你在找的Ajax相关文章