2013-02-26 12 views
1

我有兩個頁面myaccount.xhtml和selectbank.xhtml 在我的帳戶頁面中有一個用於填充帳戶的選項,用戶將輸入金額當用戶按提交按鈕時,它將使用以下bean方法轉到選擇銀行頁面。jsf2.0 - 如何在請求範圍內獲取其他jsf頁面的bean中的值

public String gotoPayMethod() { 
    FacesMessage doneMessage=new FacesMessage("Redirecting to Payment Type Page"); 
    FacesContext.getCurrentInstance().addMessage(null, doneMessage); 
    return "SelectBank"; 
} 

當用戶將跳轉到selectbank有用戶必須提交付款方式,但在本頁面它顯示爲空這是在以前的頁面輸入的金額。 這兩個頁面都使用相同的bean,並且該bean的範圍是請求範圍。

那麼,如何通過URL GET方法訪問該值而不傳遞此值。 爲了我的滿意,我使用會話範圍,然後它工作,但我知道這不是正確的方式,因爲我開始使用每個頁面的會話範圍,那麼它將不會有效。 謝謝

回答

4

那麼,如果你的豆是RequestScoped比你沒有相同的豆這兩個頁面。這些bean是爲每個請求重新創建的,因此您應該傳遞參數。您gotoPayMethod()到的變化return語句:

return "SelectBank?faces-redirect=true&includeViewParams=true"; 

selectbank.xhtml地址:

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

適應給你的財產和bean名稱。

如果使用的參數是不是你可以在會話中添加這個參數,而從會議第二豆刪除它,當您檢索它的解決方案:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("amount", amount); 
((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getSession().removeAttribute("amount"); 

去除屬性第二個建設是必要的,因爲MapgetSessionMap()返回是不可變的。

+0

URL在銀行應用程序是有風險的GET,而不是一個很好的做法。應該避免,其實絕不應該用我的看法。 – 2013-02-26 10:22:38

1

您的用例不是簡單的請求/響應循環,其生命週期不止一個請求響應,這使得它成爲會話範圍的候選者。

在URL中使用隱藏變量或GET參數並不是很好的做法,特別是對於銀行應用程序。在安全性如此重要的地方,不要在小記憶印記上妥協。

如果閃光示波器映射簡化了您可以使用它的情況,但我不會去做這樣的事情。

更新:忘了提及你也可以檢查對話範圍。

+0

我從來沒有聽說過會話範圍,但現在我知道如何使用它,謝謝現在我有三種不同的選擇,我可以根據自己的需要使用它.., – chinmay91 2013-02-26 14:26:00

3

您可以使用#{flash}對象將數據保留到下一個視圖。這樣你就不需要處理視圖參數。從myaccount.xhtml

詳情:

<h:form> 
    <h:outputText value="Enter amount: " /> 
    <h:inputText value="#{flash.amount}" /> 
    <br/> 
    <h:commandButton value="Go to payment method" action="#{bean.gotoPayMethod}" /> 
<h:form> 

兩種觀點Bean:從selectbank.xhtml

@ManagedBean 
@RequestScoped 
public class Bean { 

    @ManagedProperty("#{flash}") 
    private Flash flash; 

    private int amount = -1; 

    public Bean() { } 

    public String getAmount() { 
     if(amount == -1) { 
      int val = Integer.parseInt((String)flash.get("amount")); 
      flash.keep("amount"); 
      amount = val; 
     } 
     return amount; 
    } 

    public Flash getFlash() { 
     return flash; 
    } 

    public void setFlash(Flash flash) { 
     this.flash = flash; 
    } 

    public String gotoPayMethod() { 
     //do business job 
     return "SelectBank?faces-redirect=true"; 
    } 

} 

詳情:

<h:outputText value="Amount entered by user is #{bean.amount}" />