1

myaccount.xhtmlとselectbank.xhtmlの2つのページがあります。アカウントページには、ユーザーが送信ボタンを押したときに金額を入力し、次のBeanメソッドを使用して選択銀行ページに移動するリチャージアカウントのオプションが1つあります。

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

ユーザーがselectbankに移動する場合、ユーザーは支払い方法を送信する必要がありますが、このページでは、前のページで入力した金額がnullとして表示されます。両方のページが同じBeanを使用しており、Beanのスコープはリクエストスコープです。

では、URLGETメソッドを介してこの値を渡さずにその値にアクセスするにはどうすればよいですか。満足のいくように、セッションスコープを使用しましたが、それは機能していましたが、各ページにセッションスコープを使用し始めると、効率が悪くなるため、適切な方法ではないことがわかります。ありがとう

4

3 に答える 3

4

ええと、もしあなたの豆がRequestScopedあなたよりもそうであるなら、あなたは両方のページに同じ豆を持っていません。これらのBeanはリクエストごとに再作成されるため、パラメーターを渡す必要があります。のreturnステートメントを次のように変更しますgotoPayMethod()

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

selectbank.xhtml追加:

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

これをプロパティとBean名に適合させます。

パラメータの使用が解決策ではない場合は、このパラメータをセッションに追加し、取得時に2番目のBeanのセッションから削除できます。

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

Mapから返されるのgetSessionMap()は不変であるため、属性を削除するための2番目の構造が必要です。

于 2013-02-26T10:20:43.913 に答える
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両方のビューの:

@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";
    }

}

からの詳細selectbank.xhtml

<h:outputText value="Amount entered by user is #{bean.amount}" />
于 2013-02-26T10:38:42.847 に答える
1

ユースケースは単純な要求/応答サイクルではなく、寿命は複数の要求応答であるため、セッションスコープの候補になります。

URLで非表示の変数またはGETパラメータを使用することは、特に銀行のアプリケーションでは適切な方法ではありません。セキュリティが非常に重要な場合は、小さなメモリフットプリントで妥協しないでください。

フラッシュスコープマップがケースを単純化するなら、あなたはそれを使うことができます、しかし私はそのようなことには行きません。

更新:会話スコープも確認できることを忘れてしまいました。

于 2013-02-26T10:24:42.707 に答える