2014-10-09 20 views
2

我有兩個類一個是行動類MyAction和其他是POJO類User。在MyAction裏面,我做了User類的getter-setter。如何在表單輸入字段中使用Struts 2推標籤?

然後我有index.jsp頁面供用戶輸入。在此,我使用struts 2 push標記來存儲User類中的屬性。它看起來是這樣的:

<s:form action="go" method="post"> 
    <s:push value="user"> 
     <s:textfield name="id" label="usr-id"/>    <!-- user.id --> 
     <s:textfield name="fname" label="first-name"/>  <!-- user.fname --> 
    </s:push> 
    <s:submit/> 
    <s:token/> 
</s:form> 

但我得到一個錯誤。如果我刪除推標籤並以user作爲User屬性的前綴,那麼它運行良好。任何人都可以引導我,我錯了,以及如何在表單中使用push標記輸入字段。

+0

您的幫助在這裏:http://www.mkyong.com/struts2/struts-2-push-tag-example/ – Imran 2014-10-09 07:23:52

+0

謝謝@Imran。所以根據mkyong的說法,我們必須先創建'bean',然後將這個bean引用到'push'的值。你的(mkyong)解決方案很好,但是沒有直接的方法嗎?假設,我有一個很長的OGNL表達式,比如'user.address.city' ...如何實現這個。我知道我聽起來很生氣,但是能否幫助我在長鏈標籤中使用OGNL。 – JPG 2014-10-09 07:40:13

+0

抱歉打斷你@伊姆蘭,但是謝謝。我清除了我的困惑。祝你今天愉快! – JPG 2014-10-09 07:48:09

回答

0

推並不是一個UI標籤。 Push用於將對象放入值棧頂部。如果你的對象不在棧頂,你可以使用object.attributname來獲得你的值。如果你的對象在值棧中,你可以直接訪問它attributename

1

無論您使用<s:push><s:set/><s:iterator>varIteratorStatus屬性...:

  • 顯示值,任何方式是一個很好的方式;
  • 發送的值,則僅方式被指定完整的「路徑」,在name屬性。

例如,你可以使用value屬性推對象,但要提交時,它的工作,你仍然需要把user的name屬性:

<s:push value="user"> 
    <s:textfield name="user.id" value="id"  />  <!-- user.id --> 
    <s:textfield name="user.fname" value="fname"/>  <!-- user.fname --> 
</s:push> 

這使得使用<s:push>在你的情況下完全沒用。

但是在源和目的地不同的用例中,你從了ActionSource閱讀user.fname,並將其值發送到ActionDestination在selectedFname字符串中,JSP將

<s:push value="user"> 
    <s:textfield name="selectedId" value="id" />  <!-- user.id --> 
    <s:textfield name="selectedFname" value="fname"/>  <!-- user.fname --> 
</s:push> 

所以會做「有用的東西」

但基於我的經驗,你幾乎不會使用推送。如果你需要它,你的數據結構可能太複雜了。

+0

謝謝@Andrea。我想問一下,我可以使用'push'標籤和'bean'標籤。就像首先用'var'屬性爲'User'類創建一個bean,然後將其引用到'push'值。這裏是我得到這個邏輯的鏈接:http://www.mkyong.com/struts2/struts-2-push-tag-example/ – JPG 2014-10-09 09:08:00

+1

我幾乎從不使用(並且,在你問之前, )標籤。這本身並不是一個壞習慣,我只是認爲它是思考方式的一種舊方式。我多年前就用過它們,我再也不需要了。 – 2014-10-09 09:10:02

+2

@JSK我看到了未來:[*和,在你問之前, *](http://stackoverflow.com/q/26291223/1654265):D PS:如果你發現答案有用,請考慮對它進行投票。 – 2014-10-10 08:24:42

1

您的代碼看起來像確定,但要從文本字段發送值,需要將user對象再次推入堆棧。在攔截器填充動作之前,最好用一些攔截器來做。同樣的事情正在做model-driven interceptor

模型驅動攔截手錶ModelDriven行動,並增加值堆的top作用的模型。

注:如果你想要的參數被應用到模型的ModelDrivenInterceptor必須拿出兩個StaticParametersInterceptorParametersInterceptor之前。

注:ModelDrivenInterceptor只會推模型入堆棧時,該模型是不null,否則將被忽略。

您可以使用模型驅動的方法,它推動視圖和控制器的模型。代碼中缺少最後一個。

The example of using ModelDriven approach

+0

謝謝@roman在某種程度上清除我的疑惑。是的,我使用過'ModelDrivenInterceptor'。這裏我只是想了解'push'標籤是如何工作的。爲了通過'push'內的'properties'標籤接收數據,沒有問題。但是,當我嘗試使用相同的'push'標籤發送數據時出現錯誤。所以,根據你的理解是:當我按下提交按鈕時,'param'攔截器在這裏觸發,並且它(param)再次重新初始化值棧。從而忽略推送的對象。我錯了還是對嗎? – JPG 2014-10-09 11:09:31

+1

推送的對象從標籤末尾的堆棧彈出,讓您不快。同時提交表單需要一個新的請求到服務器,以及新的動作上下文和值棧。 – 2014-10-09 11:19:04

+0

噢,它從''的堆棧中彈出。隨着你的神奇評論,現在毫無疑問,我現在很開心。謝謝。 :)另外,你能否稍微解釋一下,爲什麼'push'標籤神祕地開始工作時,結合s:bean'標籤。像這裏http://www.mkyong.com/struts2/struts-2-push-tag-example/ – JPG 2014-10-09 11:32:08

相關問題