[RESOLVIDO] Dúvida em Rendered do Primefaces Com Ajax

Bom Noite… Tenho fuçado um pouco no JSF com Primefaces e tenho a seguinte dúvida…

Estou utilizando JSF com a biblioteca do Primefaces… Preciso chamar um método através de EL… O problema é que em um momento consigo chamar o método através da EL #{perfilBean.renderizar} e em outro momento preciso chamar utilizando a EL #{perfilBean.renderizar()}. Então minha dúvida é, o porque as vezes ele aceita sem os () especificando que é um método e as vezes não… oO

Exemplo Funcionando:

XHTML

<h:selectOneRadio value=#{perfilBean.perfil} >
<p:ajax listener=#{perfilBean.redirecionar} />
<f:selectItem itemValue=paciente itemLabel=Paciente />
<f:selectItem itemValue=secretaria itemLabel=Secreária(o) />
<f:selectItem itemValue=nutricionista itemLabel=Nutricionista />
<f:selectItem itemValue=labExames itemLabel=Laboratório de Exames />
</h:selectOneRadio>

Código JAVA

/*Método para redirecionar*/

public void redirecionar() {


try {
if (perfil.equals(paciente)) {
FacesContext.getCurrentInstance().getExternalContext().redirect(/Nutrisis/cdPaciente.jsf);
} else if (perfil.equals(secretaria)) {
FacesContext.getCurrentInstance().getExternalContext().redirect(/Nutrisis/cdSecretaria.jsf);
} else if (perfil.equals(nutricionista)) {
FacesContext.getCurrentInstance().getExternalContext().redirect(/Nutrisis/cdNutricionista.jsf);
} else {
FacesContext.getCurrentInstance().getExternalContext().redirect(/Nutrisis/cdLabExames.jsf);
}

} catch (IOException ex) {
Logger.getLogger(PerfilBean.class.getName()).log(Level.SEVERE, null, ex);
}


}

O exemplo abaixo segue exatamente a mesma lógica, mas não funciona. Minha intenção era deixar de ter uma página para cada tipo de perfil e tê-los todos na mesma página, porém renderizando o fildset em questão, apenas quando for selecionado o perfil desejado.

XHTML

<h:selectOneRadio value=#{perfilBean.perfil} >
<p:ajax listener=#{perfilBean.renderizar} /> <!-- Método modificado para renderizar -->
<f:selectItem itemValue=paciente itemLabel=Paciente />
<f:selectItem itemValue=secretaria itemLabel=Secreária(o) />
<f:selectItem itemValue=nutricionista itemLabel=Nutricionista />
<f:selectItem itemValue=labExames itemLabel=Laboratório de Exames />
</h:selectOneRadio>

<p:fieldset legend=Paciente toggleable=true id=paciente 
rendered=#{perfilBean.renderizar} > <!-- Erro informando que a propriedade renderizar não foi localizada -->

<p:fieldset legend=Paciente toggleable=true id=paciente 
rendered=#{perfilBean.renderizar()} > <!-- Carrega página para seleção do perfil, porém ao selecionar o perfil não renderiza o componente -->

Código Java

[code]/Método para renderizar/

public Boolean renderizar() {

if (perfil.equals(paciente))
return true;
return false;
}[/code]

Outro detalhe é que se já deixar o radiobox paciente selecionar por default, ai ele renderiza o componente.

Não é porque na primeira vez que você chama você faz uma requisição ao servidor através de uma chamada ajax.
Daí você envia o valor e retorna ele para o atributo do objeto.
Porém no fieldset rendered=#{perfilBean.renderizar() ele deve fazer isso antes de renderizar,e na primeira vez não sei se você está setando o valor do objeto que se relaciona com esse bean.

Tenta ver se debugando esse método entra.

No seu método de renderizar tem que receber o parâmetro ActionEvent de javax.faces.event.ActionEvent; Provavelmente por isso não esta encontrando seu método.

public Boolean renderizar(ActionEvent event) {  
  
if (perfil.equals(paciente))  
return true;  
return false;  
}  

