2012-01-31 49 views
3

我想了解Struts2中的路徑數據,數據如何放在ValueStack上?如何找出ValueStack中當前存在哪個對象?我可以從不同的範圍應用程序,會話,請求,頁面訪問哪些其他數據?如何決定我的變量應該有的範圍?數據如何在Struts2中傳播?

回答

3

這是很多問題。

值棧只是一個數據結構,一種映射和堆棧的組合。命名對象(通過OGNL中的#標記訪問)位於映射中(例如請求範圍),要在屬性/方法中搜索的對象位於堆棧中。

<s:debug>標記是查找值棧中內容的最簡單方法。您也可以使用JSP中的「裸」數組表示法來訪問堆棧中的任意對象,例如"[0]"是最上面的對象,"[1]"是下一個,等等。這在現實生活中幾乎從來都不是好主意。

您可以訪問每個範圍中的任何內容。

您自己的對象應該通過動作本身放在值堆棧上,或者如果您通過模型實現了ModelDriven。除此之外,它與任何其他Java EE應用程序相同 - 在客戶端會話期間所需的對象應在會話範圍內,在應用程序中共享的對象應在應用程序範圍內等。

值堆棧本身在請求範圍內。

+0

我們可以驗證ValueStack上的字符串值是否轉換並填充到變量之前? – batbaatar 2012-02-01 06:29:55

+1

@batbaatar在轉換之前進行驗證沒有任何意義,但S2爲表單數據提供了驗證機制。不知道什麼時候你需要驗證。 – 2012-02-01 12:05:09

1

我將特別討論「數據傳輸如何」元素以及ValueStack的堆棧性。關於哪些數據可用,哪些可以隨着上下文而改變;具有「堆棧」的整點是支持範圍內數據的上下文更改。此外,堆棧中的具體數據更好地被參考資料所覆蓋,例如struts網站上的資料。

Struts 2有一個非常乾淨的架構。它將軟件的問題分解成不同的組件非常出色。其中一個主要的標誌是行動是一個POJO。作爲pojo,行動的主要職責是承載數據。它是主要的數據傳輸對象;它的屬性接收傳入的請求數據,只要命名所有的行。移動數據和考慮何時移動數據的任務被捕獲在另一個組件中:攔截器。

數據在ValueStack上的移動幾乎完全由攔截器完成。框架在處理請求時所做的第一件事之一是將新創建的操作對象置於值堆棧的頂部。這支持OGNL訪問您的動作屬性。然後,攔截器將數據移動到valuestack上,並且由於您的操作在那裏,它的屬性將會在匹配的setter上接收數據。其他攔截器也會以類似的方式將東西移動到值棧上,例如驗證攔截器;如果他們發現錯誤,則該錯誤消息也會進入堆棧。

除了作爲集中式數據容器之外,ValueStack當然是一個堆棧。當您考慮諸如迭代器標記之類的東西時,這種堆棧性會讓堆棧頂部的屬性隱藏堆棧中較低層的屬性。例如,如果您遍歷一組用戶,則每個用戶都會進入堆棧的頂部,並在迭代的主體中保留在那裏。這允許您的OGNL屬性引用依次擊中每個單獨用戶的屬性。更重要的是,如果其他具有類似命名屬性的其他內容在堆棧中進一步找到,它將被頂部的用戶對象隱藏。請注意,考慮到這一點,使用push標籤可以將任何你喜歡的對象推入堆棧,當你需要強制自己的上下文時提供很好的靈活性。