在尝试实施 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 等)进行相同的复制。 ..) 以及从say faq 到termsAndConditions.xhtml 的链接......不是一个好的解决方案。
如果我不将 f:param 标记添加到上面的所有 commandLinks 中,则状态为“丢失”,这是有道理的。当我从介绍转到 About 时,About 页面如何在没有 f:param 标签的情况下跟踪登录页面?
更糟糕的是,从任何页面到任何页面的所有链接都需要遵循这种模式。所以这不是一个好的解决方案,除非我做错了什么。
作为最后一个问题,我发现即使所有链接都如上所述重复,该解决方案仍然无法正常工作,因为当有即时表单(这些表单将 form.submit() 发送回它们自己)时,无论如何状态都会丢失。
在这一点上,我将只管理服务器端的状态。所以我可以使用我的用户会话 bean 或设置会话 cookie。
一旦我将一个值(“index”或“intro”)放入会话中(通过 cookie 或会话 bean),我就可以询问 ServletFilter 中的所有 URL,以及它的目标是“/index”还是“/”或“ /index.xhtml" 然后我将使用会话变量。如果它包含值“intro”,我会将用户发送到 /intro.xhtml。
如果没有大量的工作,我不知道该怎么做。但是上面的解决方案在不改变任何链接的情况下运行良好,而且它还有一个额外的好处,就是可以根据我的需要扩展到尽可能多的登陆页面。让我知道你的想法,Ravi 如果我没有得到你的解决方案,请告诉我。