IF no JSF, tem como?

Olá Pessoal,
Estou com uma dúvida, existe a possibilidade de utilizar a condicional IF no JSP com o JSF?
Quero fazer como no Velocity, algo +/- assim:

#IF(condicional)
   //código
#END

[]´s

A proposta do JSF não é a mesma do JSP.
Programar páginas JSP tradicional é mais ou menos como gerar um arquivo de texto.
Programar páginas com JSF é mais parecido com construir uma interface desktop via drag and drop.

Com JSF/JSP dá pra jogar com os atributos rendered dos componentes UI

Com JSF/Facelets dá para usar algumas tags da biblioteca JSTL core, detre elas, o <c:if>

Não sei se é isso que vc quer … mas pra usar código java no JSP, basta inserir as Tags <% %> .
Exemplo de uma index.jsp:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>CBCR</title>
</head>
<body>
<h1></h1>
 
<%
if (request.isUserInRole("Lan"))
	response.sendRedirect("combatLan/index.jsp");
if (request.isUserInRole("Curriculo"))
	response.sendRedirect("curriculo/index.jsp");
else
	out.print("Menu não definido");
%>
</body>
</html>

no JSF essas condições são aplicadas diretamente nas propriedades do objeto, por exemplo:

<h:selectOneMenu value="#{bean.estado}" rendered="#{bean.exibeEstado}"> <f:selectItems value="#{bean.listaEstados}" /> </h:selectOneMenu>
no jsp, em vez rendered="#{bean.exibeEstado}" seria:

<c:if test='${bean.exibeEstado}'> <select>...

Bém pessoal isso também pode ajudar:

<f:verbatim rendered="#{item.ativo == true}">
    <h:outputText value="Sim" />
</f:verbatim>
<f:verbatim rendered="#{item.ativo == false}">
     <h:outputText value="Não" />
</f:verbatim>

amigo, você pode fazer a condição direto, assim:


<h:outputText rendered="#{item.ativo == true}" value="Sim" />  
<h:outputText rendered="#{item.ativo == false}" value="Não" />  

Eu acho que fica mais arrumadinho :wink:

3 curtidas

Estou com o problema ao usar rendered. Tenho um componente facelet que gostaria de usar para incluir na tela campos de qualquer tipo (texto, data, senha, número).

<ui:fragment rendered="#{cc.attrs.password}"> <h:inputSecret id="#{cc.attrs.id}" value="#{cc.attrs.value}" onkeypress="#{cc.attrs.onkeypress}" onkeyup="#{cc.attrs.onkeyup}" onblur="#{cc.attrs.onblur}" required="#{cc.attrs.required}" maxlength="#{cc.attrs.maxlength}" rendered="#{cc.attrs.render}" readonly="#{cc.attrs.readonly}" disabled="#{cc.attrs.disabled}"/> </ui:fragment> <ui:fragment rendered="#{not cc.attrs.password}"> <h:inputText id="#{cc.attrs.id}" value="#{cc.attrs.value}" onkeypress="#{cc.attrs.onkeypress}" onkeyup="#{cc.attrs.onkeyup}" onblur="#{cc.attrs.onblur}" required="#{cc.attrs.required}" maxlength="#{cc.attrs.maxlength}" readonly="#{cc.attrs.readonly}" disabled="#{cc.attrs.disabled}"/> </ui:fragment>

Ao rodar esse código, tenho o erro:

[color=red]A ID de componente form:login:login já foi encontrada na visualização.[/color]

Alguém sabe me ajudar? O c:if não funciona também.

id="#{cc.attrs.id}"

Esse is não é o id do objeto e sim o id do componente, não podem ter 2 componentes na tela com o mesmo id

Por isso que eu queria usar o if, pois eu preciso listar o componente apenas uma vez.

Carinha, dá pra usar o if sim, você está usando facelets, certo? Vários métodos da tag library padrão do struts funcionam. Inclusive <c:if> e <c:choose>. Ó só:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich" xmlns:a4j="http://richfaces.org/a4j" xmlns:f="http://java.sun.com/jsf/core"

repare que tem que adicionar o xmlns:c aí de cima para chamar as tag libraries.

Daí você pode colocar algo assim no código:
<c:if test="${ex != null }">Boom deu boom, mas eu peguei!</c:if>

As tags <c: que reconhecidamente funcionam, e que testei no JBoss 7 são: <c:choose>, <c:when>, <c:otherwise>, <c:if>. A tag <c:catch> aparentemente está com pau, mas nada na especificação de Java Server Faces diz que não deve ser suportada.

Pessoalmente, eu uso <c:choose> para colocar informações internacionalizadas personalizadas no meu site, ou seja, que não são simples traduções palavra-a-palavra.

<ui:define name="content">
	<h1>#{messages['#TODO: tipicamente o mesmo que o título']}</h1>
	<c:choose>
		<c:when test="#{preferences.language=='pt'}" >
		Material em portguês
		</c:when>
		<c:otherwise>
		English material
		</c:otherwise>
	</c:choose> 

Havia dado erro no meu facelet componente quando tentei primeira vez, ai não usei mais. Vou tentar denovo à noite.

[quote=jo-souza]amigo, você pode fazer a condição direto, assim:


<h:outputText rendered="#{item.ativo == true}" value="Sim" />  
<h:outputText rendered="#{item.ativo == false}" value="Não" />  

Eu acho que fica mais arrumadinho :wink: [/quote]

Valeu Jô, sou novato em JSF e a dica funcionou maravilhosamente bem.

[quote=jo-souza]amigo, você pode fazer a condição direto, assim:


<h:outputText rendered="#{item.ativo == true}" value="Sim" />  
<h:outputText rendered="#{item.ativo == false}" value="Não" />  

Eu acho que fica mais arrumadinho :wink: [/quote]

Funciona perfeito e mto prático o código…

Mto obrigado…

:wink:

fióte, assim é melhor:

	&lt;h:outputLabel value="#{i.stAtivo == true ? 'sim': 'não'}"  /&gt;