若是action的屬性不少,咱們想要從Action返回到調用頁面的數據。這個時候配置includeProperties或者 excludeProperties攔截器便可。而這2個攔截器的定義都在struts2的json-default包內,因此要使用該攔截器的包都要繼承自json-default。java
xml文件:ajax
<struts> <constant value="spring" name="struts.objectFactory" /> <include file="struts-admin.xml"></include> <package name="default" extends="json-default"> <action class="com.person.PersonAction" name="person" method="view"> <result type="json"> <param name="includeProperties">person\.name,person\.age,person\.gender </param> </result> </action> </package> </struts>
通過測試,下面的設置也是能夠的,就是在includeProperties裏面直接寫你所在Action的屬性正則表達式
<struts> <constant value="spring" name="struts.objectFactory" /> <include file="struts-admin.xml"></include> <package name="default" extends="json-default"> <action class="com.person.PersonAction" name="person" method="view"> <result type="json"> <param name="includeProperties">name,age,gender </param> </result> </action> </package> </struts>
利用Struts 2的支持的可配置結果,能夠達到過濾器的效果。Action的處理結果配置支持正則表達式。若是返回的對象是一個數組格式的Json數據。好比 peson Bean中有對象persion1…person9,而我只要persion1,則能夠用以下的正則表達式。spring
<struts> <constant value="spring" name="struts.objectFactory" /> <include file="struts-admin.xml"></include> <package name="default" extends="json-default"> <action class="com.person.PersonAction" name="person" method="view"> <result type="json"> <param name="includeProperties">person\[\d+\]\.person1 </param> </result> </action> </package> </struts>
excludeProperties攔截器的用法與此類同,若是須要攔截掉person Bean的整個對象,寫法以下:json
<struts> <constant value="spring" name="struts.objectFactory" /> <include file="struts-admin.xml"></include> <package name="default" extends="json-default"> <action class="com.person.PersonAction" name="person" method="view"> <result type="json"> <param name="excludeProperties">person </param> </result> </action> </package> </struts>
傳遞List或者對象是,後面要加上 .* 表明所有的意思。數組
<param name="includeProperties">topicList.*</param>
須要注意的是,若是用JSON插件把返回結果定爲JSON。而JSON的原理是在ACTION中的get方法都會序列化,因此前面是get的方法只要沒指定不序列化,都會執行,那麼能夠在該方法的前面加註解聲明該方法不作序列化。測試
@JSON(serialize = false) public User getUser() { return this.User; } @JSON(format = "yyyy-MM-dd") public Date getStartDate() { return this.startDate; }
項目中遇到的問題:this
strut2提供了支持json的插件spa
必須繼承json-default、json-default繼承自struts-default.插件
<package name="json" namespace="/" extends="json-default"> <action name="moduleAction" class="moduleAction" > <result type="json" name="findData"> <param name="root">datas</param> <param name="includeProperties">success,totalcount</param> </result> <result type="json" name="findTree"> <param name="root">result</param> </result> </action> </package>
1,result中type設置成json以後,容器會把action的屬性自動封裝到一個json對象中(json攔截器來作),而後調用ajax的callback方法. 返回json數據
2,includeProperties 參數:輸出結果中須要包含的屬性值,這裏正則表達式和屬性名匹配,能夠用「,」分割填充多個正則表達式。 如<param name="includeProperties">module.*,user\.userName</param>? 表示是module的全部屬性及用戶的用戶名
3,excludeProperties 參數:輸出結果須要排除的屬性值,也支持正則表達式匹配屬性名,能夠用「,」分割填充多個正則表達式,類同includeProperties
4,爲何要用includeProperties或excludeProperties 參數:
a.主要是爲了過濾掉接口,pojo的set、list、其它對象等不須要的數據防止循環取其它關聯對象或找不到接口。
b.若是不配置,默認是處理 action中的全部屬性,若是action中有接口注入,json攔截器可能找不到接口而返回不告終果,
c.還有若是action中有一個對象,這個對象與好多對象都有關聯,json攔截器會將相關聯的全部對象的屬性所有轉換成json格式,
d. 若是其它對象有list、set,其返回結果至關龐大,有多是死循環而沒法返回 。
e.若是不用<param name="includeProperties">或其餘方式進行json數據過濾,經過debug你會發現前臺返回的json字符串,是把 action中的全部屬性所有轉化成json字符串返回給客戶端(包括service接口、pojo全部屬性及有關聯的pojo。有時候根本返回不告終果,也不報錯,後臺雖然執行了, 但前臺執行不到callback function,這主要是由於找不到接口或者關聯的pojo太多,形成死循環),
f. 通常狀況下用的最多的就是root、 includeProperties 和excludeNullProperties參數。
g. 固然還有其餘的方法,如給pojo的屬性加json註解。
5,result標籤中的name屬性,即表示是struts2中的action類中返回的名稱
如:
public String findAllById() throws Exception{ int id=Integer.parseInt( this.request.getParameter("pid")); List<ModuleBean> list=service.findById(id); return "findTree"; }
上面代碼return "findTree"就會找到findTree的結果集,並將其封裝起來,返回json給客戶端
所以 action 能夠配置多個result