2011-11-24 74 views
0

我已經使用Seam 2.2,JPA和JSF編寫了電子商務Web應用程序,當然,它包含產品搜索功能。爲了實現這個目標,我創建了一個名爲SearchForm的類,其中包含用於搜索的各種參數(開始索引,結果的最大數量,'和'術語'​​'或'術語等等)我也有一個web動作 - ProductSearchAction - 使用SearchForm對象從數據庫中提取條目。它看起來是這樣的:Seam&JSF - 誤解<h:inputHidden />?

@Name("searchForm") 
@AutoCreate 
@Scope(ScopeType.CONVERSATION) 
public class SearchForm { 

    private int startIndex = 0; 

    private int maxResults = 20; 

    ... 

} 


@Name("productSearchAction") 
@AutoCreate 
@Scope(ScopeType.CONVERSATION) 
public class ProductSearchAction { 

    @In 
    private SearchForm searchForm = null; 

    @Out 
    private List<Products> products = null; 

    ... 

    public void searchProducts() { 
     ... 
    } 

    ... 

} 

在我的JSF,我展示的<h:form />內封閉的產品列表中,有2個<h:commandLink />鏈接,通過結果進行分頁前進和後退。由於我沒有爲每個搜索創建對話,因此我試圖通過使用<h:inputHidden />隱藏字段將狀態傳遞到ProductSearchActionSearchForm對象。我有這樣的領域在我的網頁:

<h:form> 
    ... 

    <h:inputHidden value="#{searchForm.maxResults}" /> 
    <h:inputHidden value="#{searchForm.startIndex}" /> 
    <h:inputHidden value="#{searchForm.andTerms}" /> 

    ... 

    <h:commandLink action="next" value="Next" /> 
    <h:commandLink action="previous" value="Previous" /> 
</h:form> 

我的<h:inputHidden />理解是,它會填充內SearchForm適當的值,然後將提供給ProductSearchAction.searchProducts()。當我查看HTML源代碼時,我看到了在HTML中設置的隱藏參數。然而,當我點擊「下一步」或「上一步」,帶我到searchProducts()動作時,沒有設置任何值。

我誤解<h:inputHidden />的工作原理嗎?我需要做些什麼才能將這些值傳遞給我的搜索操作?有沒有更好的方法來實現我的目標?這是一個Seam範圍問題嗎?我真的很感謝你能給予的任何幫助。

+0

這聽起來像你的JSF和h的理解:inputHidden是正確的。要排除故障,請嘗試使用相同的值將h:outputText添加到頁面。另外,請嘗試h:outputText value =「#{searchForm}」來查看searchForm是否暴露在JSF視圖中 - 也許Seam/JSF佈線中存在錯誤。 – wrschneider

+0

當我執行查看源代碼時,我肯定會看到正在寫入的隱藏輸入值,所以我知道它們至少在HTML本身內。然而,當我點擊「下一個」或「前一個」帶我到searchProducts()的鏈接時,我在searchForm對象中看不到這些值。 – Shadowman

+0

請顯示您的導航配置/邏輯 - 「next」如何導致searchProducts() – Tair

回答

0

根據您的評論,這聽起來像您正在使用h:inputHidden,並且問題必須出現在JSF bean範圍內。

這些bean的行爲就好像它們是請求範圍一樣。當您觸發h:commandLink時,頁面會重新呈現並回傳隱藏的輸入,然後這些發佈的值在導航結果(「下一個」或「前導」)轉發到另一個頁面後不可用。

很可能@Scope(ScopeType.CONVERSATION)的行爲並不像您期望的那樣。我不是Seam的專家,但從文檔的快速掃描看來,Seam將每個HTTP請求視爲「對話」,除非另有說明。所以這可以解釋爲什麼當您點擊commandLink時重置值。您可能需要使用@ Begin/@ End註釋來劃定長時間運行的對話

http://seamframework.org/Community/ConversationExample