editado por mim mesmo.
JSF x JSTL
22 Respostas
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.
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.
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.
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:
<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">
<h:column>
<f:facet name="header">
<h:outputText value="Situação" />
</f:facet>
<c:choose>
<c:when test="#{users.flagAtivo}">
<h:outputText value="Ativo" />
</c:when>
<c:otherwise>
<h:outputText value="Inativo" />
</c:otherwise>
</c:choose>
</h:column>
</h:dataTable>
Sempre printa Inativo!
Eu tentei printar o valor de users.flagAtivo assim:
<h:outputText value="#{users.flagAtivo}" />
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)
Feliz Ano Novo!
Alguém?
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.
JSTL é tão bom que não te permite pegar uma propriedade “isflagAtivo”, apenas “getFlagAtivo”.
Não seria isso?
Não é isso…
Será que é bug?
Alguém sabe?
Ninguém sabe…
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'}" />
E para várias condições (=ifs encadeados) ?
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>
Exemplo:
<c:choose>
<c:when test="${x eq 1}">
...
</c:when>
<c:when test="${x eq 2}">
...
</c:when>
<c:when test="${x eq 3}">
...
</c:when>
...
<c:when test="${x eq 4}">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
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
“editado por mim mesmo”
não faz isso ñ!
Como você resolveria sem utilizar JSTL peerless?
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:
<c:out value="${1 eq 1}"></c:out>
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?
Eu gostaria de encerrar esse tópico, mas ninguém da uma força…
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
Desisto…
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