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