struts2如何返回json和处理json

 

如下是小弟的一点研究成果,拿来和你们分享,我用了3到4中struts2操做json找了一种我认识最合理和最简单的,最下面有引用网上的资料,由于都同样就没有必要赘述了,上面都是我本身的实例,若有错误请你们指正。java

须要的jar包是struts2.1.8,json插件就是2.1.8struts2-json-plugin-2.1.8.1,由于json的第三方插件有不少,例如json-lib-2.4-jdk15json虽说能够实现json的处理,可是相对来讲多是有点麻烦,而S2自带的插件为简单一点。web

 实例:(分页查询和添加)正则表达式

实体类(domainspring

public classFieldmanage implements java.io.Serializable {json

 

    // Fields浏览器

 

    privateInteger fieldManageId;dom

    privateString fieldManageName;this

    privateString fieldManageDesc;spa

    privateString 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;

    均有gettersetter方法,可是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" class="com.TestAction" method="test">  

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

  </action>

2.只要继承extends="json-default"json拦截器是默认配置上的,能够不配。result设置成json以后,容器会把action的属性自动封装到一个json对象中(json拦截器来作),而后调用jscallback方法. 返回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开头的方法。

相关文章
相关标签/搜索