Mas daí ele não teria que usar um actionListener para mudar o valor do renderizar ?

Bom como ele esta usando <p:ajax listener=#{perfilBean.renderizar} /> para executar o método renderizar(), acho que daria para fazer diferente.

private boolean isRenderiza;

public Boolean getIsRenderiza() {
		return isRenderiza;
	}


public void renderizar() {  
 if (perfil.equals(paciente))  {
isRenderiza = true;
} else {
isRenderiza = false;
}
}

E no JSF

[code]
<h:selectOneRadio value=#{perfilBean.perfil} >
<f:selectItem itemValue=paciente itemLabel=Paciente />
<f:selectItem itemValue=secretaria itemLabel=Secreária(o) />
<f:selectItem itemValue=nutricionista itemLabel=Nutricionista />
<f:selectItem itemValue=labExames itemLabel=Laboratório de Exames />
<p:ajax listener=#{perfilBean.renderizar} update=“paciente” />
</h:selectOneRadio>

<p:fieldset legend=Paciente toggleable=true id=paciente rendered=#{perfilBean.isRenderiza} >[/code]

No exemplo dele ali é chamado o atributo renderizar.
Não o método.
Mas se ambos manipulam o mesmo atributo acho que daria sim.

jtiagoarruda e lele_vader…

Grato pelas respostas… Irei testar de noite e dou um retorno. Obrigado!!!

[quote=lele_vader]No exemplo dele ali é chamado o atributo renderizar.
Não o método.
Mas se ambos manipulam o mesmo atributo acho que daria sim.[/quote]

No exemplo dele, ele atribuindo ao rendered um método renderizar ao contrario do que deve ser feito que no caso um valor boolean. que deve explicito ou pelo um atributo. Pois no exemplo dele renderizar é um método.

[code]
/Método para renderizar/

public Boolean renderizar() {

if (perfil.equals(paciente))
return true;
return false;
} [/code]

[quote=jtiagoarruda]No seu método de renderizar tem que receber o parâmetro ActionEvent de javax.faces.event.ActionEvent; Provavelmente por isso não esta encontrando seu método.

[code]
public Boolean renderizar(ActionEvent event) {

if (perfil.equals(paciente))
return true;
return false;
}
[/code][/quote]

Assim, apresentou erro, informando não encontrar o método.

Advertência: Method not found: com.br.nutrisis.PerfilBean@522ff4.renderizar(javax.faces.event.AjaxBehaviorEvent) javax.el.MethodNotFoundException: Method not found: com.br.nutrisis.PerfilBean@522ff4.renderizar(javax.faces.event.AjaxBehaviorEvent) at com.sun.el.util.ReflectionUtil.getMethod(ReflectionUtil.java:155) at com.sun.el.parser.AstValue.invoke(AstValue.java:231) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) at org.primefaces.component.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:47) at javax.faces.event.AjaxBehaviorEvent.processListener(AjaxBehaviorEvent.java:113) at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:102) at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:760) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:722)

Bom como ele esta usando <p:ajax listener=#{perfilBean.renderizar} /> para executar o método renderizar(), acho que daria para fazer diferente.

private boolean isRenderiza;

public Boolean getIsRenderiza() {
		return isRenderiza;
	}


public void renderizar() {  
 if (perfil.equals(paciente))  {
isRenderiza = true;
} else {
isRenderiza = false;
}
}

E no JSF

[code]
<h:selectOneRadio value=#{perfilBean.perfil} >
<f:selectItem itemValue=paciente itemLabel=Paciente />
<f:selectItem itemValue=secretaria itemLabel=Secreária(o) />
<f:selectItem itemValue=nutricionista itemLabel=Nutricionista />
<f:selectItem itemValue=labExames itemLabel=Laboratório de Exames />
<p:ajax listener=#{perfilBean.renderizar} update=“paciente” />
</h:selectOneRadio>

<p:fieldset legend=Paciente toggleable=true id=paciente rendered=#{perfilBean.isRenderiza} >[/code][/quote]

