Struts2,AJAX,json-plugin使用

本文介绍如何利用Struts2框架与jQuery实现AJAX交互,包括记录的增删查改等功能。文中详细展示了JavaScript代码实现及Struts2 Action处理过程,并解释了JSON注解的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码请参照 http://acheron.javaeye.com/admin/blogs/402499

 

JSON 官方文档

http://www.json.org/json-zh.html

 

jQuery 官方文档

http://docs.jquery.com/Main_Page

 

Js代码
  1. <span style= "font-size: small;" > 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.     }  
  28.       
  29.       
  30.         function  getrecordbypage(page){  
  31.         $.ajax({  
  32.             type: "POST" ,  
  33.             url:"listAllRecordByPage.action" ,  
  34.             dataType:"json" ,  
  35.             data:{"page" :page},  
  36.             success:function (json){  
  37.                 var  strs= "<table border=/"1 /"><tr id='colattr'><td>key-id</td><td>昵称< /td><td>留言时间</td><td width='120'>邮箱</td>< td width='120'>博客</td><td width='250'>留言</td>< td>操作</td></tr>" ;  
  38.                 for (i=0;i<json.records.length;i++){  
  39.                     str="<tr id='" +json.records[i].id+ "' onclick='lineclick(this);'><td>" +json.records[i].id+ "</td><td>" +json.records[i].from+ "</td><td>" +json.records[i].addDate+ "</td><td>" +json.records[i].mail+ "</td><td>" +json.records[i].site+ "</td><td>" +json.records[i].cont+ "</td><td><a onclick='removerecordbyid(" +json.records[i].id+ ");'>删除</a></td></tr>"   
  40.                     strs=strs+str  
  41.                 }  
  42.                 strs=strs+"</table>"   
  43.                 $("#showallrecord" ).html(strs);  
  44.             },  
  45.             error:function (){  
  46.                 alert("error" );  
  47.             }  
  48.         });  
  49.           
  50.     };</span>  

 

注意dataType:"json"这个参数一定不能少,否则不能正确识别

一下是Struts action代码

Java代码
  1. <span style= "font-size: small;" > 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. //other getter and setter   
  14.     @Override   
  15.     public  String execute()  throws  Exception {  
  16.         return  SUCCESS;  
  17.     }  
  18.       
  19.     /**  
  20.      * 返回所有记录的JSON数据  
  21.      * @return list . All of the record.  
  22.      * @throws Exception  
  23.      */    
  24.     public  String listAllRecord()  throws  Exception{  
  25.         List<Record> list = recordService.listAllRecord();  
  26. //      List list = Arrays.asList(allRecord);   
  27. //      List<Record> list2 = (List<Record>)list;   
  28.   
  29.         //      Record rec = (Record)list.get(0);   
  30.         records = list;  
  31.         return  SUCCESS;  
  32.     }  
  33.       
  34.     public  String listAllRecordByPage()  throws  Exception{  
  35.         List<Record> list = recordService.listAllRecord(page);  
  36.         records = list;  
  37.         return  SUCCESS;  
  38.     }  
  39.       
  40.   
  41.     /**  
  42.      * 插入记录  
  43.      * @return update the view with AJAX when struts2 action return  
  44.      * @throws Exception  
  45.      */   
  46.     public  String insertRecord()  throws  Exception{  
  47.         //插入留言日期设置   
  48.         msg.setAddDate(new  Date());  
  49.         //获取客户端ip,setIpaddr   
  50.         String clientIpAddr = ServletActionContext.getRequest().getRemoteAddr();  
  51.         msg.setIpaddr(clientIpAddr);  
  52.         //判断是否为空   
  53.         if ( "" .equals(msg.getFrom()))msg.setFrom( "anonymous" );  
  54.         if ( "" .equals(msg.getMail()))msg.setMail( "@" );  
  55.         if ( "" .equals(msg.getSite()))msg.setSite( "-" );  
  56.         if ( "" .equals(msg.getCont()))msg.setCont( "这家伙很懒,什么都没留下" );  
  57.           
  58.         recordService.insertRecord(msg);  
  59.         return  SUCCESS;  
  60.     }  
  61.     /**  
  62.      * 通过索引查找记录  
  63.      * @return the field msg  
  64.      * @throws Exception  
  65.      */   
  66.     public  String listRecordByIndex()  throws  Exception{  
  67.         List<Record> list = recordService.listAllRecord();  
  68.         this .msg = list.get( this .getIndex());  
  69.           
  70.         return  SUCCESS;  
  71.     }  
  72.     /**  
  73.      * 删除对应id记录  
  74.      * @return field status. in order to update view with AJAX  
  75.      * @throws Exception  
  76.      */   
  77.     public  String removeRecordById()  throws  Exception{  
  78.         String clientIpAddr = ServletActionContext.getRequest().getRemoteAddr();  
  79.         Record r = recordService.listRecordById(msg.getId());  
  80.         if (clientIpAddr.equals(r.getIpaddr())){  
  81.             recordService.removeRecordById(msg.getId());  
  82.             return  SUCCESS;  
  83.         }  
  84.         status = 4 ;  
  85.         return  SUCCESS;  
  86.     }  
  87.       
  88.     /**  
  89.      * 获得分页数  
  90.      * @return pageSize using field page  
  91.      * @throws Exception  
  92.      */   
  93.     public  String getPageSize()  throws  Exception{  
  94.         page = recordService.getPage();  
  95.         return  SUCCESS;  
  96.     }  
  97. }</span>  
