4

f:metadata 要素で prerender ビュー イベントを使用して別のページを呼び出しています。

それを使用してページに移動する<h:link>と、それが機能し、リスナーメソッドが呼び出されます。

ただし、呼び出しページに属するマネージド Bean のアクション メソッドからの結果を使用してページに移動すると、prerenderview で指定されたリスナーは呼び出されません (リンクによって呼び出された場合と同様)。2 番目のページに移動しますが、リスナーの呼び出しはありません。

アクションメソッドから呼び出すことを本当に好みます。これを使用していくつかの作業を行い、呼び出されたページが使用するセッションマップに変数を配置するためです。リンクを使用して同じことを達成する方法がわかりません。オブジェクトはかなり大きくなる可能性があります... Mbではなくkbですが、それでもリクエストに入れたいものではありません。

呼び出しページ リクエストのマネージド Bean をスコープ指定し、ビュー スコープ指定してみました。

マネージド Bean の結果から呼び出された場合、prerenderview を起動することはできませんか? 私が言ったように、リンクから動作するようになりました。

<body>
    <ui:define name="metadata">
        <f:view>
            <f:metadata>
                <f:event type="preRenderView" listener="#{businessBean.init}" />
            </f:metadata>
        </f:view>
    </ui:define>
    <ui:composition template="#{navigationprops.soulard_2col_uprefs_template}">
4

2 に答える 2

8

ui:composition タグはその外側のすべてをトリムするため、facelets コンパイラーはコードを読み取る機会がありません。代わりに ui:decorate を使用する必要がありますが、f:metadata タグはトップ レベルのページでのみ機能し、テンプレート クライアント内では機能しないことに注意してください。例えば:

<ui:composition 
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<f:metadata>
    <f:viewParam name="hotid" 
       value="#{hotelBooking.hotelId}" 
       converter="javax.faces.Long"/>
    <f:event type="preRenderView" listener="#{hotelBooking.selectHotel}"/>
</f:metadata>
<ui:decorate template="template.xhtml">
   <ui:define name="content">
   <!-- ... -->
   </ui:define>
</ui:decorate>
</ui:composition>

詳細については、この例を参照してください。

于 2012-09-26T01:31:33.057 に答える
0

私は他の答えを試しましたが、これが私が仕事に取り掛かった唯一のことです...それはプログラムでリダイレクトを呼び出すことによってアクションメソッドのリンクを模倣することです。

public void editArticle(Article article) {
    FacesContext fcontext = FacesContext.getCurrentInstance();
    ExternalContext context = fcontext.getExternalContext();
    Map<String, Object> sessionMap = context.getSessionMap();
    sessionMap.put("articleId", article.getArticleId());
    String urlString = navBundle.getString("ARTICLE_EDITOR");
    String url = context.encodeActionURL(fcontext.getApplication().getViewHandler().getActionURL(fcontext, urlString));
    try {
        context.redirect(url);
    } catch (IOException ex) {
        ELSLogger.LOG(Level.SEVERE, this.getClass().getName(), "checkEligableToLogin", "Couldn't Redirect to: " + url);
    }
}

さて、プリレンダービューで気が変わったことがわかりましたが、これは完了して機能しているので、後でリファクタリングします。しかし、誰かがバッキングBeanからプログラムで別のページを呼び出す動作するコードを見たい場合は、ここにあります。FWIW、「ARTICLE_EDITOR」は、コンテキストルートから始まるURLを保持する変数です。

于 2012-09-27T06:19:22.873 に答える