1

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

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

4

2 回答 2

3

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

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

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

    基本上有3种解决方案:

    • 请改用 CDI @ConversationScoped。有关具体示例,另请参阅如何在 JSF 2.0/2.1 中用 CDI 替换 @ManagedBean / @ViewScope 。然而,这有一个令人讨厌的副作用,即它将cid请求参数附加到每个结果 URL。
    • 使用MyFaces CODI将 JSF@ViewScoped连接到 CDI。然而,这有一个令人讨厌的副作用,即它将windowId请求参数附加到每个结果 URL。
    • 等待 JSF 2.2 发布,这样您就可以利用 CDI 兼容@javax.faces.view.ViewScoped注解将它与 JSF 视图状态联系起来。


    然而,这几乎不是您具体问题的原因,因为应该只调用 bean 操作,但 bean 的行为就像@RequestScoped.

  3. 缺少 setter 方法。PropertyNotWritableException然而,当表单成功提交时,这应该对服务器日志产生相当不言自明的解释。

根据目前提供的信息,还有第四个可能的原因无法确定:丢失<h:head>会导致<f:ajax>失败,因为jsf.js无法自动包含所需的内容。

于 2013-04-03T11:47:48.670 回答
1

你有一个错误的设置器导致错误

public void setTest(String test) {
    this.selected = selected;
}

这必须是

public void setSelected(String test) {
    this.selected = test;
}

另一方面,这个设置器被称为h:selectOneMenu value="#{test.selected}",当您在组合框中选择一个项目时会触发它。

于 2013-04-03T08:28:43.653 回答