Easyui Tree跨域获取数据。

js语言为了安全,是不允许跨域访问数据的。有时候因为项目需要,我们需要从不同的域中获取数据,当然是有解决方法的。JSONP,是JSON with padding(填充式JSON或参数式JSON)的缩写,JSONP看起来和JSON差不多,只不过是被包含在函数调用中,类似这样

callback({"name":"mike"});

JSONP由两部分组成:回调函数和数据。
回调函数是当响应到来是应该在页面中调用的函数,函数一般在请求中指定。
数据就是传入回调函数中的JSON数据。下面就是一个JSONP请求:

http://127.0.0.1/json/?callback=handleResponse

这里指定的回调函数就是handleResponse();
Jquery提供了$.getJSON(),来进行跨域访问数据。
下面看具体的代码
前台代码

$.getJSON("http://localhost:8082/treeData?callback=?",function(treeData){
            console.log("进入getJSON");
            console.log(treeData);
            $("#tt").tree({
                 data:treeData,
                 onSelect:function(node){
                     $(this).tree('expand',node.target);
                 }
            }); 
        });

后台,在不同的域中

@RequestMapping(value="treeData",produces=MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
    @ResponseBody
    public String getData(String callback){

         List resultData = resultData(0);
         //封装的一个方法,将List转换为String
         String jsonString = JsonUtils.objectToJson(resultData);
         //获取树的数据
         //拼接成JSONP格式返回
         return callback+"("+jsonString+");";
    }

    /**
     * 生成树
     * @param parentId
     * @return
     */
    public List resultData(long parentId){
        //根据根节点id获取子节点数据
        List topList = tbItemCatMapper.getItemList(parentId);
        List resultTree=new ArrayList();
        //遍历子节点
        for (TbItemCat tbItemCat : topList) {
            Tree tree=new Tree();
            tree.setId(tbItemCat.getId());
            tree.setText(tbItemCat.getName());
            //判断是否有子集
            if (tbItemCat.getIsParent()) {
                tree.setState("closed");
                //递归获取数据
                tree.setChildren(resultData(tbItemCat.getId()));
                resultTree.add(tree);
            }else {
                resultTree.add(tree);
            }
        }
        return resultTree;
    }

这样就可以完成跨域获取数据的方法了。
前台还可以使用$.ajax()的方式来获取数据。

$.ajax({
            type:'POST',
            url:'http://localhost:8082/treeData?abc=fun1',
            dataType:'jsonp',
            jsonpCallback:'fun1',
            success:function(data){
                console.log(data);
            },
            error:function(data){
                console.log("error");
                console.log(data);
            }
        });
//定义回调函数,获取后到达客户端会立刻执行
function fun1(resultData){
    //返回来之后立即执行
    datas=data;
    console.log("进入fun1");
    console.log(data);
    $("#tt").tree({
         data:resultData
    }); 
}

一样是可以成功返回数据的。
欢迎交流讨论QQ:425548678

你可能感兴趣的:(java基础)