JSF x JSTL

22 respostas
S

editado por mim mesmo.

22 Respostas

casmeiron

Sim, você pode fazer isso.
Apenas mude sua expressão para #{beans} (utilizando EL), o resto tudo vai fluir normalmente (ou pelo menos deveria).

Flw.

gilliard_santos

JSF e JSTL só são realmente compatíveis a partir do JSF 1.2 e JSP 2.1.
Em versoes inferiores voce possivelmente não vai conseguir acessar seus managed beans por JSTL, o que em alguns casos pode fazer falta. Já que aparentemente voce está começando um projeto agora, te aconselharia já começar na versao 1.2 do JSF.
Usando ele, as expressoes #{} e ${} são interoperáveis, tanto faz usar uma ou outra, mas eu acabao usando #{} pra tudo mais por costume do JSF mesmo.

afamorim

Funciona sim…
mais vc tem que colocar para chamar pelo nome do bean que vc colocou no faces config, assim vc pode acessar todos os metodos reitando as regras do get se set.

felipeguerra

Relembrar é viver!!!

Pessoal, estou com um erro bem parecido:

Dentro da minha tag <h:dataTable>, tenho umas condições para printar uns valores, só que a JSTL não rola com JSF!

Um trecho do código para esclarecer:

&lt;h:dataTable width="100%" value="#{controleUsuarioBean.listUsuario}" var="users" id="listaUsuarios" styleClass="tbl_cont2" headerClass="tr1" columnClasses="w5pc w5pc w20pc w10pc w5pc w10pc w5pc w5pc w20pc w10pc w5pc"&gt;
										&lt;h:column&gt;
											&lt;f:facet name="header"&gt;
												&lt;h:outputText value="Situação" /&gt;
											&lt;/f:facet&gt;
											&lt;c:choose&gt;
												&lt;c:when test="#{users.flagAtivo}"&gt;
													&lt;h:outputText value="Ativo" /&gt;
												&lt;/c:when&gt;
												&lt;c:otherwise&gt;
													&lt;h:outputText value="Inativo" /&gt;
												&lt;/c:otherwise&gt;
											&lt;/c:choose&gt;
										&lt;/h:column&gt;
&lt;/h:dataTable&gt;

Sempre printa Inativo!

Eu tentei printar o valor de users.flagAtivo assim:

&lt;h:outputText value="#{users.flagAtivo}" /&gt;

Mas aí me deparei com isso:

SEVERE: Servlet.service() for servlet Faces Servlet threw exception
org.apache.jasper.el.JspPropertyNotFoundException: /jsf/adm/controle_usuario.jsp(145,13) '#{users.flagAtivo}' Property 'users.flagAtivo' not readable on type boolean
	at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:104)
	at javax.faces.component.UIOutput.getValue(UIOutput.java:184)
	at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:201)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:284)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:154)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:849)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:242)
	at com.sun.faces.renderkit.html_basic.TableRenderer.renderRow(TableRenderer.java:312)
	at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:133)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:825)
	at org.ajax4jsf.framework.renderer.RendererBase.renderChild(RendererBase.java:282)
	at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:159)
	at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:97)
	at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:150)
	at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:97)
	at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:150)
	at org.ajax4jsf.framework.renderer.AjaxContainerRenderer.encodeAjax(AjaxContainerRenderer.java:125)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.encodeAjax(AjaxViewRoot.java:549)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot$4.invokeRoot(AjaxViewRoot.java:380)
	at org.ajax4jsf.framework.ajax.JsfOneOneInvoker.invokeOnRegionOrRoot(JsfOneOneInvoker.java:53)
	at org.ajax4jsf.framework.ajax.AjaxContext.invokeOnRegionOrRoot(AjaxContext.java:191)
	at org.ajax4jsf.framework.ajax.AjaxViewRoot.encodeChildren(AjaxViewRoot.java:397)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
	at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:256)
	at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:187)
	at org.ajax4jsf.framework.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
	at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:233)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:127)
	at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:277)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at br.com.sofisa.pcfi.filter.ControlFilter.doFilter(ControlFilter.java:34)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:595)
felipeguerra

Feliz Ano Novo!

Alguém?

felipeguerra

Nunca ninguém se deparou com isso?

Cheguei num ponto do meu código que isso está complicando mais. Vou ter que mandar uma requisição ajax de campos do tipo text dentro da tag <h:dataTable>, ou seja, terei que mostar uma lista com n usuários, em seguida vou abrir para a edição do admin, assim que ele clicar em salvar, os campos pertinentes ao usuário alterado devem ser submitados com as devidas alterações.