public class CrudMsgAction extends ActionSupport{
	private Record msg;
	private int index;
	private RecordService recordService;
	private List<Record> records;
	private int status = 0;
	private int page = 0;
	
	@JSON(serialize=false)
	public RecordService getRecordService() {
		return recordService;
	}
//other getter and setter
	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
	
	/**
	 * 返回所有记录的JSON数据
	 * @return list . All of the record.
	 * @throws Exception
	 */	
	public String listAllRecord() throws Exception{
		List<Record> list = recordService.listAllRecord();
//		List list = Arrays.asList(allRecord);
//		List<Record> list2 = (List<Record>)list;

		//		Record rec = (Record)list.get(0);
		records = list;
		return SUCCESS;
	}
	
	public String listAllRecordByPage() throws Exception{
		List<Record> list = recordService.listAllRecord(page);
		records = list;
		return SUCCESS;
	}
	

	/**
	 * 插入记录
	 * @return update the view with AJAX when struts2 action return
	 * @throws Exception
	 */
	public String insertRecord() throws Exception{
		//插入留言日期设置
		msg.setAddDate(new Date());
		//获取客户端ip,setIpaddr
		String clientIpAddr = ServletActionContext.getRequest().getRemoteAddr();
		msg.setIpaddr(clientIpAddr);
		//判断是否为空
		if("".equals(msg.getFrom()))msg.setFrom("anonymous");
		if("".equals(msg.getMail()))msg.setMail("@");
		if("".equals(msg.getSite()))msg.setSite("-");
		if("".equals(msg.getCont()))msg.setCont("这家伙很懒,什么都没留下");
		
		recordService.insertRecord(msg);
		return SUCCESS;
	}
	/**
	 * 通过索引查找记录
	 * @return the field msg
	 * @throws Exception
	 */
	public String listRecordByIndex() throws Exception{
		List<Record> list = recordService.listAllRecord();
		this.msg = list.get(this.getIndex());
		
		return SUCCESS;
	}
	/**
	 * 删除对应id记录
	 * @return field status. in order to update view with AJAX
	 * @throws Exception
	 */
	public String removeRecordById() throws Exception{
		String clientIpAddr = ServletActionContext.getRequest().getRemoteAddr();
		Record r = recordService.listRecordById(msg.getId());
		if(clientIpAddr.equals(r.getIpaddr())){
			recordService.removeRecordById(msg.getId());
			return SUCCESS;
		}
		status = 4;
		return SUCCESS;
	}
	
