1. 程式人生 > >struts2如何返回json和處理json

struts2如何返回json和處理json

以下是小弟的一點研究成果,拿來和大家分享,我用了3到4中struts2操作json找了一種我認識最合理和最簡答的,最下面有引用網上的資料,因為都一樣就沒有必要贅述了,上面都是我自己的例項,如有錯誤請大家指正,若有疑問請聯絡我 QQ 376434729。

需要的jar包是struts2.1.8,json外掛就是2.1.8struts2-json-plugin-2.1.8.1,因為json的第三方外掛有很多,例如json-lib-2.4-jdk15json雖然說可以實現json的處理,但是相對來說可能是有點麻煩,而S2自帶的外掛為簡單一點。

例項:(分頁查詢和新增)

實體類(domain

public

classFieldmanage implements java.io.Serializable {

// Fields

privateInteger fieldManageId;

privateString fieldManageName;

privateString fieldManageDesc;

privateString isuse;

getter&&setter省略。

}

資料訪問Dao

public classFieldManageDao extendsHibernateEntityDao<Fieldmanage> {

public boolean

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