3

私は現在JSF2.0に深く関わっていて、あるビューから別のビューへのマネージドBeanプロパティの「トランスポート」について少し理解が不足しています。少し調べてみましたが、良い例が見つからなかったので、チュートリアルを教えてもらえたり、少し説明してもらえたら本当にありがたいです。

これが私のシナリオです:

私は小さな遊び場カレンダーアプリケーションを開発しています。最初のビューselect.xhtmlには、ユーザーが特定の日付を選択できるカレンダーセレクターが含まれています。

<html>
  ...
  <h:form>

    <!-- Calendar selector from primefaces -->
    <p:calendar value="#{calendarSelect.date}" mode="inline" navigator="true" />

    <p:commandButton value="Show entries for date" action="day" />
    ...

対応するバッキングBeanは次のようになります。

@ManagedBean(name="calendarSelect")
@RequestScoped
public class CalendarSelectComponent {

  private Date date = null;

  ... // Getters and setters

からフォームを送信すると、select.xhtmlに転送されますday.xhtml

<html>
  ...
  <h:form>

    The current day ist:
    <h:outputText value="#{calendarEdit.date}">
      <f:convertDateTime pattern="dd.MM.yyyy" />
    </h:outputText>

バッキングBeanは次のようになります。

@ManagedBean(name="calendarEdit")
@ViewScoped
public class CalendarEditComponent implements Serializable {

  private Date date = null;
  private CalendarEntryBean currentEntry = null;
  private List<CalendarEntryBean> allEntries = null;

  ....

私は今問題を解決しようとしています:セレクターからエディターdateにパラメーターを転送するにはどうすればよいですか?

私はいくつかのオプションを試しましたが、そのうちの1つは次のとおりです。

<p:commandButton value="Show entries for date" action="day" />
  <f:setPropertyActionListener target="#{calendarEdit.date}" value="#{calendarSelect.date}" />
</p:commandButton>

デバッガーは、実際、のdateプロパティにcalendarEditからの値が入力されていることを示していますcalendarSelectが、day.xhtmlは新しいビューであるためCalendarEditComponent、ビューのセレクターからの日付を入力したものではなく、新しいバッキングBeanが作成されていselectます。

私は、1つの解決策は、SessionScopedすべての値を保持するバッキングBeanを作成することであることを読みました。しかし、これは私が想定している方法ではありません。セッション内の情報は実際には必要ないため、AからBに「移動」したいだけです。セッションベースのアプローチのもう1つの欠点は、次のことができることです。セッションごとに1つのセレクターと1つのエディターのみを使用します。これは、マルチウィンドウブラウジングなどを考える場合は受け入れられないと思います。

私は本当にそのようなシナリオに遭遇した最初の人ではないと思います。JSFがこれに対してエレガントなソリューションを提供すると確信していますが、そのソリューションを見つけることができませんでした。

繰り返しになりますが、誰かがこれにアプローチする方法を知っているなら、私は聞いています!;-)

4

1 に答える 1

2

<f:setPropertyActionListener>、フォーム送信の呼び出しアクションフェーズ中に実行されます。したがって、その時点で値がまだ存在していることを期待しています。ただし、選択したBeanはリクエストスコープであるため、フォームの送信中には存在しなくなります。代わりに、レンダリング応答中に出力にインライン化される要求パラメーターを渡す必要があります。これは。で行うことができます<f:param>

<p:commandButton value="Show entries for date" action="day" />
  <f:param name="date" value="#{calendarSelect.dateAsString}" />
</p:commandButton>

これはリクエストパラメータとして利用できます(HTTPの性質上、文字列のみを理解することに注意してください)。JSFにリクエストパラメータを管理プロパティとして設定させることもできますが、編集Beanはビュースコープであるため、これは。では不可能@ManagedPropertyです。あなたはそれを自分で集める必要がありますExternalContext

String dateAsString = externalContext.getRequestParameterMap().get("date");

確かに、それは不器用です。これには同じBeanとビューを使用し、rendered属性によってフォームの選択/編集の表示を切り替えます。結局のところ、編集ビューは単純なGETで直接開くこともブックマークすることもできませんね。;)

于 2011-02-18T12:19:03.457 に答える