	/**
	 * 获得分页数
	 * @return pageSize using field page
	 * @throws Exception
	 */
	public String getPageSize() throws Exception{
		page = recordService.getPage();
		return SUCCESS;
	}
}



 

在上面代码中,使用了JSON注释@JSON(serialize=false),
除此之外,JSON注释还支持如下几个域:
name:指定Action属性被序列化成JSON对象的属性名。
serialize:设置是否序列化该属性
deserialize:设置是否反序列化该属性。
format:设置用于格式化输出、解析日期表单域的格式。例如"yyyy-MM-dd'T'HH:mm:ss"。

 

Xml代码
  1. < span   style = "font-size: small;" > <? xml   version = "1.0"   encoding = "UTF-8"   ?>   
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">   
  5.   
  6. < struts >   
  7. < constant   name = "struts.objectFactory"   value = "spring" />   
  8.     < package   name = "json"   extends = "json-default" >   
  9.         < action   name = "ajaxRequest"   class = "com.jun.demos.struts2json.HelloWorld" >   
  10.             < result   type = "json"   />   
  11.         </ action >   
  12.         < action   name = "listIndexRecord"   class = "com.jun.demos.book.action.CrudMsgAction" >   
  13.             < result   type = "json"   />   
  14.         </ action >   
  15.         < action   name = "listAllRecord"   class = "com.jun.demos.book.action.CrudMsgAction"   method = "listAllRecord" >   
  16.             < result   type = "json"   />   
  17.         </ action >   
  18.         < action   name = "listAllRecordByPage"   class = "com.jun.demos.book.action.CrudMsgAction"   method = "listAllRecordByPage" >   
  19.             < result   type = "json"   />   
  20.         </ action >   
  21.         < action   name = "insertRecord"   class = "com.jun.demos.book.action.CrudMsgAction"   method = "insertRecord" >   
  22.             < result   type = "json"   />   
  23.         </ action >   
  24.         < action   name = "removeRecordById"   class = "com.jun.demos.book.action.CrudMsgAction"   method = "removeRecordById" >   
  25.             < result   type = "json"   />   
  26.         </ action >   
  27.         < action   name = "getPageIndex"   class = "com.jun.demos.book.action.CrudMsgAction"   method = "getPageSize" >   
  28.             < result   type = "json"   />   
  29.         </ action >   
  30.           
  31.     </ package >   
  32. </ struts > </ span >   

 配置该Action与配置普通Action存在小小的区别。

包继承了json-default包,而不再继承默认的default包,这是因为只有在该包下才有json类型的Result。
result可以使用
<param name="excludeProperties">page,index</param>
排除 Action 中 这些都不返回的属性.

结合action中属性getter方法注解@JSON(serialize=false)灵活配置

 

异常解决:

 

Xml代码
  1. Nested in javax.servlet.ServletException: com.googlecode.jsonplugin.JSONException: com.googlecode.jsonplugin.JSONException: com.googlecode.jsonplugin.JSONException: com.googlecode.jsonplugin.JSONException: com.googlecode.jsonplugin.JSONException: com.googlecode.jsonplugin.JSONException: java.lang.reflect.InvocationTargetException:  
  2.   
  3. com.google.apphosting.utils.jetty.JettyLogger warn  

 

这里下面有 4-5 页的异常信息,就不贴出来了

 

解决方法:

出现这个问题是某属性通过串行化 json 数据异常,

因为使用的 spring 注入属性 recordService ,也就是提供了 gettersetter

sturts-plugin 是通过 getterXxxXxx 属性串行化输出 JSON 到客户端,

所以解决这个异常方法就是在不需要串行化的属性的 getter 前加上 annotation

就是 @JSON(Serialize=false)

 

代码如:

   

   

Java代码
  1. @JSON (serialize= false )  
  2.   
  3.     public  RecordService getRecordService() {  
  4.   
  5.        return  recordService;  
  6.   
  7.     } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值