0

私はJSF2.0(およびRichfaces 4.0)アプリケーションを持っていて、簡単に思える何かをしたいと思っています。

誰かが私のドメインとしてxxxを使用して「www.xxx.com」と入力すると表示される「ウェルカムページ」であるランディングページ(/index.xhtml)があります。

  1. 掲載している広告のターゲットとなる別のランディングページが欲しいのですが。このコンテンツを高度にカスタマイズするため、これにアプローチする方法は、新しいページ(www.xxx.com/intro.xhtml)を作成することです。ここまでは順調ですね。私のインデックスページindex.xhtml(およびそのコピーintro.xhtml)には、リンクされた公開ページがたくさんあります。「仕組み」、「サインアップ」など、かなり典型的なものです。
  2. 問題は、「仕組み」に移動してホームページに戻ったときに、ターゲットユーザーがintro.xhtmlを介してサイトにアクセスしたという事実をどのように保存または追跡するかです。

問題となるユースケースは次のとおりです。

  • ユーザーは広告を介してアクセスし、カスタマイズされたコンテンツを含むintro.xhtmlにアクセスします。
  • 彼らは共有ホームページに行きます(「それがどのように機能するか」)。
  • 次に、ホーム(またはサイトアイコン)をクリックしてホームに戻ります。今のところ、彼らはウェルカムページ(index.xhtml)に戻り、混乱を招きます。

私が考えることができるのは:

  • 他のすべての公開ページの「ディープコピー」を作成し(たとえば、how_it_worksをhow_it_works_introにコピー)、誰かがそこからホームを選択したときに_introページをintro.xhtmlページにリンクさせることもできますが、それは本当にばかげているようです。
  • サーブレットフィルターでリクエストの後処理を行い(たとえば、ユーザーが最初にintro.xhtmlにアクセスしたときにセッション変数を設定します)、このファクトを使用して、ホームをクリックしたときにintro.xhtmlにルーティングします。しかし、彼らがログインするまでセッションを開始したくないので、これは悪い考えのように思えます。また、アプリ全体に対してこれまでに行ったfaces-config.xmlですべてのページフローを維持することもできなくなります。
4

3 に答える 3

0

わかりました、私は<と思います>私はそれを完全に釘付けにして、エレガントな解決策を思いつきました。JSFの専門家であることは明らかかもしれませんが、私は間違いなくそうではありません(私はバックエンドのJava EEプログラマーです)

これがまさに私がしたことです。

  1. 私のuserBean(私のユーザーセッションBean)にlandingPage属性を追加しました。上で述べたように、私はとにかくそれをしているので、私が私のホームページでセッションを始めていることを気にしません。
  2. すべてのランディングページで、ページ自体を指す適切なURIを使用して次のページを追加します。この場合、/indexはインデックスページ自体に解決されます。index.xhtmlに追加:

     #{userBean.setLandingPage('/index')}
    

intro.xhtmlに追加:

     #{userBean.setLandingPage('/intro')}
  1. 次に、必要なのは、セッション値を参照するようにJSFページのすべての参照を調整することです。だから私のheader.xhtmlで私はすべてを変更します

    <h:commandLink class="active" action="/index">home</h:commandLink>
    

    <h:commandLink class="active" action="#{userBean.getLandingPage}">home</h:commandLink>
    
  2. ホームページの参照のみを変更する必要があり、他のリンクは変更する必要はありません

  3. また、ランディングページとステートフルな動作を追加するのも非常に簡単です。

私はその解決策に本当に満足しています。みんな、ありがとう!

于 2012-08-14T23:45:07.840 に答える
0

通常、これはクエリ文字列にいくつかのパラメーターを追加することによって実現されます。例えば:

intro.xhtml から、これらのパラメータを次のように「仕組みページ」に追加します。

<h:link value="How it works" outcome="howitworks" includeViewParams="true">
   <f:param name="landingvia" value="intro"/>
</h:link>

