代码请参照 http://acheron.javaeye.com/admin/blogs/402499
JSON 官方文档
http://www.json.org/json-zh.html
jQuery 官方文档
http://docs.jquery.com/Main_Page
- <span style= "font-size: small;" > function removerecordbyid(recordid){
- $("#showallrecord table tr" ).each(
- function (){
- var seq=parseInt($( this ).children( "td" ).html());
- var thisrecord = this ;
- if (seq==recordid)
- if (confirm( "您确认执行删除操作么?" )){
- $.ajax({
- type: "POST" ,
- url:"removeRecordById.action" ,
- dataType:"json" ,
- data:{"msg.id" :recordid},
- success:function (json){
- if (json.status==4){
- alert("删除失败,只有提交留言的ip才能删除" );
- }else {
- $(thisrecord).remove();
- // alert("删除成功");
- }
- },
- error:function (){
- alert("del error" );
- }
- });
- }
- });
- }
- function getrecordbypage(page){
- $.ajax({
- type: "POST" ,
- url:"listAllRecordByPage.action" ,
- dataType:"json" ,
- data:{"page" :page},
- success:function (json){
- 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>" ;
- for (i=0;i<json.records.length;i++){
- 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>"
- strs=strs+str
- }
- strs=strs+"</table>"
- $("#showallrecord" ).html(strs);
- },
- error:function (){
- alert("error" );
- }
- });
- };</span>
注意dataType:"json"这个参数一定不能少,否则不能正确识别
一下是Struts action代码
- <span style= "font-size: small;" > 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;
- }
- }</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"。
- < span style = "font-size: small;" > <? xml version = "1.0" encoding = "UTF-8" ?>
- <!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" />
- < package name = "json" extends = "json-default" >
- < action name = "ajaxRequest" class = "com.jun.demos.struts2json.HelloWorld" >
- < result type = "json" />
- </ action >
- < action name = "listIndexRecord" class = "com.jun.demos.book.action.CrudMsgAction" >
- < result type = "json" />
- </ action >
- < action name = "listAllRecord" class = "com.jun.demos.book.action.CrudMsgAction" method = "listAllRecord" >
- < result type = "json" />
- </ action >
- < action name = "listAllRecordByPage" class = "com.jun.demos.book.action.CrudMsgAction" method = "listAllRecordByPage" >
- < result type = "json" />
- </ action >
- < action name = "insertRecord" class = "com.jun.demos.book.action.CrudMsgAction" method = "insertRecord" >
- < result type = "json" />
- </ action >
- < action name = "removeRecordById" class = "com.jun.demos.book.action.CrudMsgAction" method = "removeRecordById" >
- < result type = "json" />
- </ action >
- < action name = "getPageIndex" class = "com.jun.demos.book.action.CrudMsgAction" method = "getPageSize" >
- < result type = "json" />
- </ action >
- </ package >
- </ struts > </ span >
配置该Action与配置普通Action存在小小的区别。
包继承了json-default包,而不再继承默认的default包,这是因为只有在该包下才有json类型的Result。
result可以使用 <param name="excludeProperties">page,index</param>
排除 Action 中 这些都不返回的属性.
结合action中属性getter方法注解@JSON(serialize=false)灵活配置
异常解决:
- 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:
- com.google.apphosting.utils.jetty.JettyLogger warn
这里下面有 4-5 页的异常信息,就不贴出来了
解决方法:
出现这个问题是某属性通过串行化 json 数据异常,
因为使用的 spring 注入属性 recordService ,也就是提供了 getter 和 setter ,
而 sturts-plugin 是通过 getterXxx 把 Xxx 属性串行化输出 JSON 到客户端,
所以解决这个异常方法就是在不需要串行化的属性的 getter 前加上 annotation ,
就是 @JSON(Serialize=false)
代码如:
- @JSON (serialize= false )
- public RecordService getRecordService() {
- return recordService;
- }