【问题标题】:JSF - Binding values of components added dynamicallyJSF - 动态添加的组件的绑定值
【发布时间】:2010-09-15 17:58:58
【问题描述】:

我想用 JSF 实现类似的东西。(搜索屏幕的一部分)

点击“+”按钮会动态添加越来越多的新行,点击“-”按钮会删除该行。问题在于将值(那些动态创建的行中的用户输入)绑定到支持模型。

我创建了一个会话范围的支持 bean。部分代码,

public class BackingBean{
  //other code

  private List<Criteria> searchFilters; // Each criteria is bound to a row

  public void init(){
   //init code
  }
  public void addEmptyCriteria(){
    searchFilters.add(MyFactory.createNewCriteria());
  }

}

+ 按钮的操作触发 addEmtpyCriteria 方法并重新渲染(使用 a4j)整个部分(带有新行)。

这只是一个样板文件,只要 bean 是会话范围的,一切都会正常工作。但是将它放在请求范围内更直观。单个搜索是用户发出的单个请求,与用户会话无关。在会话中也有它,会强制开发人员从会话中清除/删除 backingbean,以便显示新的搜索屏幕。

有没有更好的方法来做到这一点?将它放在会话范围内是否正确?

【问题讨论】:

    标签: java jsf ajax4jsf


    【解决方案1】:

    当您使用 JSF 2.0 时,您只需将 bean 放在 view 范围内即可。

    @ManagedBean
    @ViewScoped
    public class BackingBean {
        // ...
    }
    

    当您仍在使用 JSF 1.x 时,最好的选择是使用 a4j:keepAlive。使您的 bean 请求具有范围并将以下内容添加到 JSF 页面:

    <a4j:keepAlive beanName="managedBeanName" />
    

    如果你不使用 Ajax4jsf,那么我会建议 Tomahawk's t:saveState。基本上是一样的。

    <t:saveState value="#{managedBeanName}" />
    

    【讨论】:

    • 没错。只要您与相同的视图交互(即提交到 bean 并导航回相同的视图),bean 就会存在。这不会在同一会话中的其他选项卡/窗口之间共享(当 bean 是会话范围时,它会是)。您是否在任何情况下测试过它?
    • 道歉。不小心删了评论。重新发布它。“整个代码在page1.jsp中。如果我必须使用keepalive,我将不得不把它放在page1.jsp中。意思是,bean不会再次实例化。我在这里错过了什么吗?”
    • 现在无法测试。我在一个只有互联网访问权限的瘦客户端上。会让你知道的。
    • 那么,这是否意味着,如果我导航到不同的视图并返回 page1.jsf,将创建一个新实例(即使该页面具有 keepalive 标签)?
    • 没错。这正是您(和其他所有人)在此类问题上想要的 :) 有关更详细的背景信息,另请参阅 Benefits and pitfalls of @ViewScopedDisadvantages of JSF
    猜你喜欢
    • 2011-01-14
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2015-11-04
    相关资源
    最近更新 更多