2012-08-01 51 views
1


我正在開發一個使用hibernate,struts2和spring的項目,但我的問題是使用struts。
我已經創建了3個擴展ActionSupport的類,並且正在爲它們中的同一個類實現modeldriven。在調用動作時,我已經實現了一些要執行的方法。
針對類別的結構等(Class1Action.java):模型驅動支桿2

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中我已創建使用下一個結構(struts.xml中)3動作:

<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,即起始頁:

<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種方法。我只是想這樣,因爲我想讓我的代碼清晰,並沒有在一個類中的所有方法。

回答

1

如果您將舊的Struts代碼遷移到新的Struts代碼,那麼使用模型驅動的動作類的方法非常有用,因此它簡化了表單bean的概念。而在較新的Struts 2中,如果您可以使用top中的值棧和模型相關聯的動作bean,則它不需要使用ModelDriven

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

如果你在堆棧上使用這個攔截器,它會在動作前面推動模型,所以你不需要在結果中使用s:push

模型對象應該初始化爲模型類的實例,並由模型的吸氣器返回。同時考慮在模型的驗證字段中使用訪問驗證器。

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

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