在试图提议拉维实施解决方案,有以下几个问题:
我的应用程序严重利用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"/>
然后页面我需要根据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的链接...不是一个好的解决方案。
如果我没有将f:param标记添加到上面的所有commandLink中,那么状态是'lost',这是有道理的。当我从介绍转到关于时,关于页面如何跟踪没有f:param标记的登录页面?
更糟糕的是,从任何页面到任何页面的所有链接都需要遵循这种模式。所以这不是一个好的解决方案,除非我做的事情非常错误。
作为最后一个问题,我发现即使所有的链接都重复如上,解决方案仍然不会工作,因为当有直接的表单(这些表单发送form.submit()回到自己)无论如何,状态都会丢失。
在这一点上,我将只管理服务器端的状态。所以我可以使用我的用户会话bean或设置会话cookie。
一旦我把一个值是(“指数”或“介绍”)到会话(通过Cookie或会话bean)我可以查询所有URL在ServletFilter中,如果它的目的地是“/指数”或“/”或“/index.xhtml”,那么我将使用会话变量。如果它包含值“intro”,我将发送用户到/intro.xhtml。
我不知道除了大量工作以外如何去做。但上面的解决方案运行良好,没有任何链接的变化,并且它具有可扩展到我需要的多个未来着陆页的额外好处。让我知道你的想法和拉维请让我知道如果我没有得到你的解决方案。
无论是否有人登录,会话都始终启动。 – BillR 2012-08-12 18:21:40
@BillR:*总是*?你错了。它只会在第一次构建视图或会话作用域管理bean时创建,并且/或者第一次请求带有''的页面(而状态保存方法设置为服务器时)。 –
BalusC
2012-08-12 23:45:47
我相信规范说任何时候服务器状态需要跟踪都会创建一个会话。因此,任何超出最琐碎的事情都需要一个会议。基本上对于JSF来说几乎任何事情都需要一个会话。如果一个人做了一些微不足道的事情,他们将不会使用JSF。 – BillR 2012-08-13 15:48:36