使用ViewScope bean支持JSF ajax调用?

时间:2013-04-03 08:20:56

标签: java jsf view primefaces updates

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;
    }
}

当我尝试这个时,它没有用。

2 个答案:

答案 0 :(得分:3)

实际上,到目前为止,您发布的代码中存在3个严重问题:

  1. 缺少<h:form>。不确定这是否是问题或实际代码的粗心准备。解决方案很明显:将分组UIInputUICommand组件放在独立的<h:form>中。

  2. 在当前的JSF版本中,JSF的范围注释@javax.faces.bean.ViewScoped不适用于CDI的bean管理注释@Named

    基本上有3种解决方案:

    • 请改用CDI的@ConversationScoped。另请参阅How to replace @ManagedBean / @ViewScope by CDI in JSF 2.0/2.1以获取具体示例。然而,这会产生令人讨厌的副作用,即它会将cid请求参数附加到每个结果URL。
    • 使用MyFaces CODI将JSF @ViewScoped连接到CDI。然而,这会产生令人讨厌的副作用,它会将windowId请求参数附加到每个结果URL。
    • 等待JSF 2.2发布,以便您可以使用CDI兼容的@javax.faces.view.ViewScoped注释,将其与JSF视图状态联系起来。


    但这不是导致具体问题的原因,因为只应调用bean操作,但bean的行为就像@RequestScoped

  3. 缺少setter方法。但是,当表单成功提交时,应该向服务器日志抛出一个相当自我解释的PropertyNotWritableException

  4. 第四种可能的原因无法根据目前提供的信息确认:缺少<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}”,当您在组合框中选择某个项目时会触发该