首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts 2 進階:命名空間、模型驅動與表單重複提交防禦全解析

     編輯:Java 相關知識

一、Package 命名空間

在 struts.xml 中,package 元素的 namespace 屬性用於區隔不同模組的 Action 路徑,避免衝突。

<package name="mengya" extends="struts-default" namespace="/mymengya">
  <action name="register" class="com.mengya.action.RegisterAction">
    <result name="success">/show.jsp</result>
    <result name="input">/index.jsp</result>
    <result name="invalid.token">/index.jsp</result>
    <interceptor-ref name="token"/>
    <interceptor-ref name="defaultStack"/>
  </action>
</package>
  • namespace="/mymengya" 必須以 / 開頭。
  • JSP 表單提交時,action 屬性需包含完整路徑:/mymengya/register.action。

二、模型驅動

實作 com.opensymphony.xwork2.ModelDriven 介面,讓 Action 直接暴露領域模型屬性,JSP 可直接用屬性名綁定,無需 model.property 前綴。

1. 模型 Bean

public class RegisterBean {
    private String username;
    private String password;
    // getter/setter 略
}

2. Action 實作

public class RegisterAction extends ActionSupport implements ModelDriven<RegisterBean> {
    private RegisterBean loginBean = new RegisterBean(); // 必須實例化

    @Override
    public RegisterBean getModel() {
        return loginBean;
    }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}

3. JSP 綁定

<s:form action="/mymengya/register.action" method="post" theme="simple">
  <s:textfield name="username" /> <s:fielderror name="username" />
  <s:password name="password" /> <s:fielderror name="password" />
  <s:submit value="註冊" />
</s:form>

表單欄位 name 直接對應 RegisterBean 的屬性名。

三、表單重複提交防禦

Struts 2 內建 token 攔截器實現「同步器令牌模式」。

1. JSP 放置令牌

<s:form action="/mymengya/register.action" method="post" theme="simple">
  <s:token name="register" /> <!-- 生成隱藏欄位 token=register -->
  ...
</s:form>

2. Action 配置攔截器

<action name="register" class="com.mengya.action.RegisterAction">
  <interceptor-ref name="token"/>
  <interceptor-ref name="defaultStack"/>
  <result name="invalid.token">/index.jsp</result>
  ...
</action>

3. 運作原理

  1. 首次載入頁面:<s:token> 生成唯一令牌,同時存入 Session 與表單隱藏欄位。
  2. 首次提交:Token 攔截器比對 Session 與表單令牌,一致則通過,並清空 Session 令牌。
  3. 重複提交:Session 已無令牌,比對失敗,返回 invalid.token 結果。

4. 自訂錯誤訊息

在 Struts 2 國際化資源檔(如 struts.properties 或 global.properties)加入:

struts.messages.invalid.token = 表單不允許重複提交

總結

  • 命名空間讓大型專案 Action 路徑清晰可控。
  • 模型驅動減少 Action 中 getter/setter 樣板碼,JSP 綁定更直觀。
  • Token 機制是防禦重複提交的標準方案,配合 defaultStack 使用需注意攔截器順序(token 在 defaultStack 之前)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved