java - JSF ajax 更新行为

标签 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>

当页面出现时,我的 session bean 创建一个新的(空的)CD 对象。 当用户填写所有信息并提交时,(现已填充的)CD 对象将被保存,效果很好。

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

如何解决这个问题并仍然使用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,任何帮助都会很棒,谢谢!

最佳答案

The problem is that the 'categ' property is being set when the user changes the radio (without submit)

这就是ajax的要点。

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

关于java - JSF ajax 更新行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10117976/

相关文章:

java - 如何使用 DOM 解析复杂的 XML 文件?

java - 如何在 JSF 表中加载动态内容

html - 动态创建 HTML 和 CSS 元素

eclipse - 将 Jetty 安装到 Eclipse 中

php - 从 html 创建弹出窗口,而不是文件

ajax - Grails从xhr获取文件

java - 如何在java的控制台输出中打印带下划线的字符串

java - spring和maven类库及访问xml文件

Java随机生成两位小数格式的价格

javascript - 在 IE、FF 和 Safari 中运行 Ajax