【问题标题】:JSF property transfer from backing bean A to backing bean BJSF 属性从支持 bean A 转移到支持 bean B
【发布时间】:2011-06-29 18:22:39
【问题描述】:

我目前正在深入了解 JSF 2.0,但对托管 bean 属性从一个视图到另一个视图的“传输”缺乏一点了解。我搜索了一下,但没有找到一个很好的例子,所以如果有人能指点我一个教程或稍微解释一下,我真的很感激。

所以这是我的场景:

我正在开发一个小型游乐场日历应用程序。第一个视图select.xhtml 包含日历选择器,用户可以在其中选择特定日期:

<html>
  ...
  <h:form>

    <!-- Calendar selector from primefaces -->
    <p:calendar value="#{calendarSelect.date}" mode="inline" navigator="true" />

    <p:commandButton value="Show entries for date" action="day" />
    ...

我对应的 backing bean 是这样的:

@ManagedBean(name="calendarSelect")
@RequestScoped
public class CalendarSelectComponent {

  private Date date = null;

  ... // Getters and setters

现在,当我从select.xhtml 提交表单时,我将转发到day.xhtml

<html>
  ...
  <h:form>

    The current day ist:
    <h:outputText value="#{calendarEdit.date}">
      <f:convertDateTime pattern="dd.MM.yyyy" />
    </h:outputText>

backing bean 现在看起来像这样:

@ManagedBean(name="calendarEdit")
@ViewScoped
public class CalendarEditComponent implements Serializable {

  private Date date = null;
  private CalendarEntryBean currentEntry = null;
  private List<CalendarEntryBean> allEntries = null;

  ....

我现在正在尝试解决问题:如何将date 参数从选择器 传输到编辑器

我尝试了多种选择,其中一种是:

<p:commandButton value="Show entries for date" action="day" />
  <f:setPropertyActionListener target="#{calendarEdit.date}" value="#{calendarSelect.date}" />
</p:commandButton>

调试器显示,确实,calendarEditdate 属性填充了来自calendarSelect 的值,但由于day.xhtml 是一个新视图,因此正在创建一个新的CalendarEditComponent 支持bean而不是我在 select 视图中的选择器中填充的日期。

我读过一个解决方案是创建一个SessionScoped 支持bean,它确实保留了它的所有值。但这不是我认为它应该工作的方式,因为我真的不需要 session 中的信息,我只是希望它从 A 到 B “旅行”。另一个缺点是基于会话的方法是每个会话我只能使用一个选择器和一个编辑器 - 如果您想到多窗口浏览等,我认为这是不可接受的。

我真的不认为我是第一个遇到这种情况的人,我确信 JSF 为此提供了一个优雅的解决方案,但我一直无法找到那个解决方案。

再一次,如果有人知道如何处理这个问题 - 我在听! ;-)

【问题讨论】:

    标签: java jsf jsf-2 backing-beans


    【解决方案1】:

    &lt;f:setPropertyActionListener&gt; 在表单提交的调用操作阶段执行。因此,它预计该值在那时仍然存在。但是由于您的选择 bean 是请求范围的,因此在表单提交期间它不再存在。相反,您希望传递一个请求参数,该参数在呈现响应期间内联在输出中。您可以使用&lt;f:param&gt; 来执行此操作。

    <p:commandButton value="Show entries for date" action="day" />
      <f:param name="date" value="#{calendarSelect.dateAsString}" />
    </p:commandButton>
    

    它将作为请求参数提供(请注意,由于 HTTP 的性质,它只能理解字符串)。您可以让 JSF 将请求参数设置为托管属性,但由于您的编辑 bean 是视图范围的,因此 @ManagedProperty 无法做到这一点。你必须通过ExternalContext自己收集。

    String dateAsString = externalContext.getRequestParameterMap().get("date");
    

    确实,这很笨拙。我会为此使用相同的 bean 和视图,并通过rendered 属性切换选择/编辑表单的可见性。编辑视图毕竟不能通过简单的 GET 直接打开/添加书签,不是吗? ;)

    【讨论】:

    • 感谢您的回复,我担心没有“完美”的方法。但是关于您的评论“他的编辑视图毕竟不能通过简单的 GET 直接打开/添加书签,不是吗?” - 什么,如果我需要这样的东西?如果我需要像“blaba/edit.jsf?userId=42”这样的 URL,唯一的方法是以编程方式访问参数?
    • 那就这样做吧。您可以使用带有@ManagedProperty 的请求范围bean 或视图范围的bean,它在构造期间从外部上下文中收集它或使用f:viewParam
    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2012-06-27
    • 2012-04-01
    • 2014-12-28
    • 2012-11-15
    • 2013-01-17
    相关资源
    最近更新 更多