【问题标题】:Bean Scopes Managment in JSF + SpringJSF + Spring 中的 Bean 范围管理
【发布时间】:2012-10-11 22:00:15
【问题描述】:

我正在使用 JSF2.0 + Spring 3.0 构建一个应用程序。我的 bean 在这个应用程序中由 Spring 管理。
在这个应用程序中,我有一个包含 3 个 SelectOneMenuItems(JSF) 的表单

  1. 当用户选择第一个下拉框值时,它将填充第二个下拉框(因为我已在 EventChangeListener 中放置逻辑)
  2. 当用户从第二个下拉列表中选择值时,它将根据第二个下拉列表的选择填充第三个下拉列表

现在,当我提交表单时,它可以正常提交,但不会从框中删除值。 我在春季尝试了 request scope 但它产生了另一个问题,即当通过第一个下拉列表选择一个值时,比如说国家,我将值发送到省的下一个下拉列表(根据国家下拉列表填充省份selection) ,spring 认为它是一个新请求并刷新 bean,因此国家的下拉值被删除,我在填充省份时得到 NullPointerException。 我现在该怎么办我真的卡住了。请帮助

【问题讨论】:

  • aamir 当前接受的答案真的 解决了您的具体问题吗?还是您只是因为从众行为和/或高票数而接受它?我不做 Spring,但 aamir 的答案似乎根本不适用于 Spring 管理的 bean。您的具体问题必须通过使用不同的范围来解决,某种对话范围,如 JSF 中的“视图范围”和 CDI 中的“对话范围”。您可以在 Google 上找到如何在 Spring 中模拟 JSF 视图范围的示例。

标签: spring jakarta-ee spring-mvc jsf-2


【解决方案1】:

您可以使用最适合您的用例的View Scope。但由于 Spring 3.0 不支持视图范围,您需要创建自定义视图范围实现以供 Spring 识别。您可以参考this link

【讨论】:

  • 你确定视图范围对我有帮助吗?因为在我的情况下,我的应用程序没有导航,它是一个基于 ajax 的调用..
  • 如果您的应用无法导航,那么在您提交表单后究竟会发生什么?
  • 这是一个 ajax 调用......我尝试了那个链接......它们对我不起作用......即使在我实现它们时它们也没有帮助我运行视图范围 :(
【解决方案2】:

我想说会话范围在这里很好。我认为您需要对下拉列表的选定值进行适当的管理。更改 DropDown1 后,您需要重置 DropDown2 和 DropDown3。一旦你改变 DropDown2 重置 DropDown3。重置是指仅将有效数据加载或过滤到这些组件的模型中。

您正在使用 JSF2。你在使用f:ajax 标签吗?你有可用的代码 sn-p 吗?那里可能有一个问题,有点棘手。

【讨论】:

  • 是的,我认为我应该在这里使用会话范围,但我的 bean 是由 spring 管理的。那么我应该在 spring 端使用哪个范围?
  • 会话范围也是如此。确保 web.xml 中的 spring 配置正确,以便 spring 应用程序上下文正常。您的 bean 应该只在 spring 上下文中,而不是在 faces-config 中。不要复制配置,只使用 spring bean 解析器(以防万一)
  • 是的,我只在 applicationcontext.xml 中重新注册了我的 bean .. 好的,让我尝试使用会话范围。你认为它会在表单提交 JSF 的 ajax 调用后删除值吗?
  • 不,在这种情况下,您需要在被调用的事件中手动执行此操作。在这种情况下,bean 不会在需要时自动重新创建。您可以做的是将所有 3 个下拉列表放入模型中,当下拉事件出现时,只需清空其他列表。除非您找到可以为您执行此操作的现成组件,否则我认为这是实现此功能的最简单方法。
  • 您能否在回答中详细说明
【解决方案3】:

您可以自己创建一个新 bean,并使用 FacesContext 将其放入所需的范围内。

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("myBean", new MyBean());

通过在代码中使用它,您可以覆盖 bean 的当前实例并摆脱旧 bean。

【讨论】:

  • 那么我现在应该使用哪个范围?
  • getSessionMap() 告诉您的 bean 将是 Session Scope,因为您从 Session Map 获取它
  • 如果使用 spring 这似乎是错误的方式,因为它不会将 bean 添加到 spring 上下文中。有static.springsource.org/spring/docs/3.0.x/api/org/… 来检索spring 上下文并与之交互。
  • 即使是普通的 JSF bean 而不是 Spring bean,请注意这种幼稚的方法没有考虑到 @ManagedProperty@PostConstruct 等。
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2012-04-16
  • 2011-11-11
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多