我正在尝试在我的项目中发出ajax请求,但我没有成功。
我创建了一个带有 selectoneradio 的 xhtml 页面,我想使用AJAX来呈现 panelgrid 。
<h:selectOneRadio id="tcliente" value="#{clienteMB.tipoCliente}">
<f:ajax execute="@form" render="sessaoDados" listener=#{cadastroClienteRendererMB.testar}" />
<f:selectItems value="#{clienteMB.itemValuesTipoCliente}" />
</h:selectOneRadio>
我的被管理员:
@ManagedBean<br>
@ViewScoped<br>
public class CadastroClienteRendererMB implements Serializable {<br>
...
public void testar() {
System.out.println("teste");
if (panel == null)
panel = new HtmlPanelGrid();
HtmlOutputText text = new HtmlOutputText();
text.setValue("teste");
panel.getChildren().add(text);
}
}
我用Google搜索了这个问题,但我所遵循的所有答案都没有解决这个问题。我咨询的最后一个问题是: valueChangeListener is not getting called from <h:selectOneRadio> which is placed in side a <h:panelGrid>
对不起,请第一次使用这个论坛,我需要一些帮助或指导。
谢谢和问候
答案 0 :(得分:3)
严格回答您的问题,您不需要像在代码中一样在控制器中创建UIComponent实例以使ajax工作。
调用f:ajax
将导致在您指定的事件中调用控制器属性的setter。如果未指定任何事件,则将调用该类UIComponent的默认事件。对于h:selectOneRadio
,它是valueChange
事件。
无论如何,您需要为f:selectItems
提供正确的项目值。如果要设置的属性是字符串,则项值应为字符串。如果属性是您定义的自定义类型,则应创建转换器以相应地转换值。
在此测试中,我们设置的值是一个字符串,因此我们不需要转换器。
我为您创建了一个小型测试应用程序:
控制器
@ManagedBean
@ViewScoped
public class TestController implements Serializable
{
private static final long serialVersionUID = 1L;
private String teste;
public String getTeste()
{
return teste;
}
public void setTeste(String teste)
{
this.teste = teste;
}
}
页
<h:form>
<h:panelGrid id="meuGrid" columns="2">
<h:outputText value="Servidor" />
<h:selectOneRadio id="teste" value="#{testController.teste}">
<f:selectItem itemLabel="JBoss AS7" itemValue="AS7" />
<f:selectItem itemLabel="GlassFish" itemValue="GF3" />
<f:ajax execute="@this" render="resultado" />
</h:selectOneRadio>
<h:outputText value="Selecionado" />
<h:outputText id="resultado" value="#{testController.teste}" />
</h:panelGrid>
</h:form>
那就是它。