次に、howitworks.xhtml でホームページのリンクを次のようにレンダリングします。

<h:link value="Home" outcome="intro" rendered="#{param.landingvia == 'intro'}" />
<h:link value="Home" outcome="index" rendered="#{param.landingvia == 'index'}" />
于 2012-08-12T23:40:20.920 に答える
0

Ravi が提案したソリューションを実装しようとすると、次の問題がありました。

  1. 私のアプリケーションは (ui:composition を介して) JSF テンプレートを多用しているため、以下の回答は直接機能しません。しかし、それを回避する方法は、機能した ui:param タグを使用することです。そこで、インデックスと紹介ページに以下を追加しました。

    <!-- this is in my intro.xhtml page -->
    <ui:composition template="templates/header-public.xhtml">
    <ui:param name="landingvia" value="intro"/>
    

index.xhtml ページの同様の行で

    <ui:param name="landingvia" value="index"/>
  1. 次に、header-public.xhtml ページで、Ravi に従ってリンクを変更する必要がありました (メモリからこれを行う) が、アイデアは得られます。おそらくテンプレート化のため、「param.landingvia」の代わりに「landingvia」を使用する必要があったことに注意してください。

    <h:commandLink value="Home" outcome="/intro" rendered="#{landingvia == 'intro'}" ><f:param name="landingvia" value="intro" /> </h:commandLink
    <h:commandLink value="Home" outcome="/index" rendered="#{landingvia == 'index'}" ><f:param name="landingvia" value="index" /> </h:commandLink
    <h:commandLink value="About" outcome="/about" rendered="#{landingvia == 'intro'}" ><f:param name="landingvia" value="intro" /> </h:commandLink
    <h:commandLink value="About" outcome="/about" rendered="#{landingvia == 'index'}" ><f:param name="landingvia" value="index" /> </h:commandLink
    

    ...テンプレートに含まれるヘッダーとフッター(他のリンクがある)のすべてのリンク(連絡先、よくある質問など)と画像リンク(ロゴなど)に対して同じ複製を行う必要があります。 ..) および faq から termsAndConditions.xhtml へのリンクについては ... 良い解決策ではありません。

  2. 上記のすべての commandLinks に f:param タグを追加しないと、状態が「失われた」状態になります。これは理にかなっています。イントロからアバウトに移動すると、アバウト ページは f:param タグなしでランディング ページをどのように追跡しますか?

  3. さらに悪いことに、任意のページから任意のページへのすべてのリンクは、このパターンに従う必要があります。したがって、私が何か非常に間違ったことをしていない限り、これは良い解決策ではありません。

  4. 最後の問題として、すべてのリンクが上記のように複製されていても、即時フォームがある場合 (これらのフォームは form.submit() を自分自身に送り返す) 状態が失われるため、解決策はまだ機能しないことがわかりました。

この時点では、サーバー側で状態を管理するだけです。したがって、ユーザー セッション Bean を使用するか、セッション Cookie を設定することができます。

  • とにかく、ホームページにセッションレベルの「ユーザー」オブジェクトを作成しています。intro.xhtml から呼び出すだけで使用できます

    #{userBean.setLandingPage('intro')
    
  • または、いずれかのページから Cookie を設定します。

("index" または "intro") のいずれかの値を (Cookie またはセッション Bean を介して) セッションに入れると、ServletFilter 内のすべての URL と、その宛先が "/index" または "/" または " /index.xhtml」の場合、セッション変数を使用します。「intro」という値が含まれている場合は、代わりにユーザーを /intro.xhtml に送信します。

大量の作業をせずにそれを行う方法が他にわかりません。しかし、上記のソリューションは、リンクを変更しなくてもうまく機能し、必要な数の将来のランディング ページに拡張できるという追加の利点があります。あなたの考えを教えてください.Raviがあなたの解決策を得られない場合はお知らせください.

于 2012-08-14T18:35:33.160 に答える