关于JSONP的理解

JSONP的实质是通过跨域请求,返回给页面一个结果,这个请求没有js端类似success的回调函数,其功能类似于:

<script type="text/javascript" src="XXX"></script>

即引入一个字符串,并执行这个字符串,不过好像引入js这种文件的话,不会执行。当然可以通过eval来执行

两种实现:

Ext.create('Ext.data.Store', {
         proxy: {
          type: 'jsonp',
          extraParams:{"params" : Ext.encode(params)},
          url : selectURL
         },
         autoLoad: true
        });
        /*
        jQuery.ajax({
          url : updateURL,
          data : {"params" : Ext.encode(params)},
          type : "get",
          cache : false,
          dataType : "jsonp",
          async: false
        });
        */

 

后台返回的字串:

comboxPBStoreData_JSONP=[{"no":"1234567","name":"AAA"},{"no":"1234568","name":"BBB"}]

这样,js中就相当于多了个全局变量comboxPBStoreData_JSONP,可以直接用来使用,当然返回字符串也可以是“MessageBox('AAA');”这种,这样等这个返回字串被处理时,就会弹出一个对话框,这种方法可以从另一个角度部分解决JSONP没有回调的弊端,至少页面可以有响应,知道处理结果

 

 

正确的用法:

前台

jQuery.ajax({
          url : updateURL,
          data : {"params" : Ext.encode(params)},
          type : "get",
          cache : false,
          dataType : "jsonp",
          async: false,
          success : function(jsonstr){
           var result = Ext.decode(jsonstr);        
          }
});

 

后台:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
    //获取参数
    String callback = request.getParameter("callback");

   JSONObject obj = new JSONObject(); 
    obj.put("addVersion", adds);
    response.getWriter().write(callback+"('"+obj.toJSONString()+"')");

 注意:1、默认使用callback,jquery自动添加的

2、response返回时,必须拼装成fun('a')这种形式,'a'作为字符串,即success的jsonstr的值。

3、如果不使用callback,无法在前台收到回调处理,进不了success

posted @ 2013-03-26 19:36  无尘24  阅读(1410)  评论(0编辑  收藏  举报