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開頭的方法。

相關文章
相關標籤/搜索