首页 > 代码库 > Struts2 整合jQuery实现Ajax功能(2)
Struts2 整合jQuery实现Ajax功能(2)
1.1.1 Action利用struts2-json-plugin-X.X.X.jar响应Json格式信息:
1. function removerecordbyid(recordid){
2. $("#showallrecord table tr").each(
3. function(){
4. var seq=parseInt($( this ).children( "td" ).html());
5. var thisrecord = this ;
6. if(seq==recordid)
7. if(confirm( "您确认执行删除操作么?")){
8. $.ajax({
9. type: "POST",
10. url:"removeRecordById.action",
11. dataType:"json",
12. data:{"msg.id":recordid},
13. success:function(json){
14. if(json.status==4){
15. alert("删除失败,只有提交留言的ip才能删除" );
16. }else{
17. $(thisrecord).remove();
18. // alert("删除成功");
19. }
20. },
21. error:function(){
22. alert("del error");
23. }
24. });
25. }
26. });
27. }
Action代码(做了简化)
1. public class CrudMsgAction extends ActionSupport{
2. private Record msg;
3. private int index;
4. private RecordService recordService;
5. private List<Record> records;
6. private int status = 0 ;
7. private int page = 0 ;
8.
9. @JSON (serialize= false)
10. public RecordService getRecordService() {
11. return recordService;
12. }
13.
14. /**
15. * 返回所有记录的JSON数据
16. * @return list . All of the record.
17. * @throws Exception
18. */
19. public String listAllRecord() throws Exception{
20. List<Record> list = recordService.listAllRecord();
21. records = list;
22. return SUCCESS;
23. }
24.
25. public String listAllRecordByPage() throws Exception{
26. List<Record> list = recordService.listAllRecord(page);
27. records = list;
28. return SUCCESS;
29. }
30.
31. /**
32. * 插入记录
33. * @return update the view with AJAX when struts2 action return
34. * @throws Exception
35. */
36. public String listRecordByIndex() throws Exception{
37. List<Record> list = recordService.listAllRecord();
38. this.msg = list.get( this .getIndex());
39.
40. return SUCCESS;
41. }
42. /**
43. * 删除对应id记录
44. * @return field status. in order to update view with AJAX
45. * @throws Exception
46. */
47. public String removeRecordById() throws Exception{
48. String clientIpAddr = ServletActionContext.getRequest().getRemoteAddr();
49. Record r = recordService.listRecordById(msg.getId());
50. if(clientIpAddr.equals(r.getIpaddr())){
51. recordService.removeRecordById(msg.getId());
52. return SUCCESS;
53. }
54. status = 4;
55. return SUCCESS;
56. }
57.
58. /** 获得分页数 */
59. public String getPageSize() throws Exception{
60. page = recordService.getPage();
61. return SUCCESS;
62. }
63. }
上面代码中,使用了 @JSON(serialize=false),
除此之外,@JSON还支持如下几个域:
name:指定Action属性被序列化成JSON对象的属性名。
serialize:设置是否序列化该属性
deserialize:设置是否反序列化该属性。
format:设置用于格式化输出、解析日期表单域的格式。例如"yyyy-MM-dd‘T‘HH:mm:ss"
1. < package name = "json" extends = "json-default" >
2. <action name = "ajaxRequest" class ="com.jun.demos.struts2json.HelloWorld" >
3. <result type = "json" />
4. </action >
5. <action name = "listIndexRecord" class ="com.jun.demos.book.action.CrudMsgAction" >
6. <result type = "json" />
7. </action >
8. <action name = "listAllRecord" class ="com.jun.demos.book.action.CrudMsgAction" method ="listAllRecord" >
9. <result type = "json" />
10. </action >
11. <action name = "removeRecordById" class ="CrudMsgAction" method = "removeRecordById" >
12. <result type = "json" />
13. </action >
14. <action name = "getPageIndex" class = " CrudMsgAction" method = "getPageSize" >
15. <result type = "json" />
16. </action >
17. </package >
配置该Action与配置普通Action存在小小的区别。
包继承了json-default包,而不再继承默认的default包,这是因为只有在该包下才有json类型的Result。
Result可以使用 <param name="excludeProperties">page,index</param>排除Action 中这些都不返回的属性.
我们只要输出person对象的name属性值,配置如下
1. <result type="json">
2. <param name="root">person.name</param>
3. </result>
excludeNullProperties参数:表示是否去掉空值, 默认值是false
4. <result type="json">
5. <param name="excludeNullProperties">true</param>
6. </result>
ignoreHierarchy参数:表示是否忽略等级,也就是继承关系,比如:TestAction继承于BaseAction,那么TestAction中返回的json字符串默认是不会包含父类BaseAction的属性值,ignoreHierarchy值默认为true
7. <result type="json">
8. <param name="ignoreHierarchy">false</param>
9. </result>
includeProperties参数:输出结果中需要包含的属性值,这里正则表达式和属性名匹配,可以用“,”分割填充多个正则表达式。 如:输出person的所有属性
10. <result type="json">
11. <param name="includeProperties">person.*, person/.name</param>
12. </result>
例如:
<!-- 购房合同管理 namespace保证action的路径与jQuery兼容-->
<packagename="yushou_hetong"extends="json-default"namespace="/pages/hetong">
<actionname="hetongAdd"class="hetongAddAction">
<resultname="list">/pages/hetong/qylist.jsp</result>
<!-- <resultname="add">/pages/hetong/add.jsp</result>改用纯Html+jQuery-->
<resultname="add">/pages/hetong/add.html</result>
<resultname="Query">/pages/hetong/query.html</result>
<resultname="xiangmu">/pages/hetong/add/xiangmu.jsp</result>
<resultname="loupan">/pages/hetong/add/loupan.jsp</result>
<resultname="house">/pages/hetong/add/house.jsp</result>
<resultname="houseList">/pages/hetong/add/houseList.jsp</result>
<resultname="fukuan">/pages/hetong/add/fukuan.jsp</result>
<resultname= "success" type="json">
<paramname="ignoreHierarchy">false</param>
<paramname="includeProperties">errmsg</param>
</result>
</action>
</package>
二级联动标签
在struts2 标签s:doubleselect二级联动标签的基础上实现事件:第二级onchange时调用struts2 action,在action中查询一个名称,然后返回回来,此信息显示在页面上(这只是给用户一个提示信息,不影响表单能否提交)
需要加事件的二级联动jsp代码
1. <td class="alignLeft" width="22%"> 所属业务/项目名称: </td>
2. <td valign="top" class="alignLeft" width="20%">
3. <s:doubleselect name="changeApplyFormBO.operationId" list="operationList" listKey="id"
4. listValue=http://www.mamicode.com/"operationName" doubleList="operationSubProductList"
5. doubleListKey="id" doubleListValue=http://www.mamicode.com/"prudName" doubleName="changeApplyFormBO.productId"
6. headerKey="" headerValue=http://www.mamicode.com/"--- Please Select ---" />
7. <span id="company" style="color:red"></span>
8. </td>
我们需要在“项目名称”被改变的事件下调用函数,在生成的静态页面中查得它的id是cbApplySubmit_changeApplyFormBO_productId
说明一下,这里生成的id有一点规律,貌似。cbApplySubmit是本页面form表单的action,而changeApplyFormBO.productId是“项目名称”的name
下面给出定制下拉菜单事件的js
1. <script>
2.
3. $(function(){
4. var obj=document.getElementById("cbApplySubmit_changeApplyFormBO_productId");
5. obj.onchange=function(){
6. var prodId=obj.value;
7. var url="${contextPath}/assets/businessChange/ajaxGetCompany.do";
8. var jsonProd={productId:prodId}; //JSON对象
9. var prodStr=JSON.stringify(jsonProd); //将JSON对象转变成JSON格式的字符串
10. $.post(url,{json:prodStr},callback,"json");
11. }
12. function callback(json){
13. $("#company").html(json.msg);
14. }
15. });
16.
17. </script>
这里,不管是从浏览器端(JS,Ajax,Jquery等)发送给服务器端,还是从服务器端(Struts的Action,Servlet等)发送回客户端,发送的都是JSON格式的字符串
解释如下:
1. var jsonProd={productId:prodId};
这句是组装JSON对象,这里很简单,key是productId,value是页面选择的项目名称的id
1. //将JSON对象转变成JSON格式的字符串
2. var prodStr=JSON.stringify(jsonProd);
通过JavaScript内置对象JSON的stringify方法,将JSON对象转换成字符串。因为,我们传送给服务器端的要是JSON格式的字符串。
1. $.post(url,{json:prodStr},callback,"json");
这一句,jquery用POST方法向服务器端发送数据,url是我们要调用的action全路径,而{json:prodStr}是我们要发送的数据(data),{json:prodStr},其实也是一个JSON对象,Key:value的形式,注意,我们把prodStr这个json串发过去,在Action那里接收时,要接收“json”这个变量,这个变量的值就是我们发送的prodStr字符串。
回调函数(callback)是指服务器端成功返回时,在JS端执行的函数。最后一个参数“json”是返回数据类型的一种,另外,还有”text”、“xml”等
function callback(json){
1. $("#company").html(json.msg);
2. }
3. });
company是span的id,请看最上面二级联动标签处。这个函数用来显示action中组装的json对象的value值
struts2 action类
1. import org.json.JSONObject;
2.
3. public class CBApplyAction extends ActionSupport {
4. private IProductMng productMng;
5. private String json;
6. /**
7. * 通过选择的项目名称,给出提示事业部名称的提示信息
8. *
9. * @return
10. * @throws Exception
11. */
12. public void ajaxGetCompany() throws Exception {
13. JSONObject jsonObj = new JSONObject(json); // 将JSON格式的字符串构造成JSON对象
14.
15. String productId = jsonObj.getString("productId"); // 获取JSON对象中的productId属性的值
16.
17. ProductBO prod = productMng.loadProduct(Integer.parseInt(productId));
18. Integer companyId = prod.getCompanyId();
19. CompanyBO comp = productMng.loadCompany(companyId);
20. String companyName = "事业部为:" + comp.getName();
21. json = "{msg:‘" + companyName + "‘}"; //构造JSON格式的字符串
22. sendMsg(json); //发送JSON格式的字符串回JS端
23. }
24.
25. public void sendMsg(String content) throws IOException{
26. HttpServletResponse response = ServletActionContext.getResponse();
27. response.setCharacterEncoding("UTF-8");
28. response.getWriter().write(content);
29. }
30.
31. public String getJson() {
32. return json;
33. }
34.
35. public void setJson(String json) {
36. this.json = json;
37. }
38.
39. public void setProductMng(IProductMng productMng) {
40. this.productMng = productMng;
41. }
42. }
JSONObject是我从json的网站http://www.json.org/java/index.html上下载了一些java文件,然后将这些.java文件打成一个jar包json.jar,放在项目lib里面 ajaxGetCompany方法没有像struts2 别的方法那样有返回值String,这里设的是void,因我们不需要任何跳转.
这里有个需要注意的,json= "{msg:‘" + companyName + "‘}"; companyName外面应该有引号括起来
struts2 配置文件
1. <action name="ajaxGetCompany" class="CBApplyAction"
2. method="ajaxGetCompany">
3. </action>
没有result