【问题标题】:JSF ajax calls supported with ViewScope bean?ViewScope bean 支持 JSF ajax 调用吗?
【发布时间】:2013-03-24 19:35:55
【问题描述】:

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

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

【问题讨论】:

  • 你对“没用”不是很清楚。我将简单地假设您没有看到任何打印到标准输出的内容。将来,请从开发人员的角度而不是最终用户的角度详细说明问题。是否调用了 JS/ajax 函数? (阅读 JS 控制台是否有错误) HTTP 请求是否正确发送? (阅读浏览器开发者工具集中网络部分的 HTTP 流量监控器) bean 是否被构造,方法是否被调用? (放置断点、运行调试器、读取服务器日志以查找异常等)返回的 HTTP 响应的正文包含什么?等等。

标签: java jsf view primefaces updates


【解决方案1】:

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

  1. &lt;h:form&gt; 丢失。不确定这是否是对问题或实际代码的粗心准备。解决方案很明显:将分组的UIInput 和UICommand 组件放在一个独立的&lt;h:form&gt; 中。

  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 发布,以便您可以利用与 JSF 视图状态相关联的 CDI 兼容 @javax.faces.view.ViewScoped 注释。


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

  3. 缺少 setter 方法。然而,当表单成功提交时,这应该会在服务器日志中抛出一个相当不言自明的PropertyNotWritableException。

根据目前提供的信息,还有第四个可能的原因无法确定:缺少&lt;h:head&gt; 会导致&lt;f:ajax&gt; 失败,因为所需的jsf.js 不能是自动的- 包括在内。

【讨论】:

    【解决方案2】:

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

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

    这一定是

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

    另一方面,当您在组合框中选择项目时,会为 h:selectOneMenu value="#{test.selected}" 调用此设置器。

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 2015-07-03
      • 2011-04-04
      相关资源
      最近更新 更多