ViewScope bean是否允许ajax调用?
例如:
这是一个xhtml页面:
<h:body>
<h:selectOneMenu value="#{test.selected}">
<f:selectItem itemValue="2" itemLabel="2" />
<f:selectItem itemValue="3" itemLabel="3" />
<f:ajax listener="#{test.updateData()}" />
</h:selectOneMenu>
</h:body>
这是ViewScoped Bean:
@ViewScoped
@Named
public class test implements Serializable{
private String selected;
public void updateData(){
System.out.println("Ajax call successful.");
}
public String getSelected() {
return selected;
}
public void setTest(String test) {
this.selected = selected;
}
}
当我尝试这个时,它没有用。
答案 0 :(得分:3)
实际上,到目前为止,您发布的代码中存在3个严重问题:
缺少<h:form>
。不确定这是否是问题或实际代码的粗心准备。解决方案很明显:将分组UIInput
和UICommand
组件放在独立的<h:form>
中。
在当前的JSF版本中,JSF的范围注释@javax.faces.bean.ViewScoped
不适用于CDI的bean管理注释@Named
。
基本上有3种解决方案:
@ConversationScoped
。另请参阅How to replace @ManagedBean / @ViewScope by CDI in JSF 2.0/2.1以获取具体示例。然而,这会产生令人讨厌的副作用,即它会将cid
请求参数附加到每个结果URL。@ViewScoped
连接到CDI。然而,这会产生令人讨厌的副作用,它会将windowId
请求参数附加到每个结果URL。@javax.faces.view.ViewScoped
注释,将其与JSF视图状态联系起来。
但这不是导致具体问题的原因,因为只应调用bean操作,但bean的行为就像@RequestScoped
。
缺少setter方法。但是,当表单成功提交时,应该向服务器日志抛出一个相当自我解释的PropertyNotWritableException
。
第四种可能的原因无法根据目前提供的信息确认:缺少<h:head>
会导致<f:ajax>
失败,因为所需jsf.js
}无法自动包含。
答案 1 :(得分:1)
你有一个错误的setter导致错误
public void setTest(String test) {
this.selected = selected;
}
这一定是
public void setSelected(String test) {
this.selected = test;
}
另一方面,此setter被称为 h:selectOneMenu value =“#{test.selected}”,当您在组合框中选择某个项目时会触发该
。