Dúvida: if com jstl

9 respostas
flavio-mendes

Galera boa noite!
Estou tentando implementar uma página JSP a nível de aprendizado, que lista uma série de informações sobre uma empresa retornadas de um BD, tenho o método DAO que me retorna essas informações que recupero na página JSP através de um JavaBean que chama o método de listagem do DAO. Partindo de um ponto de vista que o método pode me retornar uma lista vazia, usei uma tag JSTL do tipo “if”. Entendi perfeitamente como funciona esta estrutura condicional, e que não existe “else” para ela. Sendo assim, criei 2 ifs, um para mostrar uma linha na tabela caso a lista retornada seja vazia, e caso venha populada, me exibir os dados populando a tabela. Porém, quando uso esses 2 ifs ao mesmo tempo na minha JSP, é retornada uma página de erro (o console apenas apresenta erro do tipo RuntimeException de origem do catch do meu metodo getLista() da classe EmpresaDAO), mas quando uso um ou outro a página funciona, porém não me traz o resultado desejado que é ter as 2 condições ao mesmo tempo. Poderiam me ajudar a uma solução que eu possa ter essas minhas 2 condições funcionando ao mesmo tempo? Eu achei isso bizarro e não consegui evoluir. Segue abaixo a estrutura do meu código:

JSP:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
	<head><title>HelPrint - Lista Empresa</title></head>
		<body>
			<jsp:useBean id="dao" class="br.com.flavio.suprimentos.dao.EmpresaDAO"/>
				<h1>Informações da Empresa</h1>
				
				<table>
					<c:if test="${empty dao.lista}">
						<tr><td><font color="red">Nenhuma empresa cadastrada no momento!</font></td></tr>
					</c:if>
									
					<c:if test="${not empty dao.lista}">
						<c:forEach var="empresa" items="${dao.lista}">
							<tr>
								<td><b>ID:</b></td>
								<td>${empresa.idEmpresa}</td>
							</tr>
							<tr>
								<td><b>Razão Social:</b></td>
								<td>${empresa.razaoSocial}</td>
							</tr>
							<tr>
								<td><b>Nome Fantasia:</b></td>
								<td>${empresa.nomeFantasia}</td>
							</tr>
							<tr>
								<td><b>CNPJ:</b></td>
								<td>${empresa.cnpj}</td>
							</tr>
							<tr>
								<td><b>Inscrição Estadual:</b></td>
								<td>${empresa.inscrEstadual}</td>
							</tr>
							<tr>
								<td><b>Endereço:</b></td>
								<td>${empresa.endereco}</td>
							</tr>
							<tr>
								<td><b>Bairro:</b></td>
								<td>${empresa.bairro}</td>
							</tr>
							<tr>
								<td><b>Cidade:</b></td>
								<td>${empresa.cidade}</td>
							</tr>
							<tr>
								<td><b>Estado:</b></td>
								<td>${empresa.estado}</td>
							</tr>
							<tr>
								<td><b>CEP:</b></td>
								<td>${empresa.cep}</td>
							</tr>
							<tr>
								<td><b>Telefone:</b></td>
								<td>${empresa.telefone}</td>
							</tr>
							<tr>
								<td><b>Fax:</b></td>
								<td>${empresa.fax}</td>
							</tr>
							<tr>
								<td><b>Site:</b></td>
								<td>${empresa.site}</td>
							</tr>
							<tr>
								<td><a href="altera-empresa.jsp?idEmpresa=${empresa.idEmpresa}">Alterar Cadastro</a></td>
								<td><a href="exclui-empresa.jsp?idEmpresa=${empresa.idEmpresa}">Excluir Cadastro</a></td>
							</tr>
							<tr><td><br/></td></tr>
							<tr><td><br/></td></tr>
						</c:forEach>
					</c:if>					
				</table>
		</body>
</html>

Trecho do método DAO:

public List<Empresa> getLista(){
			String consulta = "SELECT * FROM empresa";
		try {
			PreparedStatement stmt = conn.prepareStatement(consulta);
			ResultSet rs = stmt.executeQuery();
			List<Empresa> listaEmpresa = new ArrayList<Empresa>();
			
			while(rs.next()){
				Long idEmpresa = rs.getLong("idEmpresa");
				String razaoSocial = rs.getString("razaoSocial");
				String nomeFantasia = rs.getString("nomeFantasia");
				String cnpj = rs.getString("cnpj");
				String inscrEstadual = rs.getString("inscrEstadual");
				String endereco = rs.getString("endereco");
				String bairro = rs.getString("bairro");
				String cidade = rs.getString("cidade");
				String estado = rs.getString("estado");
				String cep = rs.getString("cep");
				String telefone = rs.getString("telefone");
				String fax = rs.getString("fax");
				String site = rs.getString("site");
				
				Empresa empresa = new Empresa();
				empresa.setIdEmpresa(idEmpresa);
				empresa.setRazaoSocial(razaoSocial);
				empresa.setNomeFantasia(nomeFantasia);
				empresa.setCnpj(cnpj);
				empresa.setInscrEstadual(inscrEstadual);
				empresa.setEndereco(endereco);
				empresa.setBairro(bairro);
				empresa.setCidade(cidade);
				empresa.setEstado(estado);
				empresa.setCep(cep);
				empresa.setTelefone(telefone);
				empresa.setFax(fax);
				empresa.setSite(site);
				
				listaEmpresa.add(empresa);
			}
			
			rs.close();
			stmt.close();
			conn.close();
			return listaEmpresa;
			
		} catch (SQLException e) {
			throw new RuntimeException();
		}			
	}

