2

典型的な JSF アプリケーションの多くのページは動的です。つまり、特定のタイプのすべてのオブジェクトをレンダリングするために使用されるテンプレートビューがあります。これらのページでは、PrettyFaces 書き換えソリューションがうまく機能し、簡単に作業できます。例として、ID またはその他の一意のフィールドに基づいて製品を表示する Web アプリケーションがあります。通常、このような表示に関連する 1 つのビュー( などproduct.xhtml) と、製品の一意のフィールドを保持する 1 つのビュー パラメータ ( など) がありますname

/product.xhtml?name=exact-product-name簡単な設定で、たとえば次のように書き換えられたすべてのリクエストを取得します/products/exact-product-name

URL マッピング:

<url-mapping id="viewProduct">
    <pattern value="/products/#{ name : productBean.name }" />
    <view-id value="/store/product.xhtml" />
    <action> #{ productBean.loadData } </action>
</url-mapping>

景色:

<f:metadata>
    <f:viewParam id="name" name="name" required="true" />
</f:metadata>

モデル:

public class ProductBean implements Serializable {

    private ProductService productService;

    private String name;

    private Product product;

    public String loadData() {
        if(!((name == null) || (name.equals(""))) {
            Product product = productService.findByName(name);
            this.product = product;
            return null;
        }
        return "error";
    }

}

ただし、ビュー パラメータを使用して上記の方法でテンプレート化されていない、静的データを含むページも多数あります。これらのページは、そこに置かれたものを表示するだけです。たとえば、個別のビュー (な​​ど) として作成された多くの記事が存在する場合があります。PrettyFaces を使用すると、そのようなページの数と同じ数の URL マッピングを作成する必要があります。しかし、実際には、この動作は1 つの URL マッピングでテンプレート化することもできます。残念ながら、これは現在の PrettyFaces リリースではサポートされていません。/pages/articles/article1.xhtml

PrettyFaces フレームワークの提案された拡張機能は次のとおりです。

<url-mapping id="viewArticle">
    <pattern value="/articles/#{ articleName }" />
    <view-id value="/store/#{ articleName }.xhtml" />
</url-mapping>

または、ArticleBean(たとえば、 と の 2 つのフィールドを含み、articleNamenamearticleIdは id フィールドの setter で一意の値として定義されます)を使用します。

<url-mapping id="viewArticle">
    <pattern value="/articles/#{ articleId : articleBean.articleId }" />
    <view-id value="/store/#{ articleBean.articleName }.xhtml" />
</url-mapping>

または、EL 式に基づく他の事前定義された依存関係を使用します。これは、一意の対応に基づいています。

DynaViewビュー ID に不確実性がないため、これは a にはならないことを強調したいと思います。a<pattern>と a の間には 1 対 1 の対応があり<view-id>ます。

この機能を PrettyFaces に実装することについてどう思いますか?

4

2 に答える 2

1

私は、PrettyFaces の提案を議論するのに Stackoverflow は適切な場所ではないと思います。そのためには、PrettyFaces サポート フォーラムを参照してください。

このようなものを実装するには、いくつかのオプションがあります。私見は、このビュー DynaView を実行しようとすることができます。あなたが書いたように、パターンとビュー ID の間に 1 対 1 の関係がある場合でも。ただし、dynaview には、特にアウトバウンド リライトでいくつかの問題があります。

ただし、PrettyFaces の後継であるRewriteを確認する必要があります。Rewrite を使用すると、そのような要件を非常に簡単に実装できます。

.addRule(Join.path("/articles/{articleName}").to("/store/{articleName}.xhtml"))

Rewriteの設定例を見てみましょう。

于 2013-02-22T15:34:06.007 に答える
0

のセットアップがpretty-config.xml現在この機能をサポートしていない限り、この機能を実現するためのいくつかの回避策があります。以下にそれらについて説明します。

<f:event>ダミー Bean のビュー パラメータに基づいて最終ページへのナビゲーションを処理するダミー ビュー。

URL マッピング:

<url-mapping id="viewArticle">
    <pattern value="/articles/#{ articleName : articleBean.articleName }" />
    <view-id value="/handle-article-redirection.xhtml" />
</url-mapping>

ビューhandle-article-redirection.xhtml:

<f:metadata>
    <f:viewParam id="articleName" name="articleName" required="true" />
    <f:event type="preRenderView" listener="#{articleBean.handleRedirect}" />
</f:metadata>

モデル:

public class ArticleBean {

