我们在我们的项目中使用JSF(我很新),每个页面都有一个后端bean Java文件。
为了从一个页面移动(重定向)到另一个页面,我需要在重定向之前将所有参数(搜索条件)放在请求范围中,然后在下一个页面构造函数中将其检索回来。如果你的页面很少,并且想要回到顶部,那么维护它会变得非常烦人。
例如,如果我的第1页包含高级搜索过滤器(根据所选项目重定向到第2页),并且从第2页开始,您将获得另一个列表,您可以转到第3页了解详细信息。现在,每当我需要将所有参数放在请求范围内/再次读取它们时,将它们存储在隐藏的字段中并将它们取回。
这个方法究竟是什么问题,并且在JSF中有更好的方法吗?
EDIT :环境是IBM Rational Application Developer(RAD),它有自己的JSF实现。不确定这是否有所作为。
答案 0 :(得分:5)
如果您打算在多个窗口/标签页中打开同一页面,那么将请求作用域数据放在会话范围中会让您(非常)很难受。如果数据本身也是真正的会话范围,那么只使用会话范围(优秀的例子是“登录用户”和“购物车”,你希望它在整个过程中完全相同会话)。同样,不要将请求范围的数据放在会话范围中。它伤害了你和最终用户。
只需设计你的bean聪明(让不同的bean包含相同的数据是没有意义的),并在必要时使用h:inputHidden
,必要时与托管属性注入结合使用。确实有点是编码和维护的痛苦。另一方面,如果要传递的数据实际上与“整个”托管bean一样大,那么也可以抓取Tomahawk <t:saveState>
。它在JSF页面中只需要一行,并且一直都很有帮助。
*例如,如果我的第1页包含高级搜索过滤器,重定向到第2页,具体取决于所选项目,并且从第2页开始,您将获得另一个列表,您可以转到第3页了解详细信息。现在,每当我需要将所有参数放在请求范围内/再次读取它们时,将它们存储在隐藏的字段中并将它们取回。
这种方法究竟是什么问题,并且在JSF中有更好的方法吗?*
这种方法没有错。也许你用错误的方式对它进行了编码,导致它看起来不必要地过于复杂。只要您不发布有关所用代码的详细信息,我就说不出多少。
根据你的编辑:
编辑:环境是IBM Rational Application Developer(RAD),它有自己的JSF实现。不确定这是否有所作为。
事实并非如此。 IBM没有任何JSF实现。它只有一个组件库(维护不良的hx
前缀组件,也称为“Faces Client Framework”)。 WSAD / RAD附带Sun JSF RI(Mojarra)作为标准的JSF实现,尽管它通常是一个严重过时的版本。确保保持更新。
答案 1 :(得分:1)
我只是开始使用JSF来说实话,但我认为你可以在会话范围中保存托管bean,从而能够在每个请求上访问bean吗?您还可以保存状态客户端,避免会话粘性和内容的肮脏。
因此,您可以将当前作为请求参数传递的数据保存在会话范围的托管bean中,并且它将可用于该用户会话中的任何请求,在会话超时或被故意无效时销毁(例如,用户注销)。
我认为JSF目前不支持会话状态,我认为这可能是您问题的确切解决方案,也许会话范围的托管bean将是实用的解决方案?
答案 2 :(得分:1)
使您的托管bean会话成为范围
如果您使用的是MyFaces,可以使用PageFlowScope。如果使用Seam,则使用会话范围
如果pageflowscope或会话范围不可用,则使用会话范围的bean。此外,您可以在调用页面之前使用PhaseListener初始化或执行特定方法。在你的情况下,如果流程是page1 - &gt;第2页 - &gt;如果调用page1,则在PhaseListener中初始化会话范围的bean。
如果需要,我会更新更多信息。