JSF 2.0多个登陆页面

时间:2012-08-12 16:23:57

标签: java-ee jsf-2 richfaces

我有一个JSF 2.0(和Richfaces 4.0)应用程序,我想做一些看似简单的事情。

我有一个目标网页(/index.xhtml),当有人用xxx作为我的域名输入“www.xxx.com”时会出现“欢迎页面”。

  1. 我希望有一个备用着陆页,它将成为我们正在投放的广告的目标。由于我要高度自定义这些内容,我将采用的方式只是有一个新的页面:www.xxx.com/intro.xhtml。到现在为止还挺好。 我的索引页面index.xhtml(及其副本intro.xhtml)有一堆链接的公共页面:“它如何工作”,“注册”等...非常典型的东西。
  2. 问题是我如何保留或跟踪目标用户在转到“如何运作”然后返回主页时通过intro.xhtml进入我的网站的事实?
  3. 将成为问题的用例是:

    • 用户通过广告进来,他们在intro.xhtml中使用自定义内容。
    • 他们进入共享主页(“工作原理”)。
    • 然后他们点击主页(或网站图标)返回主页。截至目前,他们回到欢迎页面(index.xhtml),这将使他们感到困惑。

    我能想到的只有:

    • 我可以对我所有其他公共页面进行“深层复制”(例如how_it_works复制到how_it_works_intro)然后将_intro页面链接返回到intro.xhtml页面,当有人从那里选择回家时,但这看起来确实如此哑。
    • 在servlet过滤器中对请求进行一些后处理(比如当用户最初点击intro.xhtml时设置会话变量)并使用这个事实在他们点击home时将它们路由回intro.xhtml。但这似乎是一个坏主意,因为我不想在他们登录之前开始会话。它还远离将我的所有页面流保存在faces-config.xml中,这是我迄今为止为整个应用程序所做的。

3 个答案:

答案 0 :(得分: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'}" />

答案 1 :(得分:0)

在尝试实施Ravi提出的解决方案时,存在以下问题:

  1. 我的应用程序大量利用JSF模板(通过ui:composition),所以下面的答案不会直接起作用。但是,解决这个问题的方法是使用ui:param标签,它确实有效。所以我在索引和介绍页面中添加了以下内容:

    <!-- this is in my intro.xhtml page -->
    <ui:composition template="templates/header-public.xhtml">
    <ui:param name="landingvia" value="intro"/>
    
  2. 与index.xhtml页面中的类似行

        <ui:param name="landingvia" value="index"/>
    
    1. 然后在header-public.xhtml页面中,我需要根据Ravi更改链接(从内存中执行此操作),但您明白了。请注意,我需要使用“landingvia”而不是“param.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
      

      ...我需要对标题和页脚(包含其他链接)包含在模板和图像链接中的所有链接(contactus,faq等等)进行相同的复制(徽标等...)以及从faq到termsAndConditions.xhtml的链接...不是一个好的解决方案。

    2. 如果我没有将f:param标签添加到上面的所有命令链接中,则状态为“丢失”,这是有意义的。当我从介绍转到关于,关于页面如何跟踪没有f:param标记的着陆页?

    3. 更糟糕的是,从任何页面到任何页面的所有链接都需要遵循这种模式。所以这不是一个好的解决方案,除非我做错了。

    4. 作为最后一个问题,我发现即使所有链接都如上所述重复,解决方案仍然无法正常工作,因为当有即时表单时(这些表单将form.submit()发送回自己)无论如何,国家都失败了。

    5. 此时我将只管理服务器端的状态。所以我可以使用我的用户会话bean或设置会话cookie。

      • 无论如何,我正在主页上创建一个会话级“用户”对象。所以我可以通过从intro.xhtml调用

        来使用它
        #{userBean.setLandingPage('intro')
        
      • 或从任一页面设置Cookie。

      一旦我将一个值(“index”或“intro”)放入会话中(通过cookie或会话bean),我就可以询问ServletFilter中的所有URL,如果它的目的地是“/ index”或“/ “或”/index.xhtml“然后我将使用会话变量。如果它包含值“intro”,我会将用户发送到/intro.xhtml。

      如果没有大量的工作,我不知道怎么做。但是上面的解决方案很好,没有任何链接的变化,并且它具有可扩展到我需要的尽可能多的未来登陆页面的额外好处。让我知道你的想法和拉维,如果我没有得到你的解决方案,请告诉我。

答案 2 :(得分:0)

好的伙计们,我&lt; think&gt;我完全钉了它,想出了一个优雅的解决方案。对于那些JSF专家来说可能是显而易见的,但我绝对不是(我更像是Java EE程序员的后端)

这正是我所做的。

  1. 向我的userBean(我的用户会话bean)添加了landingPage属性。如上所述,我不在乎我在我的主页上开始会话,因为无论如何我都在这样做。
  2. 在我的所有目标网页中,我添加了相应的 URI ,指向页面本身。在这种情况下,/ index解析为索引页面本身。 在index.xhtml中添加:

     #{userBean.setLandingPage('/index')}
    
  3. 在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. 添加其他目标网页和有状态行为也很容易。
    4. 我对解决方案非常满意。谢谢大家!