    private ArticleService articleService;

    private String articleName;

    private String articleUrl;

    public void handleRedirect() {
        if(!((articleName == null) || (articleName.equals(""))) {
            String url = articleName;
            //String url = articleService.getUrlForArticleName(articleName);
            //articleUrl = url;
            FacesContext.getCurrentInstance().getExternalContext().redirect("/" + url + ".xhtml");
            return null;
        }
        FacesContext.getCurrentInstance().getExternalContext().redirect("/home.xhtml");
    }

}

<ui:include>Bean 値 / ビュー パラメーターに基づいて、必要なページ コンテンツをスニペットとしてインポートする動的な意味のあるビュー。

URL マッピング:

<url-mapping id="viewArticle">
    <pattern value="/articles/#{ articleName : articleBean.articleName }" />
    <view-id value="/article.xhtml" />
</url-mapping>

ビューarticle.xhtml:

<f:metadata>
    <f:viewParam id="articleName" name="articleName" required="true" />
</f:metadata>
<h:head></h:head>
<h:body>
    <ui:include src="/#{articleBean.articleUrl}.xhtml" />
</h:body>

モデル:

public class ArticleBean {

    private ArticleService articleService;

    private String articleName;

    private String articleUrl;

    public void setArticleName(String articleName) {
        this.articleName = articleName;
        if((!(articleName == null)) || (articleName.equals("")) {
            articleUrl = articleName;
            //articleUrl = articleService.getUrlForArticleName(articleName);
        } else {
             articleUrl = null;
        }
    }

}

DynaView適切な結果を返すメソッドを使用した URL マッピング。

URL マッピング:

<url-mapping id="viewArticle">
    <pattern value="/articles/#{ articleName : articleBean.articleName }" />
    <view-id value="#{articleBean.getViewPath}" />
</url-mapping>

余分なビューは必要ありません。

モデル:

public class ArticleBean {

    private ArticleService articleService;

    private String articleName;

    private String articleUrl;

    public String getViewPath() {
        this.articleName = articleName;
        if(!((articleName == null) || (articleName.equals(""))) {
            articleUrl = articleName;
            //articleUrl = articleService.getUrlForArticleName(articleName);
            return articleUrl;
        }
        return "error";
    }

}

データベースからページ データをロードするテンプレートビュー。したがって、これらのページ用の個別のビューはありません。

URL マッピング:

<url-mapping id="viewArticle">
    <pattern value="/articles/#{ articleName : articleBean.articleName }" />
    <view-id value="/article.xhtml" />
    <action> #{ articleBean.loadData } </action>
</url-mapping>

ビューarticle.xhtml:

<f:metadata>
    <f:viewParam id="articleName" name="articleName" required="true" />
</f:metadata>
<h:head></h:head>
<h:body>
    <h:panelGroup>
        #{articleBean.content}
    <h:panelGroup>
</h:body>

モデル:

public class ArticleBean {

    private ArticleService articleService;

    private String articleName;

    private String articleUrl;

    private String content;

    public void loadData() {
        if(!((articleName == null) || (articleName.equals(""))) {
            articleUrl = articleName;
            //articleUrl = articleService.getUrlForArticleName(articleName);
            content = articleService.getContentForArticleName(articleName);
        } else {
             articleUrl = null;
             content = null;
        }
    }

}

カスタムWebFilterまたはNavigationHandler.

最良の代替手段は何ですか、まあ、それは異なります。それらにはすべて長所と短所があります。

于 2013-02-22T12:55:38.793 に答える