2

trip.xhtml次のコードを使用してURLからパラメーターを取得するというページがあります。

<f:metadata>
    <f:viewParam name="tripid" value="#{tripBean.tripId}" />
    <f:viewParam name="seats" value="#{tripBean.seats}" />
    <f:event type="preRenderView" listener="#{tripBean.processParams}" />
</f:metadata>

このTripBeanように見えます(簡略化):

@ManagedBean
@RequestScoped
public class TripBean implements Serializable {

    private static final long serialVersionUID = -4885781058258859229L;

    private Long tripId;
    private int seats;

    // Getters and setters for tripId and seats

trip.xhtmlページの下部に私は:を持っていh:linkます

<h:link outcome="/customer/booking.xhtml" value="Book this trip"
    includeViewParams="true" />

私が期待しているのは、このリンクをクリックしたときに取得するURLはのようなものだということです"/customer/booking.jsf?tripid=2&seats=1"booking.xhtmlこれは、次のコードをページに配置した場合にのみ当てはまります。

<f:metadata>
    <f:viewParam name="tripid" value="#{tripBean.tripId}" />
    <f:viewParam name="seats" value="#{tripBean.seats}" />
</f:metadata>

私が実際に欲しいのは別のBeanを使用することですが。コードを次のように変更します。

<f:metadata>
    <f:viewParam name="tripid" value="#{bookingBean.tripId}" />
    <f:viewParam name="seats" value="#{bookingBean.seats}" />
</f:metadata>

BookingBeanも2つのプロパティがtripIdあり、seatsこれらはと同じですがTripBean、リンクをクリックしようとすると、0に設定されているseats-parameterのみが表示されます。("/customer/booking.jsf?seats=0"

別のBeanを使用してそれらを格納しようとしているときに、viewparamsを他のページに渡せないように見える理由を誰かが知っていますか?そして、それを別のBeanに格納することが不可能な場合、それらの値をどのように入れることができますTripBeanBookingBean

私が使用した簡単な回避策:を使用せずincludeViewParams="true"、手動でリンクにパラメーターを追加する(以下を参照)と、問題が「修正」されます。なぜそれがうまくいかないのか疑問に思っていますがincludeViewParams

<h:link outcome="/customer/booking.xhtml" value="#{msg['page.trip.booking']}">
    <f:param name="tripid" value="#{tripBean.tripId}" />
    <f:param name="seats" value="#{tripBean.seats}" />
</h:link>
4

2 に答える 2

2

f:viewParamとまったく同じように動作しh:inputTextます。これは、ソース (レンダリング時) とターゲット (モデルの更新時) として同じ式を使用することを意味します。あなたが持っていた場合:

<h:inputText value="#{a.test}" />

inputText「から読み書きb.fooを行う方法」を尋ねることは決してありa.testませんが、誰もが からそのような動作を期待しているようf:viewParamです。

とにかく、簡単な答えがあります。リンクに任意の値を追加するには、次を使用するだけですf:param

<h:link outcome="/customer/booking.xhtml" value="Book this trip" >
    <f:param name="tripid" value="#{bookingBean.tripId}" />
    <f:param name="seats" value="#{bookingBean.seats}" />
</h:link>
于 2011-08-25T10:38:09.390 に答える
1

次のタグに対応するリンク コンテンツ:

<h:link outcome="/customer/booking.xhtml" value="Book this trip"
            includeViewParams="true" />

ビューのリクエストのレンダリング応答フェーズ中に生成されtrip.xhtmlます。URL にビュー パラメーター値を含める必要がある場合は、ビューへのアクセスに使用する URL にこれらの値を指定するか、レンダリング レスポンス フェーズが完了する前にモデルにこれらの値を設定する必要があります。これらのいずれも実行しない場合、生成されたハイパーリンクにはビュー パラメータのデフォルト値が含まれます。

簡単に言えば、次のことを行う必要があります。

  • ビューが必要なパラメーターでアクセスされることを確認してtrip.xhtmlください: trip.xhtml?tripid=x&seats=y、特にビューが常にパラメーターでアクセスされる場合。
  • または、JSF ランタイムによってリンクがレンダリングされる前に実行されるメソッドに値を設定する必要があります。クラスのコンストラクターBookingBeanまたはクラス@PostConstruct内の注釈付きメソッドは、値を設定するのに理想的な場所です。ビューでアクションが実行された場合に、マネージド Bean の他のメソッドで Bean の値をリセット/更新することもできます。JSF ランタイムはビュー パラメータの値を呼び出して、結果の URL に含めることgetTripIdに注意してください。したがって、これらのメソッドの動作も確認する必要があります。getSeatstripIdseats

bookingBeanの EL 式で指定できない理由についての質問は、タグの属性に ではなくのパラメーターが含まれるため、booking.xhtml予期しない値と思われる を指定する必要があります。簡単に言えば、JSF ランタイムはandではなくandを呼び出します。tripBeanincludeViewParamslinkto-viewfrom-viewbookingBean.getTripId()bookingBean.getSeats()tripBean.getTripId()tripBean.getSeats()

これは直感に反するように思えるかもしれませんが、JSF 仕様ではこのシナリオの扱いがまったく異なることを理解しておく必要があります。ユーザーが実行するほとんどの対話では、コンポーネントのアクション URL は、ユーザーがアクションを実行するまで生成されません。一方link、タグは URL のプリエンプティブ計算を必要とするため、JSF ランタイムはこれを「プリエンプティブ ナビゲーション」としてまったく異なる方法で処理します。URL が構成されているとき、URL が意味を持つためには、ターゲット ビューのビュー パラメーターに関連するオブジェクトにアクセスできる必要があります。URL の値が 0 である理由は、BookingBeanこの評価中に新しいインスタンスが作成され、代わりにデフォルト値が使用されるためです。を使用することで、これを明らかに回避できます。TripBean代わりに (そして includeViewParams のほとんどの例がこれを示しています)、またはBookingBeanオブジェクトの構築中に値を設定できます。

于 2011-08-25T10:28:21.527 に答える