jsonp
使用HttpProxy不能进行跨域的访问``
会返回 Access to restricted URI denied" code: "1012 的错误```
用Ext.data.ScriptTagProxy替换HttpProxy可以实现跨域``
在Opera下正常``在Firefox下出现Invaild label错误``
原因在`
使用ScriptTagProxy时要从request参数中获得callback属性,把得到的参数跟json-data一起返回,因为返回的data是要在浏览器中执行的所以仅仅返回json-data是不够的,需要构造成
callBackName(json-data);
这种形式返回。
JAVA 代码如下:
String cb = request.getParameter("callback");//获得callback属性
response.getWriter()write(cb + “(”+ json-data + ");");//将json-data进行重新包装??如果使用struts2+jsonplugin的方式```
它默认的是返回json的数据部分````
就不能直接用JSONPLUGIN的拦截器````只能对ACTION进行改进``
首先要在ACTION里添加一个对从ScriptTagProxy传来的callback参数的接收方法``
程序代码
private String callback;
public String getCallback() {
return callback;
}
public void setCallback(String callback) {
this.callback = callback;
}?
这里的参数名可以更改``
在scriptTagProxy中设置callback参数:callbackParam,如:
程序代码
proxy : new Ext.data.ScriptTagProxy({
url :'http://192.168.1.54:8080/LEOSystem/json.txt'// 'http://extjs.com/forum/topics-remote.php',
callbackParam: abc
})?
?
action中的方法就是改为
然后就是要手工用response实现数据的回传.
在execte()方法中:
程序代码
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
response
.getWriter()
.write(
getCallback()
+ "("+JSONUtil.serialize(this)+");");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return null;?
JSONUtil类来自jsonplugin包```import com.googlecode.jsonplugin.JSONUtil;
它的serialize(Object)方法实现了从类到json数据字串的转化.
最后返回return null;`不再让struts2接手```
程序代码
private String abc;
public String getAbc() {
return abc;
}
public void setAbc(String abc) {
this.abc= abc;
}?
本篇文章来源于突袭网[www.tuxi.com.cn] 原文链接:http://www.tuxi.com.cn/6-171-1710083.html