2015年8月20日 星期四

Struts2 HelloWorld整理 與 伺服器/用戶端 跳轉 (Struts2.3.x 二)

重新寫了一隻HelloWorld,登入用的
web.xml還是一樣,struts.xml如下:
<struts>
    <constant name="struts.devMode" value="true" />
    <package name="basicstruts2" extends="struts-default" namespace="/struts2">
        <action name="login" class="login.LoginAction" method="execute">
            <result name="success">/struts2/login.jsp</result>
            <result name="input">/struts2/fail.jsp</result>
        </action>
    </package>
</struts>

devMode的作用:
.更改.properties配置文件後,不用重啟Server即生效。此功能也可設置struts.i18n.reload=true
.更改struts.xml後,不用重啟Server即生效。此功能也可設置struts.configuration.xml.reload=true
.改成true之後,效能會便慢
.可參考這裡
.namespace,預設是/,我改了,所以待會也要新增資料夾

Action.java:
public class LoginAction extends ActionSupport {
    private String userName;
    private String userPassword;
    private String displayMessage;

    @Override
    public String execute() throws Exception {
        if (userName.equals("aaa") && userPassword.equals("123")) {
            displayMessage = "login success";
            return SUCCESS;
        } else {
            displayMessage = "login fail";
            return INPUT;
        }
    }

    public String getDisplayMessage() {
        return displayMessage;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
}
帳號密碼給setter就夠了,顯示訊息給getter就夠了,要全打也行
SUCCESS和INPUT,是繼承ACTION的field,自己打也行,和struts.xml的result name對應好就可以了
login.jsp:
<s:property value="displayMessage"/>
<form action="login.action">
    <input type="text" name="userName" /><br />
    <input type="password" name="userPassword" /><br />
    <input type="reset" />
    <input type="submit" />
</form>
先把s:那一行註解掉,要先可以run才行
要用時還得在上面加<%@ taglib prefix="s" uri="/struts-tags" %>
fail.jsp自己隨便寫
架構圖:

.能看到頁面後,再將s:加回去,這時會出錯,因為struts2的設計必需是從action(因為web.xml設定action)跳轉的
.所以在網址列上最後的login.jsp改成login.action?userName=&userPassword=就可以看到頁面了
.如果頁面的屬性少打會出action的NullPointerException
.如果直接訪問jsp會出「The Struts dispatcher cannot be found.  This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag. - [unknown location]」這種錯誤訊息

※伺服器/用戶端跳轉

先將s:註解掉來測
<action name="login" class="login.LoginAction" method="execute">
    <result name="success" type="dispatcher">/struts2/login.jsp</result>
    <result name="input" type="redirect">/struts2/login.jsp</result>
</action>
result多一個屬性type,總共有14種,看這裡
常用的有兩種,和一種servlet已經知道的
.dispatcher:伺器器端跳轉,預設
.redirect:客戶端跳轉,不常用
.redirectAction:跳轉到下一個Action
所以我現在設的是成功就是伺服器端跳轉,失敗就客戶端跳轉
試的結果為伺服器端會變action,用戶端是jsp
其他的我都沒試過

沒有留言:

張貼留言