不要填写请求范围的bean

时间:2012-07-31 13:03:29

标签: forms jsf managed-bean

我有一个请求范围的bean,它填充了表单中的各种属性。然后,这些属性用于更新另一个视图范围的bean。现在,我希望为用户提供重置表单的可能性,使所有表单字段都保存第一次加载页面时的值。这些值是通过bean本身定义的:

@ManagedBean
@RequestScoped
public class ItemSearchBean {

    private Rarity minRarity = Rarity.None;
    private Rarity maxRarity = Rarity.None;

    ...

}

请注意,表单提交按钮实际上调用了ajax请求,因此没有完整页面重新加载。

提交按钮:

<p:commandButton value="Search"
    actionListener="#{itemSearchBean.refreshTable}"
    update="itemTable,notify"/>

我已经尝试使用简单的重置按钮,但它只是将表单重置为上次提交的值:

<p:commandButton type="reset" value="Reset"/>

一个人必须以某种方式向服务器请求一个新的bean(或阻止它填充bean),但我不知道如何做到这一点。

2 个答案:

答案 0 :(得分:2)

您应该可以使用指向同一视图的纯HTML链接来执行此操作:

<a href="yourpage.xhtml">Reset</a>

或让JSF为您创建链接:

<h:link value="Reset" />

这样你就会有一个新的GET请求,它会创建一个新的UIViewRoot,就像你在新浏览器选项卡中访问同一个视图一样。

如果您想要一个按钮,可以使用h:button

<h:button value="Reset" />

此按钮将依赖于将在点击时重新加载页面的Javascript。

答案 1 :(得分:1)

您也可以进行两阶段设置。更多的工作,但如果你进一步采取行动,允许各种撤销工作流程。

基本上,有两个bean用通常的访问器/ mutator对封装你的表单。然后在你的控制器中,只暴露一个(x或y),那就是你的“表单bean”。在y中,您存储从存储库中检索的原始副本,这样您就可以执行字段级别或Bean级别的还原,而无需重新加载页面或从存储库中执行完整数据重新存储。

所以,简单地说:

  • 封装表单的2个bean(如果映射到表单上,您甚至可以重新使用您的实体)。
  • 在数据管理期间从repo中填充
  • 在facelets中向用户公开一个
  • 保留第二个作为重置/恢复字段或整个表单的备份

还有其他方法来修饰“撤消”猫,这只是另一种方法。