2011-10-04 84 views
1

我最近開始學習Java EE 6,可能需要一些幫助。我製作了一個包含表單,一些字段和一個命令按鈕的search.xhtml頁面。該操作調用託管bean中的方法並返回一個字符串。然而瀏覽器中的url字段不會更新到search-results.xhtml,這是帶有結果的其他頁面。它顯示了search.xhtml頁面內的內容(但它看起來像是從search-results.xhtml獲取佈局和所有內容)。不重定向到託管bean中指定的新頁面

(這是非常簡單的,沒有做多少在這個時候)

@ManagedBean 
@RequestScoped 
public class Search { 

private SearchBackingBean searchBackingBean; 
private ArrayList<String> list; 

public Search() { 
    searchBackingBean = new SearchBackingBean(); 
    list = new ArrayList<String>(); 
} 

public String find() { 
    return "search-results"; 
} 

search.xhtml

<h:form> 

    <h:inputText value="#{search.searchBackingBean.query}" 
       size="60" 
       required="true" 
       requiredMessage="Please enter what you want to search for." /> 
    <h:commandButton value="Find" action="#{search.find}" /><br /> 

    <h:outputText value="Search criterias to be included in your search." /><br /> 
</h:form> 

回答

2

基本上,你發送的非常相同的<form action> URL的POST請求您正在查看的初始頁面和後處理期間告訴JSF使用給定的目標頁面顯示結果。它在內部使用RequestDispatcher#forward()將請求/響應轉發給給定的目標。這完全發生在服務器端。如果您熟悉基本的Servlet API(JSF使用的基礎),那麼您應該瞭解它的工作原理。

如果你想在瀏覽器地址欄中的URL的變化,那麼你基本上需要更改<form action> URL到所需的URL(這是不可能的標準JSF沒有基於一些配置文件操縱ViewHandler),在POST後添加?faces-redirect=true以發送完全重定向。

return "search-results?faces-redirect=true"; 

重定向基本上指示瀏覽器發送給定的URL新的GET請求,所以在地址欄中的網址會改變。然而,缺點是所有請求範圍的bean都被垃圾清理並重新創建(因爲重定向是新的請求!),因此您將丟失搜索結果。

我不知道爲什麼希望有URL改變了,但如果你想讓它可收藏,那麼你不應該使用<h:form>(默認爲POST),而只是一個普通的HTML <form>(默認爲GET),並使用純HTML輸入和按鈕,並在目標頁面中將參數定義爲<f:viewParam>,以便JSF將它們設置在與目標頁面關聯的bean中。

E.g.在搜索表單:

<form action="search-results.xhtml"> 
    <input name="query" size="60" /> 
    <input type="submit" value="Find" /> 
</form> 

,並在結果頁面:

<f:metadata> 
    <f:viewParam name="query" value="#{search.query}" required="true" requiredMessage="Please enter what you want to search for." /> 
    <f:event type="preRenderView" listener="#{search.find}" /> 
<f:metadata> 

(順便說一句,我寧願他們在一個頁面組合,並呈現結果有條件地使用rendered屬性)

請注意,您的SearchBackingBean是IMO錯誤地命名。它不是一個支持bean。這只是一個實體(或POJO或DTO或任何你想要命名的)。你的Search類是真正的支持bean。

+0

@BalcusC:感謝您的回覆!我問的原因是我認爲它實際上應該改變瀏覽器中的網址。我不需要在瀏覽器中更改網址。我今天開始閱讀JSF部分,但我會牢記! – LuckyLuke

+0

不客氣。由於您是JSF的新手,您可能會發現這兩篇文章對於瞭解「最佳實踐」和「提示和技巧」很有幫助:[JSF 2.0教程](http://balusc.blogspot.com/2011/01 /jsf-20-tutorial-with-eclipse-and.html)和[JSF 2.0中的通信](http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html)。 – BalusC