2012-08-12 46 views
0

我有一个JSF 2.0(或4.0 RichFaces的)应用程序,我想要做的东西,似乎很简单。JSF 2.0多个目标网页

我有一个登陆页面(/index.xhtml),这是“欢迎页面”这是出现在当有人类型“www.xxx.com”用xxx为我的域名。

  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页面,但这看起来真的很愚蠢。
  • 在servlet过滤器中对请求进行一些后处理(例如,当用户最初访问intro.xhtml时设置会话变量),并在用户点击home时使用此事实将它们路由回intro.xhtml。但是这似乎是一个糟糕的主意,因为我不想在登录之前开始会话。它还可以避免将所有页面流保存在faces-config.xml中,这是我迄今为止为整个应用程序所做的。
+0

无论是否有人登录,会话都始终启动。 – BillR 2012-08-12 18:21:40

+2

@BillR:*总是*?你错了。它只会在第一次构建视图或会话作用域管理bean时创建,并且/或者第一次请求带有''的页面(而状态保存方法设置为服务器时)。 – BalusC 2012-08-12 23:45:47

+0

我相信规范说任何时候服务器状态需要跟踪都会创建一个会话。因此,任何超出最琐碎的事情都需要一个会议。基本上对于JSF来说几乎任何事情都需要一个会话。如果一个人做了一些微不足道的事情,他们将不会使用JSF。 – BillR 2012-08-13 15:48:36

回答

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'}" /> 
+0

我今晚肯定会试试这个 - 我还没有在JSF中使用get参数(在JSP和servlet中多次使用它们)。我会阅读并发表回复。谢谢! – 2012-08-13 21:14:05

+0

好吧,昨晚试了这个(几个小时),结果证明这对于任何不平凡的应用来说都不是一个好的解决方案,或者我没有做正确的事情。在这一点上,任何一个都可能是正确的。我将在下面的问题上进一步讨论。 – 2012-08-14 14:16:22

0

在试图提议拉维实施解决方案,有以下几个问题:

  1. 我的应用程序严重利用JSF模板(通过ui:组合),所以下面的答案不会直接工作。但解决方法是使用ui:param标签,它确实有效。因此,我增加了以下内容索引和简介页:

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

头中具有-public.xhtml中的index.xhtml页面类似线

<ui:param name="landingvia" value="index"/> 
  1. 然后页面我需要根据Ravi更改链接(从内存中执行此操作),但您明白了。请注意,我需要使用“landingvia”而不是“param.landingvia”,可能是因为这种temp持。

    <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 
    

    ...我需要做同样重复所有页眉和页脚(其中有其他链接)的联系(联系我们,常见问题解答等)所包含的模板和对于图片链接(标识等)以及从常见问题解答到termsAndConditions.xhtml的链接...不是一个好的解决方案。

  2. 如果我没有将f:param标记添加到上面的所有commandLink中,那么状态是'lost',这是有道理的。当我从介绍转到关于时,关于页面如何跟踪没有f:param标记的登录页面?

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

  4. 作为最后一个问题,我发现即使所有的链接都重复如上,解决方案仍然不会工作,因为当有直接的表单(这些表单发送form.submit()回到自己)无论如何,状态都会丢失。

在这一点上,我将只管理服务器端的状态。所以我可以使用我的用户会话bean或设置会话cookie。

  • 无论如何,我在我的主页上创建会话级别“用户”对象。因此,我可以使用由刚刚从intro.xhtml

    #{userBean.setLandingPage('intro') 
    
  • 电话或设置从任一页面的cookie。

一旦我把一个值是(“指数”或“介绍”)到会话(通过Cookie或会话bean)我可以查询所有URL在ServletFilter中,如果它的目的地是“/指数”或“/”或“/index.xhtml”,那么我将使用会话变量。如果它包含值“intro”,我将发送用户到/intro.xhtml。

我不知道除了大量工作以外如何去做。但上面的解决方案运行良好,没有任何链接的变化,并且它具有可扩展到我需要的多个未来着陆页的额外好处。让我知道你的想法和拉维请让我知道如果我没有得到你的解决方案。

0

好吧,我<认为>我完全钉了它,想出了一个优雅的解决方案。对于那些在JSF方面的专家来说这可能是显而易见的,但我绝对不是(我更像是后端Java EE程序员)

这就是我所做的。

  1. 将一个landingPage属性添加到我的userBean(我的用户会话bean)中。如上所述,我不在乎我是在我的主页上开始一个会话,因为无论如何我都会这样做。
  2. 在我的所有着陆页面中,我添加了带有指向页面本身的相应URI的follwing。在这种情况下/ 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. 这也将是真正容易添加额外的登陆页面和有状态的行为。

我很满意这个解决方案。感谢大家!

+0

看起来不错Paul,您也可能想使用而不是来增加书签功能。另见[when-should-i-use-houtputlink-instead-of-hcommandlink](http://stackoverflow.com/questions/4317684/when-should-i-use-houtputlink-instead-of-hcommandlink) – Ravi 2012-08-15 14:46:24

+0

谢谢Ravi--我一定会看看h:link vs h:commandLink的问题。我实际上正在考虑为PrettyFaces解决方案(http://ocpsoft.org/prettyfaces/)寻求解决方案,我不确定是否无需更改h:commandLink标签。 – 2012-08-15 20:29:36