代码之家  ›  专栏  ›  技术社区  ›  mohdajami

在页面之间发送参数的最佳方式是什么?

  •  3
  • mohdajami  · 技术社区  · 14 年前

    我们在项目中使用JSF(IM很新),每个页面都有一个Bean bean文件。

    为了从一个页面移动(重定向)到另一个页面,我需要在重定向之前将所有参数(搜索条件)放在请求范围中,然后在下一个页面构造函数中检索它。当你有几页深,你想回到顶端,它变得非常恼人的维护。

    例如,如果我有带高级搜索过滤器的第1页,它根据所选项目重定向到第2页,并且从第2页,您可以得到另一个列表,如果您可以转到第3页了解详细信息。现在,每次我需要将所有参数放在请求范围内/再次读取它们时,将它们存储在隐藏字段中并将它们返回。

    这个方法到底有什么问题,在JSF中有什么更好的方法?

    编辑 :环境是IBMRationalApplicationDeveloper(RAD),它有自己的JSF实现。不确定这是否有影响。

    3 回复  |  直到 14 年前
        1
  •  5
  •   BalusC    14 年前

    如果要在多个窗口/选项卡中打开同一页,将请求范围内的数据放入会话范围将非常困难。仅当数据本身也是 真正地 会话范围(很好的例子是“登录用户”和“购物车”,您希望它在整个会话中完全相同)。同样,不要将请求范围的数据放在会话范围内。这会伤害到你和最终用户。

    只需聪明地设计bean(让不同的bean包含相同的数据是没有意义的),并利用 h:inputHidden 必要时,结合管理资产注入。的确如此。 一点 编码和维护的痛苦。另一方面你也可以抓住 Tomahawk <t:saveState> 如果要传递的数据实际上和“整体”托管bean一样大。它只需要在JSF页面上花费一行代码,并且一直都是非常有帮助的。

    *例如,如果我有带高级搜索过滤器的第1页,它根据所选项目重定向到第2页,并且从第2页,您可以得到另一个列表,如果您可以转到第3页了解详细信息。现在,每次我需要将所有参数放在请求范围内/再次读取它们时,将它们存储在隐藏字段中并将它们返回。

    这个方法到底有什么问题,在JSF中有什么更好的方法?*

    这个方法没什么问题。也许是你用错误的方式编码了它,导致它看起来不必要地过于复杂。只要你不公布所用代码的详细信息,我就说不出多少。

    根据您的编辑:

    编辑:环境是IBMRationalApplicationDeveloper(RAD),它有自己的JSF实现。不确定这是否有影响。

    这不是真的。IBM没有任何JSF实现。它只有一个组件库(维护不好 hx 带前缀的组件,也称为“faces客户端框架”)。wsad/rad与sun jsf ri(mojarra)一起作为标准JSF实现,尽管它通常是一个非常过时的版本。确保更新。

        2
  •  1
  •   brabster    14 年前

    老实说,我也只是从JSF开始,但我认为您可以在会话范围内保存托管bean,从而能够在每个请求上访问bean?您还可以保存状态客户机端,以避免对会话粘性和内容的不愉快。

    因此,您可以将当前传递的数据保存为会话范围的托管bean中的请求参数,并且该数据将可用于该用户会话中的任何请求,在会话超时或故意使其无效时销毁(例如在用户注销时)。

    我认为JSF目前不支持会话状态,我认为这可能是解决您的问题的确切方法,也许会话范围的托管bean是实用的解决方案?

        3
  •  1
  •   Padmarag    14 年前

    使托管bean会话具有作用域。
    如果你用我的脸,你可以用 PageFlowScope . 如果使用Seam,则使用会话范围。
    如果pageflowscope或conversation范围不可用,则使用会话范围的bean。此外,可以在调用页之前使用PhaseListener初始化或执行特定的方法。在您的情况下,如果流是page1->page2->page3,则在调用page1时在phaseListener中初始化会话范围的bean。
    如果你需要的话,我会更新更多的信息。