2013-04-03 55 views
1

ViewScope bean允许ajax调用吗?支持ViewScope bean的JSF 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豆:

@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

你对“没有工作”不是很清楚。我会简单地假设你没有看到任何打印到stdout的东西。将来,请从开发者的角度而不是从最终用户的角度来阐述问题。 JS/ajax函数是否被调用? (阅读JS控制台的错误)HTTP请求是否正确发送? (阅读浏览器的开发人员工具集的网络部分中的HTTP流量监视器)是否构建了bean并调用了方法? (放置断点,运行调试器,读取异常的服务器日志等)返回的HTTP响应的主体包含什么?等等.. – BalusC

回答

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


    但是,这是很难的具体问题作为bean行动的原因应该只被调用,但豆只会像一个@RequestScoped

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

还有第四种可能的原因,不能是肯定的基础上迄今为止所提供的信息予以确认:缺少<h:head>会导致<f:ajax>失败,因为所需的jsf.js不能自动纳入。

1

你有一个错误的二传手这将导致错误

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

这必须是

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

作为边没有,此setter被调用H:selectOneMenu用于值=“#{测试.selected}“当您的组合框中选择一个项目时会触发它。