【问题标题】:Dont fill request scoped bean不要填写请求范围的bean
【发布时间】:2012-07-29 06:10:07
【问题描述】:

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

【问题讨论】:

    标签: forms jsf managed-bean


    【解决方案1】:

    您应该能够使用指向同一视图的纯 HTML 链接来做到这一点:

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

    或者让 JSF 为你创建链接:

    <h:link value="Reset" />
    

    这样您将获得一个新的 GET 请求,该请求将创建一个新的 UIViewRoot,就像您在新的浏览器选项卡中访问同一个视图一样。

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

    <h:button value="Reset" />
    

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

    【讨论】:

    • 谢谢,这按预期工作,但是否还有一种方法可以在 ajax 基础上执行此操作(希望不是通过手动设置每个属性)以省略完整的页面重新加载?
    • 不客气。不,我不知道。但实际上,重新加载页面还不错,HTTP 流不会比这更简单,并且您的代码保持在最低限度。 :) 我认为 AJAX 不会为这种事情带来太多收益。
    【解决方案2】:

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

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

    所以,简单地说:

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

    还有其他方法可以给“撤消”猫剥皮,这只是另一种。

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 2011-11-11
      • 2011-04-19
      • 2012-05-26
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多