Forms 不填充请求范围的bean

Forms 不填充请求范围的bean,forms,jsf,managed-bean,Forms,Jsf,Managed Bean,我有一个请求范围的bean,它由表单中的各种属性填充。然后使用这些属性更新另一个视图范围的bean。现在,我想让用户能够重置表单,使所有表单字段都保存第一次加载页面时的值。这些值是通过bean本身定义的: @ManagedBean @RequestScoped public class ItemSearchBean { private Rarity minRarity = Rarity.None; private Rarity maxRarity = Rarity.None;

我有一个请求范围的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),但我不知道如何做到这一点。

您应该能够通过指向同一视图的普通HTML链接做到这一点:

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

此按钮将依赖于一个Javascript,该Javascript将在单击时重新加载页面。

您还可以进行两阶段设置。需要做更多的工作,但如果您更进一步的话,可以使用各种撤销工作流

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

因此,简单地说:

  • 2个bean来封装表单(如果实体映射到表单上,您甚至可以重用它)
  • 在数据整理期间从回购协议中填写
  • 在facelets中向用户公开一个
  • 保留第二个作为备份,以便重置/恢复字段或整个表单

还有其他方法可以对“撤消”cat进行蒙皮,这只是另一种方法。

谢谢,这是一种预期的方法,但是是否也有一种基于ajax的方法(希望不是手动设置每个属性)可以省略完整的页面重新加载?不客气。不,我不知道。但实际上,重新加载页面并不坏,HTTP流不会变得比这更简单,并且您的代码保持在最小值。:)我不认为AJAX为这种事情带来太多好处。
<h:link value="Reset" />
<h:button value="Reset" />