saoj

JSTL é tão bom que não te permite pegar uma propriedade “isflagAtivo”, apenas “getFlagAtivo”.

Não seria isso?

felipeguerra

Não é isso…

felipeguerra

Será que é bug?

Alguém sabe?

felipeguerra

Ninguém sabe…

M

Provavelmente você já deve ter resolvido esse problema, mas aqui vão duas soluções melhores.

Ao invés de usar:

<c:choose>  
	<c:when test="#{users.flagAtivo}">  
		<h:outputText value="Ativo" />  
	</c:when>  
	<c:otherwise>  
		<h:outputText value="Inativo" />  
	</c:otherwise>  
</c:choose>

Utilize:

<h:outputText value="Ativo" rendered="#{users.flagAtivo}" />
<h:outputText value="Inativo" rendered="#{!users.flagAtivo}" />

Ou assim:

<h:outputText value="#{users.flagAtivo ? 'Ativo' : 'Inativo'}" />
felipeguerra

E para várias condições (=ifs encadeados) ?

M

Dê um exemplo que você faria com o jstl.

Eu já usei ifs encadeados dessa maneira:

<h:panelGrid columns="1" width="100%" rendered="#{! empty users.condicao}">
		...
		<h:outputText value="Ativo" rendered="#{users.flagAtivo}" />  
		<h:outputText value="Inativo" rendered="#{!users.flagAtivo}" />
		...
	</h:panelGrid>
felipeguerra

Exemplo:

&lt;c:choose&gt;
   &lt;c:when test="${x eq 1}"&gt;
          ...
   &lt;/c:when&gt;
   &lt;c:when test="${x eq 2}"&gt;
          ...
   &lt;/c:when&gt;
   &lt;c:when test="${x eq 3}"&gt;
          ...
   &lt;/c:when&gt;
          ...
   &lt;c:when test="${x eq 4}"&gt;
           ...
   &lt;/c:when&gt;
   &lt;c:otherwise&gt;
           ...
   &lt;/c:otherwise&gt;
&lt;/c:choose&gt;
M

Dependendo o que você vai querer mostrar na tela, vc pode fazer dessa forma:

<h:panelGrid rendered="#{x == 1}">
        ...
    <h:panelGrid>
    <h:panelGrid rendered="#{x == 2}">
        ...
    <h:panelGrid>
    <h:panelGrid rendered="#{x == 3}">
        ...
    <h:panelGrid>
    <h:panelGrid rendered="#{x == 4}">
        ...
    <h:panelGrid>
    <h:panelGrid rendered="#{x != 1 && x != 2 && x != 3 && x != 4}">
        ...
    <h:panelGrid>

Não sou a favor de utilizar muitas regras na hora de montar a página, mas sei que em determinados momento não tem como e somos obrigados a fazer esse tipo de coisa.

Essa não seria a única forma de resolver esse problema que você está tendo com JSF, existem outras, mas para isso temos que entender o contexto e talvez algumas alterações no MBean resolvemos de uma forma mais elegante.

[]'s
Thiago

peerless

“editado por mim mesmo”

não faz isso ñ!

M

Como você resolveria sem utilizar JSTL peerless?

felipeguerra

Pessoal,

Eu quero esclarecer se realmente há um bug que impede o JSTL (na versão 1.2) de funcionar com o JSF (também na versão 1.2)!!!

Olhem o que ocorre comigo, na minha página, em tempo de projeto, tenho o seguinte código:

&lt;c:out value="${1 eq 1}"&gt;&lt;/c:out&gt;

O que deveria ocorrer? Obviamente imprimir true na página, MAS não é o que ocorre, não é mostrado nada, quando vou examinar o código-fonte, percebo que consta o seguinte código na página:

Ou seja, somente a EL é interpretado. O que pode ser isso?

felipeguerra

Eu gostaria de encerrar esse tópico, mas ninguém da uma força…

felipeguerra

Por favor pessoal,

Gostaria de saber quem já fez o JSF SUN-RI 1.2 funcionar em conjunto com o JSTL 1.2…

Não consigo nem a pau!

Obrigado

felipeguerra

Desisto…

david.laks

oi, estou tendo os mesmos problemas… eu creio que não há mesmo como trabalhar com isso, nao sei bem como resolver ainda, to vendo isso há bem pouco tempo…

bem, se eu souber de algo novo, dps eu coloco aqui.

abraço

Criado 24 de janeiro de 2007
Ultima resposta 5 de abr. de 2008
Respostas 22
Participantes 9