[英]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.