Agradecido desde já!

9 Respostas

C

Olá…

Na verdade, é possível trabalhar com “if / else” em JSTL.

Tente a implementação abaixo:

<c:choose>
  <c:when test="${bean.value}">
    <!-- Codigo... -->
  </c:when>
      
  <c:otherwise>
    <!-- Codigo -->
  </c:otherwise>
</c:choose>

T+!

kilate

Na verdade esse <c:choose> é a mesma implementação do Switch case.

Amigo, posta a exception que deu.

Abraço.

flavio-mendes

Opa!
CJDJ, eu testei o seu choose, funcionou parcialmente, quando minha lista está vazia ele seleciona a opção de lista vazia e executa a instrução, ok. Agora quando a lista está carregada de algum valor do BD a página retornada é de erro, já no caso de utilizar os 2 ifs, o erro ocorre em qualquer uma das situações! kilate, segue a exception para o caso dos 2 ifs:

19/02/2012 22:51:21 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.RuntimeException
	at br.com.flavio.suprimentos.dao.EmpresaDAO.getLista(EmpresaDAO.java:135)
	at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:83)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:123)
	at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:45)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:938)
	at org.apache.jsp.lista_002dempresa_jsp._jspx_meth_c_005fif_005f1(lista_002dempresa_jsp.java:268)
	at org.apache.jsp.lista_002dempresa_jsp._jspService(lista_002dempresa_jsp.java:83)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	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:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	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:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)

Obrigado!

kilate

Você está usando java puro? Poderia criar uma servlet, fazer esse teste e depois enviar um parâmetro para a jsp. :wink:
Abraço!

flavio-mendes

Estou acessando diretamente a classe DAO através de um JavaBean no JSP, achei até mais simples fazer desta forma. Há alguma alternativa para acertar esse meu código ou não tem jeito, devo usar outra alternativa como usar a Servlet e passar parametro para a jsp?

Obrigado! Abraço!

kilate

É, eu recomendo você fazer isso. Até porque não é muito boa prática criar objetos na view.
Abraços!

flavio-mendes

E ai kilate beleza? cara eu consegui achar a origem do problema. A minha classe DAO trabalha com apenas uma conexão aberta para todos os métodos, sendo assim, quando instancio a bean DAO e chamo o método getLista() através do primeiro if, quando este temina, a conexão fecha e assim o segundo if tenta chamar o mesmo método, só que a conexão já foi fechada. Eu cheguei a essa conclusão depois de analisar melhor a estrutura do meu método e no ponto da exception retornada, retirei o close da conexão, dai sim funcionou tudo beleza com 2 ifs. Mais é claro que vou tratar isso no meu caso, provavelmente usando filtros, mais ai já é outra história. Cara eu achei interessante essa sua idéia de usar a servlet, eu poderia até implementar isso mapeando uma servlet só para carregar a JSP de listar empresa, porém isso não entraria no padrão MVC, já que estou usando esse padrão com uma classe controladora para que todas as requisições passem antes por ela. Porém eu não consegui abstrair uma forma que a minha JSP carregue essa Servlet no momento da requisição da página lista-empresa.jsp. Você poderia me dar um exemplo de como posso fazer? Pois pra outras páginas é mais simples, pois eu chamo a servlet controladora ao enviar uma requisição através de formulários, neste caso seria junto com o carregamento da JSP.

Muito obrigado!

kilate

Opa! É mesmo, não tinha parado pra analisar isso. Muito bem pensado!
Quanto o esquema da servlet, eu não entendi muito bem o que você quer fazer. Mas uma outra opção seria criar um objeto com escopo de aplicação. Utilizando o método estático da classe HttpServlet getServletContext. Assim:

getServletContext().setAttribute("lista", new EmpresaDAO().getLista());

e, na jsp:

<%

List<Empresa> lista = getServletContext().getAttribute("lista");

%>

ou, se preferir, pode resgatar o objeto também com EL:

${lista}

Objetos com escopo de aplicação são objetos resgatáveis em todo contexto de sua aplicação.

Abraços!

flavio-mendes

Opa e ai beleza?

Cara a sua dica serviu bem para o meu problema, matou a charada! Eu usei essa sua logica dentro do meu filtro de conexão, já que com o filtro eu tenho que centralizar todas as conexões em um único lugar, inclusive para instanciar meus objetos DAO quando não passam por uma Servlet, como eu queria neste caso. Setei o atributo, chamei ele na minha JSP, carregou a lista, beleza!

Muito obrigado!

Criado 19 de fevereiro de 2012
Ultima resposta 21 de fev. de 2012
Respostas 9
Participantes 3