Ajax调用Action采用json格式传递数据

目的:

实现数据库读取数据显示到前端,并进行局部刷新

解决方案:
采用ajax实现局部刷新。在使用ajax过程中,发现传统的xml方式得到的结果解析很麻烦,因此采用json格式传递。
采用ajax将数据传递到后台action中处理,action通过service层处理完后,再将结果返回到前端,然后前端对接收的json数据进行解析。

解决方法:

1、在前端jsp中使用ajax

selectName = "tomato";
$("#sort3 li").eq(d).click(function(){//点击列表第d行,
    $.ajax({ //调用jQuery的ajax方法,执行异步 AJAX 请求 url:"feature.action?select_name="+selectName,//调用action,并传递参数select_name,该值也可以放到data里面 type:'post', data:"{}", dataType:'json',//数据格式采用json contentType: 'application/json; charset=utf-8',//设置编码格式 error:function(){ alert('error ! select_name'+ selectName); }, success:function(data){ var d = eval("("+data+")"); //将数据转换成json类型,可以把data用alert()输出出来看看到底是什么样的结构 //得到的d是一个形如{"key":"value","key1":"value1"}的数据类型,然后取值出来 descriptionMain(p,d.featureGen,d.featureJing,d.featureYe); } }); });

    2、通过前端url将数据传递到后台触发action,进行数据处理。
    java代码如下:
    注意要有set/get方法。处理的结果存储到Map中,再转换成json数据,然后存储到result中,传递给前端页面。传递方式通过struts.xml配置文件方式

          public String execute() throws Exception
          {               
              HttpServletRequest request = ServletActionContext.getRequest();
              HttpServletResponse response = ServletActionContext.getResponse();
    
             request.setCharacterEncoding("UTF-8");
             response.setContentType("text/html;charset=UTF-8");
    
              String selName = request.getParameter("select_name");     
              System.out.println("选择的农作物:"  + selName);  
              featureGen = featureService.getDescription("根",selName);  
              featureJing = featureService.getDescription("茎",selName);
              featureYe = featureService.getDescription("叶",selName);
    
              //将数据存储在map里,再转换成json类型数据
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("featureGen", featureGen);
            map.put("featureJing",featureJing);
            map.put("featureYe", featureYe);
    
            JSONObject json = JSONObject.fromObject(map);//将map对象转换成json类型数据
            result = json.toString();//给result赋值,传递给页面
    
            return "feature_list"; 
          } 

    3、struts.xml配置文件
    struts.xml文件配置注意几点:
    1、在package 的extends将struts-default改为json-default

       <package name="default" namespace="/" extends="json-default">

    2、在result中加入类型type为“json”

    name="feature" class="edu.jit.ssh.actions.FeatureAction" >
       <result name="feature_list" type="json">
            name="root">result
       result>      
        

    其中,
    (1)action name=”feature”表示action层的命名,可自定义;
    (2)result name=”feature_list”与java代码中return的值必须一致。struts.xml通过java中return的值在配置中匹配查找结果;
    (3)result中设置type为“json”;
    (3)结果中的result传递到jsp中的,也就是 success:function(data) 中的data值。接着进行数据解析。data值是一个json的对象,需要进行解析。
    (4)请注意struts2配置中指定了result的name=”root”,所谓root的含义,是指返回的json数据的根为root中指定的bean类,例如此处为result,如果没有指定root属性,则默认使用Action作为返回的json数据的根
    区别如下:
    result中使用了root参数后返回的json数据:

    {"result":[
      {"featureJing":["长条形病斑""白色棉絮状霉"],"featureYe":["水浸状浅褐色病斑","花萼暗褐色且干枯"],"featureGen":["根腐烂"]}
      ]}
      result中没设置root参数返回Action中的json数据:
      {"data":[
      {"result":[ {"featureJing":["长条形病斑""白色棉絮状霉"],"featureYe":["水浸状浅褐色病斑","花萼暗褐色且干枯"],"featureGen":["根腐烂"]}] 
      },
      {"message":"testMesssageData"}
      ]}

    4、采用json格式所需配置文件

    commons-lang-2.4.jar
    json-lib-2.4-jdk15.jar
    struts2-json-plugin-2.3.8.jar
    ezmorph-1.0.jar
    commons-beanutils-1.9.3.jar
    commons-collections-3.2.1-1.0.0.jar

    注:我在查资料时发现:struts2.1.8以后,加入了json的plugin插件包,使用时仅需把插件包(struts2-json-plugin-2.2.1.1.jar)放入到项目中的WEB-INF/lib下面就可以。
    我并未做过验证,感兴趣的可以试一下。

    参考:
    【1】JSON中result的root属性 http://www.myext.cn/webkf/a_5946.html
    【2】Struts2+Jquery实现ajax并返回json类型数据 https://my.oschina.net/simpleton/blog/139212

    你可能感兴趣的:(struts,ajax)