輕量級JavaEE企業應用實戰(十一)

配置處理結果

Action處理完用戶請求後,將返回一個普通字符串,整個普通字符串就是一個邏輯視圖名。Struts2通過配置邏輯視圖名和物理視圖之間的映射關係,一旦系統受到Action返回的某個邏輯視圖名,系統就會把對應的物理視圖呈現給瀏覽者。

在Struts2的配置文件中使用result元素來提供,並且根據位置不同分爲兩種效果

局部結果:將<result ../>作爲<action ../>元素的子元素配置
全局結果:將<result ../>作爲<global-results ../>元素的子元素配置

<action name="Login" class="com.action.LoginAction">
    <result name="success" type="dispatcher">
        //指定該邏輯對應的實際視圖資源
        <param name="location">/thank_you.jsp</param>
    </result>
</action>

param元素用於配置一個參數,與所有配置參數的地方相似,需要指定的參數名和參數值。
type的默認屬性是dispatcher

location:該參數指定了該邏輯視圖對應的實際視圖資源
parse:該參數指定是否允許在實際視圖名字中使用OGNL表達式,默認爲true

struts2插件支持的結果類型:

chain結果類型:Action鏈式處理的結果類型
dispatcher結果類型:用於指定JSP作爲視圖的結果類型
freemarker結果類型:用於指定使用FreeMaker模板作爲視圖的結果類型
httpheader結果類型:用於控制特殊的HTTP行爲的結果類型
redirect結果類型:用於直接跳轉到其他URL的結果類型
redirectAction結果類型:用於直接跳轉到其他Action的結果類型
stream結果類型:向瀏覽器返回一個InputStream(一般用於文件下載)
velocity結果類型:指定使用Velocity模板作爲視圖的結果類型
xslt結果類型:用於與XML/XSLT整合的結果類型
plainText結果類型:顯示某個頁面的原始代碼的結果類型

例子:
<result type="plainText">
    <param name="location">/welcome.jsp</param>
    <param name="charset">GBK</param>
</result>

全局結果

<global-results>
    <result name="success">/${target}.jsp</result>
</global-results>

public class MyAction extends ActionSupport {
    private String target;
    ...
}

使用PreResultListener

preResultListener是一個監聽器接口,可以在Action完成控制處理之後,系統轉入實際的物理視圖之間被回調。
Struts2應用可以由action、攔截器添加PreResultListener監聽器,添加此監聽器可以通過ActionInvocation的addPreResultListener()方法完成。
一旦爲Action添加了此監聽器:該監聽器就可以在應用轉入實際物理視圖之前回調該監聽器的beforeResult()方法;
一旦爲攔截器添加此監聽器:該監聽器會對攔截器所攔截的所有Action都起作用

public class LoginRegister extends ActionSupport {
    private String name;
    private String password;
    private String tip;
    ...

    public String regist() throws Exception {
        ActionContext.getContext().
                    getSession().put("username",getUsername());
        setTip("恭喜" + getUsername() + "註冊成功")
    }

    public String execute() throws Exception {
        ActionInvocation invocation = ActionInvocation.
            getContext().getActionInvocation();
        invocation.addPreResultListener(new PreResultListener() {
            public void beforeResult(ActionInvocation inv, String r){
                inv.getInvocationContext().put("extra", 
                    new java.util.Date() + "由" + r + "邏輯視圖名轉入");
            }
        })
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章