我现在正在深入研究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" />
...
我相应的支持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>
支持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>
调试器显示,date
的{{1}}属性确实填充了来自calendarEdit
的值,但由于calendarSelect
是一个新视图,一个新的正在创建day.xhtml
支持bean,而不是我在CalendarEditComponent
视图中使用选择日期填充的那个。
我读过一个解决方案是创建一个select
支持bean,它确实保留了它的所有值。但这不是我认为它应该工作的方式,因为我并不真正需要会话中的信息,我只是希望它从A到B“旅行”。另一个缺点是基于会话的方法是我每个会话只能使用一个选择器和一个编辑器 - 如果您考虑多窗口浏览等等,我认为这是不可接受的。
我真的不认为我是第一个遇到这种情况的人,我确信JSF为此提供了一个优雅的解决方案,但我无法找到解决方案。
再一次,如果有人知道如何处理这个 - 我正在听! ; - )
答案 0 :(得分:2)
<f:setPropertyActionListener>
在表单提交的调用操作阶段执行。所以它期望价值在那时仍然存在。但由于您的select bean是请求作用域,因此在表单提交期间它不存在。您希望传递一个请求参数,该参数在渲染响应期间在输出中内联。您可以使用<f:param>
。
<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直接打开/收藏,不是吗? ;)