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

来源:互联网 发布:信捷plc编程是232通讯 编辑:程序博客网 时间:2024/04/27 21:39

目的:

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

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

解决方法:

1、在前端jsp中使用ajax

selectName = "tomato";$("#sort3 li").eq(d).click(function(){//点击列表第d行,<ul id="sort3"></ul>            $.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”

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

其中,
(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

0 0