2013-12-23 73 views
2

在我的應用我有JSF頁面的一些參數如何使用所有參數重定向到同一頁面?

(例如網頁的網址:/pages/user.xhtml?id=123&userToShowId=2

在這個頁面上,我有一個commandButton。點擊後,我想用所有參數重定向到同一頁面。我知道,這個指定的頁面,我可以手動執行此操作是這樣的:

public String redirect(){ 
    //extCtx - ExternalContext 
    //ctx - FacesContext 
    Map<String,String> param = extCtx.getRequestParameterMap(); 
    String currentURL = ctx.getViewRoot().getViewId(); 
    return currentURL+"?userToShowId="+param.get("userToShowId")+"&id="+param.get("id"); 
} 

但是做什麼,當我想要得到普遍的方式,以避免與任何參數的任何頁面重定向?


如果我只有在頁面視圖參數,而不將其設置爲一個bean屬性:

<f:metadata> 
    <f:viewParam name="backurl"/> 
    <f:viewParam name="id"/> 
</f:metadata> 

value

<f:metadata> 
    <f:viewParam name="backurl" value=#{bean.id}/> 
    <f:viewParam name="id" value=#{bean.id}/> 
</f:metadata> 

我可以用includeViewParams=true做我的工作?

+0

你的意思是你想在任何請求中盲目地包含視圖請求參數*你的web應用程序?你將需要一個自定義的導航處理程序爲 – kolossus

+0

我有commandButton在所有頁面更改語言。當我點擊這個按鈕時,我必須做一些支持bean代碼(改變lang)並返回到同一頁面。但是,當我點擊按鈕的頁面上有一些參數後,讓bean代碼我失去了每個參數。 – kuba44

+0

看看[this](http:// stackoverflow。COM /問題/ 20728072 /分頁上,JSF的使用,獲得參數)。 –

回答

1

您可以做到這一點,而無需將它們綁定到託管bean。在JSF中有兩種主要的導航情況:

  • 執行一個查看請求,而沒有做任何事情。這是一個HTTP GET請求,並使用h:button完成,它不需要被表單包裝,並且像鏈接一樣。
  • 執行表格POST然後再詢問其他頁面(REDIRECT-GET),這是通過h:commandButton完成的。

在兩種情況下都可以包含視圖參數。這就是它是如何做:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core"> 
<h:head /> 
<h:body> 
    <f:metadata> 
     <f:viewParam name="backurl" /> 
     <f:viewParam name="id" /> 
    </f:metadata> 
    <h:outputText value="backurl value is #{backurl} and id value is #{id}" /> 
    <br /> 
    <h:button outcome="index" value="redirect"> 
     <f:param name="backurl" value="directUrl" /> 
     <f:param name="id" value="directId" /> 
    </h:button> 
    <h:form> 
     <h:commandButton value="action" action="#{bean.redirect}" /> 
    </h:form> 
</h:body> 
</html> 
@ManagedBean 
@RequestScoped 
// You could also use @ViewScoped 
public class Bean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    /** 
    * Performs a redirection to index destination view with the given params 
    * 
    * @return 
    */ 
    public String redirect() { 
     return "index?backurl=actionUrl&id=actionId&faces-redirect=true"; 
    } 
} 

您將看到您最初加載頁面,既backurlid沒有價值。

第一個按鈕執行GET具有固定視圖參數值的請求。當再次加載視圖時,值已經存在。第二個按鈕的功能相同,但使用的是操作方法。

請記住,使用@RequestScoped@ViewScoped這裏有相同的效果,由於@RequestScoped不保持Bean的狀態和@ViewScoped從方法,它正在發生的事情,每次返回String值每次它摧毀我們調用它。

+0

但我不知道參數名稱,但我想重新加載頁面時可以做什麼? – kuba44

+0

我必須重定向到相同的頁面,沒有其他。換句話說,我想刷新頁面並且不會丟失參數值。 – kuba44

+0

只需用'#{backurl}'和'#{id}'替換'h:button'情況下發送的固定值即可。對於動作方法,你可以通過'#{bean.redirect(backurl,id)}'來改變無參數的'#{bean.redirect}',並在服務器端接收兩個'String'參數(如果'重新使用EL 2.2,這使得傳遞參數成爲可能)。然後,使用接收到的參數執行重定向。 –

相關問題