日期:2014-05-16 浏览次数:20495 次
使用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进行重新包装?
它默认的是返回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; }?