我有一个JSF 2.0(和Richfaces 4.0)应用程序,我想做一些看似简单的事情。
我有一个目标网页(/index.xhtml),当有人用xxx作为我的域名输入“www.xxx.com”时会出现“欢迎页面”。
将成为问题的用例是:
我能想到的只有:
答案 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提出的解决方案时,存在以下问题:
我的应用程序大量利用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"/>
与index.xhtml页面中的类似行
<ui:param name="landingvia" value="index"/>
然后在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的链接...不是一个好的解决方案。
如果我没有将f:param标签添加到上面的所有命令链接中,则状态为“丢失”,这是有意义的。当我从介绍转到关于,关于页面如何跟踪没有f:param标记的着陆页?
更糟糕的是,从任何页面到任何页面的所有链接都需要遵循这种模式。所以这不是一个好的解决方案,除非我做错了。
作为最后一个问题,我发现即使所有链接都如上所述重复,解决方案仍然无法正常工作,因为当有即时表单时(这些表单将form.submit()发送回自己)无论如何,国家都失败了。
此时我将只管理服务器端的状态。所以我可以使用我的用户会话bean或设置会话cookie。
无论如何,我正在主页上创建一个会话级“用户”对象。所以我可以通过从intro.xhtml调用
来使用它#{userBean.setLandingPage('intro')
一旦我将一个值(“index”或“intro”)放入会话中(通过cookie或会话bean),我就可以询问ServletFilter中的所有URL,如果它的目的地是“/ index”或“/ “或”/index.xhtml“然后我将使用会话变量。如果它包含值“intro”,我会将用户发送到/intro.xhtml。
如果没有大量的工作,我不知道怎么做。但是上面的解决方案很好,没有任何链接的变化,并且它具有可扩展到我需要的尽可能多的未来登陆页面的额外好处。让我知道你的想法和拉维,如果我没有得到你的解决方案,请告诉我。
答案 2 :(得分:0)
好的伙计们,我&lt; think&gt;我完全钉了它,想出了一个优雅的解决方案。对于那些JSF专家来说可能是显而易见的,但我绝对不是(我更像是Java EE程序员的后端)
这正是我所做的。
在我的所有目标网页中,我添加了相应的 URI ,指向页面本身。在这种情况下,/ index解析为索引页面本身。 在index.xhtml中添加:
#{userBean.setLandingPage('/index')}
在intro.xhtml中添加:
#{userBean.setLandingPage('/intro')}
然后我需要做的是调整我的JSF页面中的所有引用以引用会话值。所以在我的header.xhtml中我改变了所有
<h:commandLink class="active" action="/index">home</h:commandLink>
到
<h:commandLink class="active" action="#{userBean.getLandingPage}">home</h:commandLink>
只有主页引用需要更改,其他链接都不需要更改
我对解决方案非常满意。谢谢大家!