我在视图中有一个表单,例如说:
form.xhtml
<h:form>
<h:panelGrid columns="2">
<h:outputLabel value="Name" />
<h:inputText value="#{bean.name}" />
<h:outputLabel value="Age" />
<h:inputText value="#{bean.age}"
converter="#{ageConverter}" />
<h:outputLabel value="" />
<h:commandButton action="#{bean.submit}"
value="Submit" />
</h:panelGrid>
</h:form>
以下bean支持:
Bean.java
@Named
// Scope
public class Bean implements Serializable {
@Inject private Service service;
private String name;
private int age;
private List<Person> people;
public void submit() {
people= service.getPeople(name, age);
}
// getters & setters for name & age
// getter for people
}
导致people
的视图:
result.xhtml
<h:form>
<h:dataTable value="#{bean.people}"
var="person">
<h:column>
<f:facet name="header">Name</f:facet>
#{person.name}
</h:column>
<h:column>
<f:facet name="header">Day of Birth</f:facet>
#{person.dayOfBirth}
</h:column>
</h:dataTable>
</h:form>
现在显然用例类似于: - 使用 form.xhtml 提交表单 - 使用 Bean.java 让人们从服务中获益 - 使用 result.xhtml
向人们展示在这个例子中,仍然有一小部分难题不完整。例如,范围对于结果中是否存在people
具有决定性作用,而且结果页面中没有前向(或任何类似)。
现在我不确定实现这一目标的最佳(或至少是好的)方式。以下是我能够想到的一些方法:
@ViewScoped
(JSF2.2)和隐式导航(从String
返回submit()
)导航到第二页。然而这打破了观察镜(无论如何要完成这个)?@ViewScoped
并包含基于rendered=''
的正确文件(form.xhtml或result.xhtml)和一些EL。这可以通过提交Ajax调用来完成。name
和age
作为GET参数传递给result.xhtml并在@PostConstruct
上执行逻辑(但是,如果表单为'huge',该怎么办? )?在这种情况下,@RequestScoped
就足够了。我的问题是,实现这个用例的有效和好(最佳)方法是什么?
感谢您的意见。
答案 0 :(得分:2)
我认为你要找的是flash scope。它在重定向后仍然存在但在后续请求中不再可用。
解决方案是通过Flash范围传递您的name
和age
变量,并使用它们来渲染您的结果。
答案 1 :(得分:1)
似乎JSF 2.2不仅向我们提供了@ViewScoped
,它还为我们提供了@FlowScoped
。有关详细信息:documentation。这似乎很符合要求。