2

JSF 2prettyfacesを使用して Web アプリケーションを開発しています。Beanの 1 つに@ViewScopedかなりの注釈を付けました。それが私が持っているものです:

@ManagedBean
@ViewScoped
@URLMapping(parentId = "app-list", id = "app-view", pattern = "/detail/#{appId}",
    viewId = "/system/manage_app/content/app_detail/app_detail.xhtml")
public class NavegableAppView extends SystemNavegable {

/**

基本的に、システムにインストールされているアプリケーションの詳細が表示されます。#{appId}この Bean は、ロードするアプリケーションの ID を示す paramを渡す方法と、そのパラメーターを使用しない方法の 2 つの方法でインスタンス化できます。この場合、Bean は Bean からこの ID を回復し@SessionScopedます。

それが、ページ/system/manage_app/content/app_detail/app_detail.xhtmlがパラメーターを管理する方法です。

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
template="/templates/general_template.xhtml">

<ui:define name="metadata">
    <f:metadata>
        <f:viewParam id="appId" name="appId"
            value="#{navegableAppView._ParamApp}" required="false" />
        <f:event type="preRenderView"
            listener="#{navegableAppView.initialize}" />
    </f:metadata>
</ui:define>

<ui:define name="general_content">
    <p:panel>
<!--More stuff-->

ここでの問題はNavegableAppView、パラメーターの有無にかかわらず、Bean を作成することです。私はこの方法を試してみましたが、これは機能しますが、アクションメソッドを呼び出してナビゲーションケースを返すのと同等の結果だけ<p:button value="prueba" outcome="pretty:app-view" />に制限されます(それが本当に欲しいものです)。<p:commandButton value="prueba2" action="pretty:app-view" ajax="false" />

最初の選択肢は、Bean を適切に作成し、セッションから値をロードします。2番目のケースでは、このエラーが発生しています:

 HTTP 500 - PrettyFaces: Exception occurred while building URL 
 for MappingId < app-view >, Required value < #{appId} > was null

そのため、ターゲット Bean が構築されていません。パラメータをナビゲーション ケースに手動で追加しようとしましたが、return pretty:app-view?appId=1機能しますが、ターゲット Bean がセッション自体からそれを回復するようにします。アクションメソッドでリダイレクトなどを呼び出す必要がありますか?

アイデアをプールします。

4

1 に答える 1

2

したがって、実際には PrettyFaces の「エッジ」効果の 1 つに遭遇しています。定義した「appId」パラメーターは、実際にはパラメーター名と、リンクを構築するための EL Bean 値の場所の両方として扱われます。

@URLMapping(parentId = "app-list", id = "app-view", pattern = "/detail/#{appId}",
viewId = "/system/manage_app/content/app_detail/app_detail.xhtml")

PrettyFaces のポストバック アクション ナビゲーション機能を使用する場合、EL Bean 名が必要です。ここで、@URLMapping注釈にパラメーター名を指定していないため、PrettyFaces はとにかくパラメーター名を使用しようとし、必要なものを見つけられることを期待しています。この場合、明らかに、 という Bean 値はありません#{appId}

同じ問題を解決しようとする 2 種類の機能を実際に混在させています。<f:metadata>との定義は、 PrettyFaces<f:viewParam>がそのパス パラメーターとアクション メソッドで行うのと同じことを行っています。いずれかのメカニズムを使用する必要があります。本当にそれらを混在させたい場合は、あなたが言ったように、次のように実際のナビゲーションを呼び出す必要があります<h:commandButton>

<p:commandButton value="prueba2" action="#{navegableAppView.goToAppId}" ajax="false" />

appId次に、次のように、有効な JSF2 ナビゲーション文字列をパラメータとともに返すようにする必要があります。

public String goToAppId() {
    return "/system/manage_app/content/app_detail/app_detail.xhtml?faces-redirect=true&appId=" + appId";
}

次に、PrettyFaces は、マップされた URL にリダイレクトしていることを認識し、URL に対してアウトバウンド リライトを実行し、/detail/#{addId}代わりに適切な URL に送信します。これはすべてドキュメントにあります。

最後のオプションは単純に and を削除し、<f:metadata>代わり<f:viewParam>に組み込みの PrettyFaces 機能を使用してビュー パラメーターを管理します。メタデータを削除してこれに更新するだけ@URLMappingで、問題が解決します。

@ManagedBean
@ViewScoped
@URLMapping(parentId = "app-list", id = "app-view", pattern = "/detail/#{appId : navegableAppView._ParamApp}",
viewId = "/system/manage_app/content/app_detail/app_detail.xhtml")
public class NavegableAppView extends SystemNavegable {

@URLAction
public String initialize() {
if ( appId != null ) {
      this.item = appsDB.findById(appId);
      return null;
    }

    // Add a message here, "The item {..} could not be found."
    return "pretty:app-list";
}

これは、PrettyFaces を使用してページを初期化する方法です。pretty:mappingId結局のところ、ナビゲーションを使用している場合は、PrettyFaces 機能のみを使用する必要があります。view-id と URL のすべてのパラメーターを指定する通常の JSF2 スタイルのナビゲーションを使用する場合は、( URL マッピングで名前付きパスパラメーターを使用している限り) 組み合わせて一致させることができます。

これが役立つことを願っています。

于 2013-01-24T15:35:54.037 に答える