struts2,ajax,json传json给Action中的类对象,并返回需要的数据
一.准备
1.json所需jar包:(有时候内容没问题,仔细检查jar包,是不是少了,各种版本杂交....我用的是struts2-2.5.8里jar包,可以成功)
commons-lang.jar
json-lib-2.3-jdk15.jar
struts2-json-plugin-2.2.3.jar
ezmorph-1.0.1.jar
commons-beanutils-1.9.2.jar
commons-collections-3.1.jar
除此之外,stuts2环境不用多说了。
二.内容
1.说明
就一个html页面test.html。流程就是在提交部分输入数据,点击提交,把数据传到TestAction,这个Action里没有对应提交数据的属性(username,password),而是一个Mytest类的对象,Mytest封装了username和password属性。因为考虑到实际上,可能一个Action中有很多需要接收的数据时,Action里要写很多属性,杂乱臃肿不堪,很不舒服,所以用专门类封装起来,用类对象去接收,舒服很多。然后在execute方法里,简单处理下上传接收到的数据,然后把它封装成一个json字符串,返回给前台调用的Ajax,前台仍旧那个test.html页面显示部分再简单显示下返回json数据。
2.代码
(1)test.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/jquery-3.1.1.js"></script> </head> <body> <h3 style="color:red">提交数据部分</h3> <table style="border:1px solid black;width:300px;height:150px;"> <tr> <td>username:</td> <td><input type="text" id="username"></td> </tr> <tr> <td>password:</td> <td><input type="password" id="pass"></td> </tr> <tr> <td colspan="2"><input type="submit" onclick="test()"></td> </tr> </table> <h3 style="color:red">显示下传回的json数据</h3> <table style="border:1px solid blue;width:300px;height:100px;"> <tr> <td>传回的username:</td> <td><div id='backusername' style='color:red;'></div></td> </tr> <tr> <td>传回的password:</td> <td><div id='backpassword' style='color:red;'></div></td> </tr> </table> <script> function test(){ //下面这个是我们上传时候用到的对象,这里一定要注意的是,我们后台用的是类对象去接受这些上传的数据 //所以里面的属性名要写成Action里的'对象名.属性名',千万别直接写成'属性名',不然后台那个对象接收不到 var mytest={ 'mytest.username':$('#username').val(), 'mytest.password':$('#pass').val() }; $.ajax({ url:'usertest.action', type:'post', data:mytest, dataType:"json", success:function(data){ //有时候感觉接受的数据总是显示各种乱七八糟的错误,你可以先alert看下,传回的是什么东西 alert(data); //随便的显示一下传回的数据喽 var backdata=JSON.parse(data); //传回的是json字符串,要先把它转换成js中的类对象,对于json字符串和json对象自己去百度 $('#backusername').html(backdata.backusername);//将json字符串转换成json对象后,就可以这样获取其中的值。 $('#backpassword').html(backdata.backpassword); } }); } </script> </body> </html>
(2)Mytest.java(封装了Action里需要接收用的属性username和password)
package com.st.model; public class Mytest { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
(3)TestAction(关键的地方了)
package com.st.action; import java.util.HashMap; import java.util.Map; import com.opensymphony.xwork2.ActionSupport; import com.st.model.Mytest; import net.sf.json.JSONObject; public class TestAction extends ActionSupport { private Mytest mytest; //在此action里需要用到的属性,当要用到的属性多到一定数量,坏处大家都知道,所以用个类来封装那些属性,当然小例子嘛,随便写几个属性。 private String returndata; //从Action返回json数据给调用的Ajax,毕竟用用Ajax基本上要交互下嘛。 //对应getter,setter public String getReturndata() { return returndata; } public void setReturndata(String returndata) { this.returndata = returndata; } public Mytest getMytest() { return mytest; } public void setMytest(Mytest mytest) { this.mytest = mytest; } //下面是用来处理业务,返回所想要的json给Ajax的函数 @Override public String execute(){ System.out.println(mytest); System.out.println("下面传上来的name:"+mytest.getUsername()); System.out.println("下面传上来的password:"+mytest.getPassword()); //把前台页面上传的数据封装成json再传回去显示下 Map<String,String> map=new HashMap<String,String>(); map.put("backusername", mytest.getUsername()); map.put("backpassword", mytest.getPassword()); //上面的map不是json当然是不可以用于返回的,于是呢我们要把它搞成json字符串,你也可以自己去拼json字符串。 JSONObject json=JSONObject.fromObject(map); returndata=json.toString(); //result默认的name就是SUCCESS return SUCCESS; } }
(4)struts.xml(对应action的配置,需要注意的细节部分。ps:我是整合了spring的,不过也就一点地方不一样)
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.objectFactory" value="spring"></constant> <!-- 下面是我们要写的地方了 --> <package name="default" extends="json-default"> <!-- 下面是我们要声明配置的action --> <action name="usertest" class="usertestAction" method="execute"> <!-- 注意2个地方,最上面package继承(extends)的是json-default,下面result的type是json --> <result name="success" type="json"> <!-- 这里的name=root是返回json数据时的一种类型,root是json字符串中只包含该对象的属性,而其他类型,可能会在返回的json类型中额外包含其他的属性和值 ,不一一说了--> <!-- 然后这个returndata 是我们action里定义的返回的json。 --> <param name="root">returndata</param> </result> </action> </package> </struts>
此文章只为记录学习和帮助和我一样的菜鸟,前辈们路过发现不雅之处,可以指教下我,谢谢大家了。