Com o <p:ajax listener=#{perfilBean.renderizar} update="paciente" /> ao finar do <h:selectOneRadio> simplesmente não acontece nada…

Com ele <p:ajax> no inicio do <h:selectOneRadio>, fico numa situação semelhante à que eu estava… Se (via cache) carrego a página já com o radiobox “paciente” selecionado, ele renderiza, se carrego com ele desmarcado não renderiza, então marco ele e continua sem renderizar (ao menos que eu atualize a página).

O que aconteceu de diferente nesse caso foi que se eu estiver com ele renderizado na página, e fecha-lo devido ao toggleable, quando clico novamente no radiobox “paciente” ele abre o fildset. Mas, renderizar ou não que é bom, até agora nada…

Mas alguma alternativa? oO

Aanderson, segue exemplo

Bean:


@ManagedBean(name="redBean")
@SessionScoped
public class Bean {
	private Integer opcao;
	private Boolean isRederiza = false;
	
	public Boolean getIsRederiza() {
		return isRederiza;
	}
	
	public Integer getOpcao() {
		return opcao;
	}
	public void setOpcao(Integer opcao) {
		this.opcao = opcao;
	}
	public void renderizar() {
		if(getOpcao().equals(1)){
			isRederiza = true;
		} else {
			isRederiza = false;
		}
	}
}

JSF

<h:form id="form1">
		<p:panel style="width:700px;">
			<p:panelGrid id="grade" columns="1">
				<h:selectOneRadio id="radio" value="#{redBean.opcao}" >    
					<f:selectItem itemValue="1" itemLabel="Paciente" />    
					<f:selectItem itemValue="2" itemLabel="Secreária(o)" />    
					<f:selectItem itemValue="3" itemLabel="Nutricionista" />    
					<f:selectItem itemValue="4" itemLabel="Laboratório de Exames" />    
					<p:ajax listener="#{redBean.renderizar}" update=":form1:grade" /> 
				</h:selectOneRadio>
				
				<p:fieldset id="pac" legend="Paciente Selecionado" rendered="#{redBean.isRederiza}">
					<h:outputLabel value="Paciente"/>
				</p:fieldset>
			
			</p:panelGrid>
		</p:panel>
	</h:form>

[quote=jtiagoarruda]Aanderson, segue exemplo

Bean:


@ManagedBean(name="redBean")
@SessionScoped
public class Bean {
	private Integer opcao;
	private Boolean isRederiza = false;
	
	public Boolean getIsRederiza() {
		return isRederiza;
	}
	
	public Integer getOpcao() {
		return opcao;
	}
	public void setOpcao(Integer opcao) {
		this.opcao = opcao;
	}
	public void renderizar() {
		if(getOpcao().equals(1)){
			isRederiza = true;
		} else {
			isRederiza = false;
		}
	}
}

JSF

[code]
<h:form id=“form1”>
<p:panel style=“width:700px;”>
<p:panelGrid id=“grade” columns=“1”>
<h:selectOneRadio id=“radio” value="#{redBean.opcao}" >
<f:selectItem itemValue=“1” itemLabel=“Paciente” />
<f:selectItem itemValue=“2” itemLabel=“Secreária(o)” />
<f:selectItem itemValue=“3” itemLabel=“Nutricionista” />
<f:selectItem itemValue=“4” itemLabel=“Laboratório de Exames” />
<p:ajax listener="#{redBean.renderizar}" update=":form1:grade" />
</h:selectOneRadio>

			<p:fieldset id="pac" legend="Paciente Selecionado" rendered="#{redBean.isRederiza}">
				<h:outputLabel value="Paciente"/>
			</p:fieldset>
		
		</p:panelGrid>
	</p:panel>
</h:form>

[/code][/quote]

Agradeço a ajuda… Funcionou direitinho agora…

Analisando o código, em relação a sua sugestão anterior, identifiquei que o problema era no update=“paciente” (atualizando o fildset)… Alterei o update para atualizar o formulário, assim como seu último exemplo e funcionou perfeitamente… Novamente, obrigado a ajuda!!!