2012-07-31 120 views
2

我有一个请求范围的bean,它是从表单中填充各种属性的。这些属性然后用于更新另一个视图范围的bean。现在我想让用户有可能以这种方式重置表单,即所有表单字段都保存第一次加载页面时的值。不要填写请求范围的bean

@ManagedBean 
@RequestScoped 
public class ItemSearchBean { 

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

    ... 

} 

注意,虽然该表单submiting按钮实际上调用一个Ajax请求,此处不再重新加载整个页面接着说:这些值是通过bean本身定义。

的提交按钮:

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

我已经尝试过用一个简单的复位按钮,但它只reseted形式到最后提交的值:

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

一个人莫名其妙地问服务器为新鲜的新bean(或阻止它填充bean),但我不知道如何做到这一点。

回答

2

你应该能够做到这一点与普通的HTML链接到了同样的观点:

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

还是让JSF创建链接给你:

<h:link value="Reset" /> 

这种方式,您将有一个新的GET请求会创建一个新的UIViewRoot,就像在新的浏览器标签中访问相同的视图一样。

如果你想有一个按钮,而不是,你可以使用一个h:button

<h:button value="Reset" /> 

该按钮将依赖于一个Javascript将重新加载上单击页面。

+0

谢谢,这是按预期工作,但是有没有一种方法可以在ajax的基础上做到这一点(希望不是通过手动设置每个属性)来省略完整的页面重新加载? – Paranaix 2012-07-31 13:35:09

+0

不客气。不,我不知道。但实际上,重新加载页面并不坏,HTTP流程不会比这更简单,并且您的代码保持在最低限度。 :)我不认为这种事情的AJAX会带来很多收益。 – elias 2012-07-31 14:03:10

1

你也可以做两个阶段的设置。多一点工作,但是如果你进一步研究,可以使用各种撤消工作流程。

基本上,有两个bean用通常的访问器/增变器对来封装你的表单。那么在你的控制器中,只显示一个(x或y),那就是你的“表单bean”。在y中,您存储从存储库检索到的原始副本,这样您就可以执行字段级别或bean级别的归还,而无需重新加载页面或从回购中完成全部数据重新存储。

所以,简单地说:

  • 2豆封装形式(你甚至可以重新使用您的实体,如果它映射到形式)。
  • 填充无论从数据马歇尔
  • 期间回购暴露一个在小面的用户
  • 保持第二作为备份,用于复位/恢复字段或整个形式

还有其他如何去皮肤“撤消”猫,而这只是另一种。