2011-09-21 57 views
2

有誰知道在使用Struts2時如何輕鬆訪問JSP中的Action類?雖然我知道通常可以使用Struts標籤和OGNL,但實際上我發現它們都很混亂(顯然是由於無知),並且坦率地說,在JSP中維護Java更容易(更不用說更容易解釋新的程序員,因爲每個人都知道Java)。使用Struts2在JSP中訪問Action類

...我已經尋找一個解決方案多年,我已經找到了最好的解決方法是調用從類的靜態方法,看起來像:

public static BaseAction getCurrentAction(HttpServletRequest request) { 
    OgnlValueStack ognlStack = (OgnlValueStack)request.getAttribute(org.apache.struts2.ServletActionContext.STRUTS_VALUESTACK_KEY); 
    return (BaseAction)ognlStack.getRoot().get(0); 
} 

...這將是一個BaseAction類擴展你所擁有的Action類,所以,在你的JSP,你可以說:

<% 
    MyAction action = (MyAction)BaseAction.getCurrentAction(request); 
    String myValue = action.getMyValue(); 
%> 

然而這一切似乎過於複雜,它假定在OgnlValueStack以精確的順​​序 - 必須有一個更好的辦法,非?

非常感謝您的任何建議!

+1

$ {行動.myValue} –

+2

或'$ {myValue}'。我發現一個標籤,甚至OGNL,都難以理解,你會訴諸scriptlet。有沒有具體的事情會引起你的問題?如果是這樣,那麼解決這個問題可能會更有意義,而不是試圖找出方法來編寫非常可疑的代碼來完成開箱即用的事情。 –

+0

謝謝大家!很明顯,這是一個議論性的東西,但使用腳本感覺更簡單也更自然。 ...我會承認無知 - 例如。我仍然不明白何時使用#,$和%以及差異。事情是,我得到了Java,因爲它在其他任何地方都有使用,我傾向於將任何項目中使用的技術數量減到最少,以便讓事情更簡單。 – Alex

回答

3

如果您不想使用struts2標籤,同樣有效的方法是使用JSTL標籤。這些標籤由struts2支持,我猜測最主要的java web框架。

強烈建議您在使用任何Java Web Framework的典型業務編程中避免使用servlet/scriplets。

你可能已經知道這一點,但得到從動作的屬性只是說:

<s:property value="myProperty"/> 

或者使用JSTL(這裏有些甚至可以說更有效的觀點不再依賴於struts2的)同樣有效

<c:out value="${myProperty}" /> 

很少有程序員(和我會站在說不經驗豐富的程序員Struts2的),誰都會覺得這是難度比

<% 
    MyAction action = (MyAction)BaseAction.getCurrentAction(request); 
    String myValue = action.getMyValue(); 
%> 
理解

只有少數標籤需要生成一個頁面,你需要獲取屬性,迭代產生表/列表,這就是它。學習這些少數標籤的時間將節省大量的時間。

+0

感謝Quanternion!我對Struts標記的沮喪通常在我使用邏輯表達式時開始發生,然後它們不能按預期工作。根據我的經驗,這些東西實際上很難調試,而不是腳本 - 它們完全一樣。出於好奇,爲什麼建議您避免在JSP中使用scriptlet?似乎合理假設它僅用於演示目的。再次感謝。 – Alex

+1

作爲一個練習嘗試這個。僅使用html,struts2屬性標記和struts2迭代器標記(或等效的JSTL)構建接下來的幾頁。我所說的(以及大多數其他人)是讓Java保持行動。儘量遵守這些規則:只用jsp輸出,準備好你需要在動作中顯示的所有內容,這樣jsp就沒有什麼可做的了,不要在你的動作中做任何業務邏輯,把它委託給其他對象。謙虛行爲驗證輸入傳遞給業務對象,然後編組數據以供顯示。然後它關閉到視圖層。 – Quaternion

+0

我的意思是說「只能在jsp中輸出標籤」。 – Quaternion

2

要跟進Quaternion的答案,您可以按照他的建議從OGNL標記或JSTL訪問您的操作類中的任何公共方法。

您還可以通過標籤參數傳遞給Action類:

public String getHello(String value){ 
    return "Hello " + value + "!"; 
} 

這就是所謂的JSP:

<s:property value="getHello('Russell')"/> 

,輸出:

Hello Russell! 
+0

有趣的 - 我不知道你可以直接從這樣的標籤直接調用方法 - 我認爲你必須指定它們作爲一個屬性 - 所以在上面的例子中,你會說:'',這會吸引屬性'hello'的getter。 – Alex

+1

你必須考慮OGNL和JSTL的渲染方式。它們是服務器端腳本,就像JSP代碼一樣。當服務器讀取頁面時,它實質上是「即時編譯」並輸出結果。當標籤被解析時,它會調用底層的Java代碼並輸出結果。由於它是服務器端腳本,只要這些方法可公開訪問,就可以對基礎類進行任何操作。 –

+0

拉塞爾說的是值得注意的,也許查看如何構建自己的標籤將會移除所有的魔法。 – Quaternion

相關問題