3

私は JSF2 と PrimeFaces を使用しており、このボタンで別のページに移動したいと考えています。

<p:column>
    <h:commandButton action="userCommand" value="list of commands" >
        <f:setPropertyActionListener value="#{car}" target="#{userController.u1}" />  
    </h:commandButton>
</p:column>

ターゲット ページで からの情報を使用していますuserController.u1が、<f:setPropertyActionListener>タグが実行されていないようです。

したがって、次の例外が発生します。

java.lang.NullPointerException

Arjan への返信で、詳細な回答をありがとうございましたが、これを行う別の方法があると思います。質問で行ったように新しい managedBean を使用する代わりに、既にインスタンス化されているもの (sessionScoped) を使用して呼び出しました。新しいコンストラクターで値を取得し、

この解決策をどのように見つけますか?新しい managedBean のコンストラクターから他の managedBean を呼び出すのを手伝ってもらえますか?

私はこれをテストしたので:

  ELContext elContext = context.getELContext();
    Application application = context.getApplication();
    String userid = (String) application.evaluateValueExpressionGet(context,
            "#{userBean.userid}", String.class);

しかし、「文脈」に問題があります。何か考えはありますか?

4

1 に答える 1

2

これが機能するかどうかは、対応するナビゲーション ルールuserCommandおよび/またはスコープをどのように設定するかによって異なりますuserController

アクション リスナーは、ナビゲーションが発生する前に Bean に値を設定します。ナビゲーションによってリダイレクトが発生する場合、Bean は、このリダイレクト後に使用できるスコープ内にある必要があります。スコープを追加しなければ、これはアプリケーション スコープとセッション スコープになります。

Bean がリクエスト スコープまたはビュー スコープにある場合、リダイレクトが行われる前に、リクエストに対応する Bean に値が設定されます。新しいページへの新しいリクエストがリダイレクトされると、新しいリクエスト スコープまたは新しいビュー スコープが開始されます。これは、あなたの価値が失われることを意味します。

アプリケーション スコープまたはセッション スコープを使用すると、理論的にはこれを修正できますが、アプリケーションに複数のユーザーがいる場合 (非常に可能性が高い)、または 1 人のユーザーが複数のウィンドウ/タブを開いている場合、大きな問題が発生します。

ナビゲーション ルールがリダイレクトを使用しない場合、実際には機能するはずです。ここでの問題は、「1 つの URL の背後にある問題」に悩まされることです。ブラウザのアドレス バーには、古いページが表示されたままになります。

実際にはアクションを実行しておらず、新しいページに移動したいだけなので、<h:button>or<h:link>を使用してそのページに直接リンクし、その車の If をパラメーターとして提供することをお勧めします。

これにより、GET リクエストが発行されます。これには、ブックマーク可能であるという追加の利点があります。Post-Redirect を行っていた場合は、最初のパフォーマンスも向上します。ターゲット ページでは、パラメーターを car インスタンスに戻す準備をする必要があります。<f:viewParam>これには、タグを使用できます。

リンクの例:

<p:column>
    <h:button outcome="userCommand" value="list of commands">
        <f:param name="car_id" value="#{car.id}"/>
    </h:Button>
</p:column>

ターゲット ページの例:

<f:metadata>
    <f:viewParam name="car_id" value="#{userController.u1}" converter="#{carConverter}" />    
</f:metadata>

この実際の例については、この例の CRUD アプリケーションのindex.xhtmluser_edit.xhtmlを参照してください。

于 2012-08-19T12:31:16.437 に答える