簡體   English   中英

在 Struts 2 中使用 ModelDriven

[英]Using ModelDriven in Struts 2

我正在使用 Hibernate、Struts 2 和 Spring 開發一個項目,但我的問題出在 Struts 上。

我創建了 3 個擴展ActionSupport類,並且正在為所有這些類中的同一個類實現ModelDriven 我已經實現了一些在調用操作時要執行的方法。

類的結構就像

Class1Action.java:

public class Class1Action extends ActionSupport implements ModelDriven<ModelDrivenClass> {

     private ModelDrivenClass modelDrivenClass;


     // getter and setter for modelDrivenClass

     public String methodName() {

     System.out.println("Entrou!");

        return SUCCESS;

    }

    @Override
    public Sensor getModel() {
        return getSensor();
    }

}

struts.xml我使用下一個結構創建了 3 個動作

struts.xml:

<action name="actionName1" method="methodName" class="Class1Action">
   <interceptor-ref name="validation">
      <param name="excludeMethods">methodName</param>
   </interceptor-ref>
   <result name="success" >success.jsp</result>
   <result name="input" >input.jsp</result>
</action>

除此之外,我有一個 JSP,其中有 3 個按鈕代表不同的 Struts 動作,還有幾個字段代表來自 3 個動作類中使用的模型驅動類的字段,以及<s:push>標簽內的所有字段。

問題是當我填充字段時,在單擊任何按鈕后,字段中的數據丟失。

我試圖刪除從驗證中排除方法的 3 條 Struts 行,但字段不是空的,第二次我按下了同一個按鈕,他返回一個輸入並重定向到 input.jsp。

下一個代碼來自success.jsp ,即起始頁面:

成功.jsp:

<form method="post" >
    
    
    <s:push value="modelDrivenClass">

        <s:textfield label="FieldLabel1" name="modelDrivenClassAttribute1" />
        <s:textfield label="FieldLabel2" name="modelDrivenClassAttribute2" />
        <s:textfield label="FieldLabel3" name="modelDrivenClassAttribute3" />
        <s:textfield label="FieldLabel4" name="modelDrivenClassAttribute4" />
        <s:textfield label="FieldLabel5" name="modelDrivenClassAttribute5" />
            
    </s:push>
    
    
<s:submit action="actionName1" name="Submit1" value="Submit1" />
<s:submit action="actionName2" name="Submit2" value="Submit2" />
<s:submit action="actionName3" name="Submit3" value="Submit3" />
</form>

我不知道這是否是正確的方法,但是當我只使用一個實現ModelDriven類並且這個類具有所有 3 個方法時,我使它工作。

我只是嘗試這種方式,因為我想讓我的代碼清晰,並且不要只在一個類中包含所有方法。

如果您要將舊的 Struts 代碼遷移到新的代碼,則使用ModelDriven操作類的方法非常有用,因此它簡化了FormBean的概念。

並且在較新的 Struts 2 中沒有必要使用ModelDriven如果您可以使用valueStack top的 action bean 和僅在其名稱前綴內關聯的模型。

注意:當在動作配置中覆蓋攔截器配置時, defaultStack消失了。 因此,最好創建自己的堆棧或至少引用basicStack以確保調用必要的攔截器。 在你的情況下是一個modelDriven攔截器

如果您在堆棧上使用此攔截器,它會將模型推送到操作前面,因此您無需在結果中s:push它。

模型對象應該被初始化為模型類的實例並由模型的getter返回。 在驗證模型的字段時,還可以考慮使用訪問者驗證器。

在調用之間共享數據的三個操作需要使用Preparable准備模型以填充session的字段或使用會話對象引用為字段提供默認值以保存它們。

注意:使用prepare需要在填充模型之前更改攔截器調用的順序以推送模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM