首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

struts2怎么返回json和处理json

2012-08-17 
struts2如何返回json和处理json以下是小弟的一点研究成果,拿来和大家分享,我用了3到4中struts2操作json找

struts2如何返回json和处理json
以下是小弟的一点研究成果,拿来和大家分享,我用了3到4中struts2操作json找了一种我认识最合理和最简单的,最下面有引用网上的资料,因为都一样就没有必要赘述了,上面都是我自己的实例,如有错误请大家指正,若有疑问请联系我 QQ 376434729。

需要的jar包是struts2.1.8,json插件就是2.1.8的struts2-json-plugin-2.1.8.1,因为json的第三方插件有很多,例如json-lib-2.4-jdk15和json虽然说可以实现json的处理,但是相对来说可能是有点麻烦,而S2自带的插件为简单一点。

实例:(分页查询和添加)

实体类(domain)

public classFieldmanage implements java.io.Serializable {     // Fields     private Integer fieldManageId;    private String fieldManageName;    private String fieldManageDesc;    private String isuse;    getter&&setter省略。}


数据访问Dao
public classFieldManageDao extendsHibernateEntityDao<Fieldmanage> {   public booleanoperaFieldmanage(Fieldmanage fieldmanage){        try {            this.saveOrUpdate(fieldmanage);            return true;        } catch(Exception e) {            e.printStackTrace();        }        return false;    } publicList<Fieldmanage> getFieldmanageList(String name,intstart,int end){String hql="from Fieldmanage where fieldManageName like '%"+name+"%'";List<Fieldmanage> list=null;try {Query q = this.getSession().createQuery(hql);            q.setFirstResult(start);            q.setMaxResults(end);            list = q.list();        } catch(Exception e) {            e.printStackTrace();        }        return list;}       public intgetFieldmanageCount(String name){String hql="select count(*) from Fieldmanage where fieldManageName like '%"+name+"%'";        intcount=0;        try {    Query q =this.getSession().createQuery(hql);count = Integer.parseInt(q.uniqueResult().toString());        } catch(Exception e) {            e.printStackTrace();        }        returncount;    }


业务逻辑层Service
public classFieldManageService {    //spring注入    privateFieldManageDao fieldManageDao;public voidsetFieldManageDao(FieldManageDao fieldManageDao) {        this.fieldManageDao = fieldManageDao;    }      public booleanoperaFieldmanage(Fieldmanage fieldmanage){return fieldManageDao. operaFieldmanage (fieldmanage);     }      publicList<Fieldmanage> getFieldmanageList (String name,intstart,int end){    List<Fieldmanage> list=null;    try {list = fieldManageDao.getFieldmanageList(name, start, end);        } catch(Exception e) {            e.printStackTrace();        }        return list;}   public intgetFieldmanageCount(String name){return fieldManageDao.getFieldmanageCount(name);}}

Struts控制层
public classFieldManageAction extends ActionSupport {    privateFieldManageService fieldManageService;    privateFieldmanage fieldmanage;       privateList<Fieldmanage> data;    private int totalCount;    privateString success;    //分页    private int start;    private int limit;    均有getter和setter方法,但是service注入进来的方法最好没有get             publicString operaFieldmanage(){            try {    boolean sign = fieldManageService.operaFieldmanage(fieldmanage);                if(sign){                    this.setSuccess("true");                }else{                    this.setSuccess("false");                }            } catch(Exception e) {                this.setSuccess("false");                e.printStackTrace();            }            return "operaFieldmanage";    }       publicString fieldManageList(){        String name="";        try {if(fieldmanage对象和名称是否为null){        name=fieldmanage.getFieldManageName();    }            intlimitNo=15;            if(limit!=0){                limitNo=limit;            }int count = fieldManageService.getFieldmanageCount(name);List<Fieldmanage> list = fieldManageService.getFieldmanageList(name, start, limitNo);            this.setData(list);            this.setTotalCount(count);        } catch(Exception e) {            e.printStackTrace();        }        return this.SUCCESS;}}

Action里面提供get方法就行了,不必用其他的json插件将list等转化为json格式,因为strut2的插件可以帮你识别并自动转换,你需要做的就是将你得到的数据set进去。

Struts.xml

<package name="default" extends ="json-default" >

<action name="fieldManage_*" method="{1}" lass="fieldManageAction">
        <result type="json">
            <param name="includeProperties">totalCount,data.*</param>
        </result>
        <result name="operaFieldmanage" type="json">
            <param name="includeProperties">success</param>
        </result>
        </action>

</package>

extends=”json-default”这边必须这样设置才能处理json。

1.<action name="test" method="test"> 

  <result type="json" /><!--将action的bean属性以json字符串返回浏览器--> 

  </action>

2.只要继承extends="json-default",json拦截器是默认配置上的,可以不配。result设置成json之后,容器会把action的属性自动封装到一个json对象中(json拦截器来做),然后调用js的callback方法. 返回json数据

3.如果按照1中的配置。你会发现前台返回的json字符串,是把action中的所有属性全部转化为json字符串返回给浏览器了(甚至有时候返回不了结果,也不报错,后台执行了,但前台执行不到callback function),但是我们有时候需要根据实际情况返回部分结果,如何对json的结果进行定制输出呢?result提供了一些参数替你解决这个问题,一般情况下用的最多的就是includeProperties 参数和excludeNullProperties参数。当然还有其他的方法,如给pojo的属性加json注解。

4.includeProperties 参数:输出结果中需要包含的属性值,这里正则表达式和属性名匹配,可以用“,”分割填充多个正则表达式。这个参数直接返回对象的json数据,前台不需要eval转换,<param name="root">result</param>则不同,需要前台进行eval转换

如:输出data对象下面的所有属性 和 总条数。

<result type="json">
    <param name="includeProperties">totalCount,data.*</param>
</result>
5.excludeProperties 参数:输出结果需要剔除的属性值,也支持正则表达式匹配属性名,可以用“,”分割填充多个正则表达式,类同includeProperties

6.对一些属性的特殊处理可在action代码中去特殊的序列化,如:

[6.1]默认情况下以get方法开头的都会序列化,如果不想序列化,在action中的方法要打上注解
@JSON(serialize=false)

[6.2]如果在属性get方法上面加@JSON(name="newName"),则返回的json数据中名称是指定的新名称


[6.3]@JSON(format ="yyyy-MM-dd'T'HH:mm:ss")设置用于格式化输出、解析日期表单域的格式。

[6.4]@JSON(deserialize=true)设置是否反序列化该属性

注意:为了避免不必要的麻烦,action里面要有有get开头的方法。

热点排行