JSF ajax更新行为

时间:2012-04-12 05:39:33

标签: java ajax jsf facelets

我有一个selectOneRadio,使用ajax:

更新selectOneList
<h:outputLabel for="categ" value="Category" />
<h:selectOneRadio id="categ" value="#{cdManager.store.cd.categ}" required="true">
    <f:selectItems value="#{cdManager.store.cd.categs}"/>                    
    <f:ajax execute="categ" render="subcategs" listener="#{cdManager.categChanged}" />
</h:selectOneRadio>                                

<h:outputLabel for="subcategs" value="Sub-categ"/>
<h:selectOneListbox id="subcategs" value="#{cdManager.store.cd.subcateg}"     required="true">
    <f:selectItems value="#{cdManager.subcategsArray}"/>                    
</h:selectOneListbox>

当页面出现时,我的会话bean创建一个新的(空)CD对象。 当用户填写所有信息并提交时,将保存(现已填充的)CD对象,该工作正常。

问题是当用户更改收音机时正在设置'categ'属性(提交时) 这是不好的,因为用户可以点击“后退浏览器”,当他们回来时,收音机将被选中,其他字段将被清空,非常糟糕的行为!

我如何解决这个问题仍然使用ajax?

以下是侦听器代码:

public void categChanged()
{        
    //store.cd.categ is alredy set ? WHYYY ?
    String categ = store.getCd().getCateg();    
    this.subcategsArray = store.getCd().getSubcateg(categ);                                                 
}

我正在使用JSF 2.0,NetBeans IDE 7.0.1和Glassfish 3.1,任何帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:1)

  

问题是当用户设置'categ'属性时   更改收音机(不提交)

这是ajax的重点。

如果您使用浏览器的后退按钮,您将在浏览器缓存中看到一个页面。你可以disable caching of your page。然后,您将从服务器获得一个带有新支持bean的新页面(如果它是请求或视图作用域)或检查categChanged()方法中是否存在其他字段。