2012-07-02 56 views
0

下面是來自bean tag docs的例子:s:bean標籤如何在struts 2中工作?

<s:bean name="org.apache.struts2.example.counter.SimpleCounter" var="counter"> 
    <s:param name="foo" value="BAR" /> 
    The value of foot is : <s:property value="foo"/>, when inside the bean tag <br /> 
</s:bean> 

那麼這裏的解釋是:

此示例實例化一個名爲SimpleCounter豆並設置foo屬性(setFoo('BAR'))。然後將SimpleCounter對象推送到值棧上,這意味着我們可以使用屬性標記調用其訪問器方法(getFoo())並獲取它們的值。

在上面的例子中,id已經被設置爲計數器的值。這意味着SimpleCounter類將被放入堆棧的上下文中。

<s:property value="#counter" /> 

我的問題是,如果我提到屬性VAR在bean標籤,將SimpleCounter放在值棧或堆的上下文:您可以使用Struts標籤訪問SimpleCounter類? (我正在將堆棧上下文作爲操作上下文的權利?)

如果在值堆棧上,那麼我們如何引用計數器變量#,因爲#用於引用來自操作上下文的值而不是值堆棧。對?

回答

0

錯了。

「應用程序上下文」純粹是一個servlet規範工件,並且與OGNL #字符沒有直接關係。 OGNL的#允許我們訪問指定的值棧值,而不是走棧值直到找到合適的值。

說「ID已被設置爲值counter」也是不準確的。 counter是值棧中的命名值。我認爲價值堆棧是上下文和堆棧的組合 - 有一個堆棧,但也有名稱值不在堆棧上,例如#attr

我也不認爲將它稱爲「動作上下文」是不準確的,因爲它在Struts 2應用程序的上下文中具有特定的含義,並且實際上只對事物的Java源端有意義。

這很簡單的「價值堆棧」,其中包括一個堆棧和命名值。

+0

嗨戴夫抱歉,我的意思是行動上下文,而不是應用程序上下文。更正了我原來的帖子。你說過「OGNL的#允許我們訪問命名的值棧值」如果這是正確的,我也看到#session.user.name其中會話不在價值堆棧,但在行動上下文。同樣在#attr中,attr位於動作上下文中。根據上述研究結果,外觀#用於查找動作上下文,如果我們沒有提及#,它將查找值棧。整個混淆是在語句「這意味着SimpleCounter類將被放置到堆棧的上下文中」字段堆棧的上下文的bcoz –

+0

@MSach否,'#session'是放入值堆棧上下文中的命名值。堆棧值*來自*的地方不相關。 '#'是用來引用值棧的上下文值,就像那句話所說的那樣 - 它和操作上下文不一樣。 OGNL存在於Struts 2之外。 –