action向頁面傳遞數據,攔截那些不必傳到客戶端的方法。includeProperties

若是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

相關文章
相關標籤/搜索