2013-11-22 64 views
2

我想了解別人的其他Struts 2代碼,並且我遇到了數據傳遞問題。Struts 2將數據從JSP傳遞到動作類

我知道,在JSP頁面上,如果使用<s:textfield name="something" ... />標記,struts2會嘗試在動作類中自動調用setSomething(...)

我現在看到的這種類型的代碼:

<s:textfield name="item.name" ... /> 

,我想知道,這如何.(點)的工作?我在我的動作類中有一個名爲setItem()的方法,並且在該方法中設置的對象有一個setName()方法,但顯然這不起作用。項目和名稱之間的點是什麼意思,以及如何正確使用它來實例化項目設置它的名稱?

PS:在我的動作類中設置在setItem()中的項目對象具有空的args構造函數。

回答

1

問題解決了。 getItem()實際上包含以下代碼:

public Item getItem() 
{ 
    System.out.println("Trying to get item: " + item.toString()); 
    return item; 
} 

而這給了一個空指針異常,因爲item爲null。只有這個nullpointerexception沒有被struts框架所吸引!代碼只是繼續(並且當然失敗了......)。當我刪除sysout語句時,代碼工作。

2

在OGNL .點符號

item.name意味着getItem().setName();
item.subitem.name意味着getItem().getSubitem.setName();

一個問題可能是缺少空參數的構造,as described here,但你說這是不是你的情況;那麼我敢打賭「Item失蹤的獲得者」。如果不是,請發佈更多相關的代碼。

1

確保有公共方法getItem().setName()

也許方法不可用或不公開或一個錯字,例如getItem()時,而不是getItem()時。

你的行動應該在name屬性"item.name"像OGNL表達setItem(Item item)

1

Struts2的治療價值。但是,如果未設置,它不會將評估結果替換爲name屬性,而會替換爲value屬性。然後,如果您提交表單,則從name屬性創建參數並通過HTTP請求發送。 Struts2使用了params攔截器來解析參數名稱。它處理諸如OGNL表達式之類的名稱,並在訪問對象和設置值時調用適當的方法getset。 OGNL表達式中的點代表屬性解析器。在你的情況下,你應該有getItem()方法來設置值,這個項目應該不返回null值。那裏不使用setItem()。可能你會問爲什麼它沒有被使用,但它可能是另一個問題。

相關問題