我在视图中有一个表单,例如说:
表单.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
:
结果.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
fromsubmit()
)导航到第二页。然而,这打破了视野(无论如何要做到这一点)? - 使用
@ViewScoped
并包含基于rendered=''
某些 EL 的正确文件(form.xhtml 或 result.xhtml)。这可以通过提交时的 Ajax 调用来完成。 - 将值
name
和age
作为 GET 参数传递给 result.xhtml 的请求并在 a 上执行逻辑@PostConstruct
(但是,如果表单是“巨大的”怎么办)?在这种情况下@RequestScoped
就足够了。
我的问题是,什么是完成这个用例的有效和好的(最好的)方法?
感谢您的输入。