我有一个多页面的表单,也就是一个向导模式,其中Page 1对应于向导表单的第1步,第2页对应于第2步,等等.除了last之外的每个页面都有一个Next按钮,它带你到表格中的下一页.最后一页有一个提交按钮,提交向导中所有页面的所有数据.
我应该使用什么范围来维护每个表单上输入的数据的状态?例如,我应该使用View Scoped bean来保存所有页面上输入的所有数据吗?这将是有效的,因为我将导航到不同的页面(我认为这被认为是不同的"视图";如果它们是不同的视图,我相信当您导航到下一页时,View Scoped数据将会丢失魔法师)
Bal*_*usC 12
我相信当您导航到向导中的下一页时,View Scoped数据将会丢失)
那是对的.只要您与同一视图交互并在创建新视图时进行删除,视图范围就会存在.你正在寻找"对话范围".任何JSF托管bean作用域都不能使用它.然而,CDI可以使用它@ConversationScoped.因此,如果您的环境恰好支持CDI,您可以使用它:
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@ConversationScoped
public class Wizard implements Serializable {
@Inject
private Conversation conversation;
@PostConstruct
public void init() {
conversation.begin();
}
public void submitFirstStep() {
// ...
}
// ...
public String submitLastStep() {
// ...
conversation.end();
return "someOtherPage?faces-redirect=true";
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
对话由自动插入的cid请求参数管理.
如果您想坚持JSF视图范围,那么最好的办法是创建一个页面,其中您可以有条件地呈现多个步骤:
<h:panelGroup rendered="#{wizard.step == 1}">
<ui:include src="/WEB-INF/wizard/step1.xhtml" />
</h:panelGroup>
<h:panelGroup rendered="#{wizard.step == 2}">
<ui:include src="/WEB-INF/wizard/step2.xhtml" />
</h:panelGroup>
<h:panelGroup rendered="#{wizard.step == 3}">
<ui:include src="/WEB-INF/wizard/step3.xhtml" />
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用像PrimeFaces这样的第三方组件库,它具有<p:wizard>用于此目的的组件.
| 归档时间: |
|
| 查看次数: |
6769 次 |
| 最近记录: |