我有一个视图形式,例如说:传递变量另一种观点认为:最好的做法
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)和隐式导航(返回从submit()
一个String
)导航到第二页。然而,这打破了viewcope(无论如何要完成这个)? - 使用
@ViewScoped
并包含基于rendered=''
与某些EL的正确文件(form.xhtml或result.xhtml)。这可以通过提交上的Ajax调用完成。 - 将值
name
和age
作为GET参数传递给result.xhtml的请求,并在@PostConstruct
上执行逻辑(但是,如果表单为'巨大')呢?在这种情况下,@RequestScoped
就足够了。
我的问题是,什么将是一个高效和好(最好)的方式来完成这个用例?
感谢您的输入。
是的,但似乎我忘了提及我正在使用CDI。另一种方法是使用Conversation作用域,但是如果有人从表单导航而不是完成用例,我该如何销毁这个范围? – Aquillo
+1,因为您对flash范围的建议将我指向实际的CDI解决方案'@ FlowScoped',如我的示例中所述。 – Aquillo
@Aquillo,你可以使用[自定义导航处理程序](http://stackoverflow.com/a/15441777/1530938)在基于CDI bean的JSF应用程序中处理对话作用域管理, – kolossus