jquery 跨域 后台采用struts

来源:互联网 发布:注册淘宝店步骤图 编辑:程序博客网 时间:2024/05/29 10:36

jquery跨域获得json已经困扰3天,一开始一直得不到解决,尝试了多种解决方案最后还是失败了。
一:
前端js如下
$.ajax({
        url: "http://127.0.0.1:8080/newTest/restjson_selectListRest.action&format=json&jsonpcallback=?",    
        type: "get",
        dataType: "jsonp",
        jsonp: "callback",
        success: function(data) {
             $.each(json, function(i){  
               $("#imgContent").append("<li><a href='#'><img src=\'"+json[i].logoimg+"<h2>"+json[i].name+"</h2><p>"+json[i].introduce+"</a></li>");  
        });
        }
    });
后台struts采用这样的配置
<action name="restjson_*" class="cg.putuo.action.common.restjsonAction" method="{1}">
            
</action>
后台action写法如下
public void  selectListRest(){
        RestaurantService restaurantService = new RestaurantServiceImpl();
        String result = null;
                String callback =  ServletActionContext.getRequest().getAttribute("jsoncallback");  
        
        System.out.println("callback"+callback);
        System.out.println("输出json格式字符");
    
        result =callback+ "({\"success\": \"dsd\"})";
        System.out.println(result);

    
        try {
            PrintWriter out = ServletActionContext.getResponse().getWriter();
            out.append(result);
            out.flush();
            out.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
}
这样一直获取的数据是null({"success" :"dsd"}),总是获取不到数据,一开始以为jquery写法错了,试了很多jquery写法都不行。

二:后来根据网上有经验的人说这样写
后台采用struts的配置如下,导入struts2-json-plugin-2.3.4.jar包
<package name="common1"  extends="json-default">

        <action name="restjson_*" class="cg.putuo.action.common.restjsonAction" method="{1}">
            <result name="resultok" type="json">
                <param name="callbackParameter">jsoncallback</param>
            </result>
        </action>
</package>
action和上面一样,还是不行。输出null({"success" :"dsd"})。
一直纠结问题出在哪里。

三:通过jquery去掉jsp,用jsp去返回数据,成功了
function returnJSON() {
            var inData = {
                'jsondata' :"This is parmeter"
            };
            jQuery.getJSON('http://127.0.0.1:8080/newTest/b1.jsp?jsoncallback=?',
                    inData, callback);
    }
//回调函数,取得从另一个系中返回的JSON数据。
function callback(data) {    
    alert(data.success);    
}
b1.jsp如下
<%@ page language="java" import="java.util.*,net.sf.json.JSONObject" pageEncoding="UTF-8"%>
<%
        System.out.println("11111");
         //获得前台传入的参数
        String jsoncallback = request.getParameter("jsoncallback");
        String s2 = request.getParameter("jsondata");
        System.out.println(s2);
        
        //将前台传入的JSON字符串转为JSON对象
        //JSONObject jso = JSONObject.fromObject(s2);
        
        System.out.println("22222");
        /*
         *用前台传入的参数调用相应方法取值
         *例如取得值为一个字符串
         */
        String re = "返回的字符串";
        
        /*返回一个二维数组,
         *实际上这里应该去数据库查询返回
        */
        List listAll = new ArrayList();
        for(int i = 0; i <5; i++){
            List listRow = new ArrayList();
            for(int j =0; j<5; j++){
                listRow.add(i+j+"test");
            }
            listAll.add(listRow);
        }
        
        System.out.println("333");
        //将从后台获得的值转换成JSON对象
        Map map = new HashMap();
        map.put("re", re);
        map.put("listAll",listAll);
        JSONObject jso1 = JSONObject.fromObject(map);
        System.out.print(jsoncallback+"("+jso1+")");
        
        System.out.println("444");
        //把转换成JSON对象的值传到前台
        response.getWriter().write(jsoncallback+"("+jso1+")");
        System.out.println("5555");    
%>
这样jquery可以成功获得数据,但是这样的方式不是我需要的,要在jsp里面操作业务,非常不方便。

东折腾西折腾,最后终于找到问题的所在。在一的action里面
把 String callback =  ServletActionContext.getRequest().getAttribute("jsoncallback"); 修改为
HttpServletRequest request = ServletActionContext.getRequest();  
String callback = request.getParameter("jsoncallback");  
输出成功!!!!激动万分,一直都没看到是这样写.getAttribute("jsoncallback");什么时候改掉都没看

0 0
原创粉丝点击