Popular combobox com JSTL

10 respostas
williamdasflores

Tenho uma aplicação web aqui que está usando scriplets na view. Preciso substituir esses scriplets por JSTL.
Eu não manjo de JSTL e eu tenho uma combobox que é populada do banco de dados quando a página é carregada.
Eu possuo um método que retorna uma list com os dados

public static List<Cursos> listCursos()
    {
    	try{
    		RequisicaoDAO dao = new RequisicaoDAO();
    		List<Cursos> listCursos = dao.getListCursos();
    		return listCursos;
    	}catch(Exception e){
    		e.printStackTrace();
    		return null;
    	}
    }

Hoje eu tenho um scriplet que chama esse método na View para popular a combobox
Eu tinha feito com JSTL mas não deu certo.

<jsp:useBean id="listarCursos" class="br.com.sistemaunicid.controller.ServletRequisicao"/>
<tr>
	<td><font face="Verdana, Arial, Helvetica, sans-serif" size="2"> *Curso: </font></td>
	<td>
		<select name = "cmbCurso" id = "cmbCurso" style = "width: 270px;">
			<option selected="selected">--Selecione--</option>
			<c:forEach var="cursos" items="listarCursos.listCursos">
				<option value="${cursos.codCurso}">${cursos.nomeCurso}</option>
			</c:forEach>
			</select>
	</td>
</tr>

10 Respostas

drsmachado

Uma dica muito importante, quando abrir um tópico, por favor, indique qual o motivo pelo qual a coisa não deu certo. Erro, exception, não roda, etc. Forneça detalhes. Quanto mais informações passar, melhor e mais rápidas serão as respostas.
Para usar JSTL você precisa dos jars desta API. Caso contrário, não conseguirá mesmo.

williamdasflores

drsmachado,
Eu já tenho os jars da API.
Vou postar minha DAO que pega os dados do banco

public List<Cursos> getListCursos() throws Exception
	{
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Cursos> listCursos = new ArrayList<Cursos>();
		try{
			String SQL = "SELECT * FROM tbl_curso";
			conn = this.conn;
			ps = conn.prepareStatement(SQL);
			rs = ps.executeQuery();
			while(rs.next())
			{
				Integer codCurso = rs.getInt(1);
				String nomeCurso = rs.getString(2);
				String tipoCurso = rs.getString(3);
				listCursos.add(new Cursos(codCurso, nomeCurso, tipoCurso));
			}
			return listCursos;
		}catch(Exception e){
			throw new Exception("Erro no método getListCursos() na classe RequesicaoDAO "+e.getMessage());
		}finally{
			ConnectionFactory.closeConnection(conn, ps, rs);
		}
	}

Segue a exception lançada ao carregar página

SEVERE: Servlet.service() for servlet [jsp] in context with path [/Sistema-UNICID] threw exception [javax.el.PropertyNotFoundException: Property 'codCurso' not found on type java.lang.String] with root cause
javax.el.PropertyNotFoundException: Property 'codCurso' not found on type java.lang.String
	at javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:237)
	at javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:214)
	at javax.el.BeanELResolver.property(BeanELResolver.java:325)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:85)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:985)
	at org.apache.jsp.cadastrarTutoria_jsp._jspx_meth_c_005fforEach_005f0(cadastrarTutoria_jsp.java:310)
	at org.apache.jsp.cadastrarTutoria_jsp._jspService(cadastrarTutoria_jsp.java:171)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)
J

posta o código da classe cursos, pela stacktrace é q falta o método getCurso

Hebert_Coelho

O erro diz que não conseguiu achar codCurso dentro de Cursos. Você tem um get/set para codCurso?

Property ‘codCurso’ not found on type java.lang.String

drsmachado

jakefrog:
O erro diz que não conseguiu achar codCurso dentro de Cursos. Você tem um get/set para codCurso?
Property ‘codCurso’ not found on type java.lang.String

Na verdade, você está tentando obter o valor de uma propriedade codCurso de uma variável que é identificada como sendo objeto da classe String.
Isso significa que você está lendo a variável errada.
Como você constrói os atributos que passa para que o JSTL capture?
Note que o problema não está na DAO, mas entre a Servlet e a jsp.

williamdasflores

Minha classe Curso é uma bean.
Hoje com os scriplets eu chamo esse método static listCursos na minha View. Mais ou menos assim:

<select name="cmbCurso">
<%
List<Cursos> lista = ServletRequisicao.listCursos();
for(Cursos curso : lista){%>
 <option value=<%=curso.getCodCurso%>><%=curso.getNomeCurso%></option>
}%>
</select>
Hebert_Coelho

Não seria curso.getCodCurso() ao invés de apenas curso.getCodCurso?

drsmachado
williamdasflores:
Minha classe Curso é uma bean. Hoje com os scriplets eu chamo esse método static listCursos na minha View. Mais ou menos assim:
<select name="cmbCurso">
<%
List<Cursos> lista = ServletRequisicao.listCursos();
for(Cursos curso : lista){%>
 <option value=<%=curso.getCodCurso%>><%=curso.getNomeCurso%></option>
}%>
</select>
Olha só, tenta entender o seguinte
//na servlet
List<Curso> cursos = metodoQueDevolveListaDeCursos();
HttpSession sessao = request.getSession();
sessao.setAttribute("cursos", cursos);
response.sendRedirect("minhaJsp.jsp");
Isso é o que você faz para colocar um objeto como atributo, certo? Seja sessão ou request.
<!-- na jsp -->
<c:forEach items="cursos" id="curso">
   <tr>
      <td>
         ${curso.id}  
      </td>
      <td>
         ${curso.nome}  
      </td>
   </tr>
</c:forEach>
Isso faz você iterar sobre os cursos e ir escrevendo cada propriedade dele. Manjou?
williamdasflores

Certo drsmachado entendi.
Agora só mais uma dúvida, como eu tinha dito essa combobox precisa ser populada assim que a página é carregada. O código da servlet eu coloco dentro de um método “service” ou posso utilizar o mesmo método que estou usando?
Como eu faço a chamada desse método na minha view para que a combobox seja populada ao carregar a página?

drsmachado

Para que os objetos estejam disponíveis para a jsp, é preciso que a servlet seja chamada antes e redirecione a requisição, depois de ter realizado as consultas necessárias e tratamentos devidos.
Independente do que você implementa da servlet para cima, ela deve ser chamada e dela deve partir o redirecionamento para a respectiva jsp.

Então, seria algo assim

Requisição --> Servlet --> jsp

Criado 6 de maio de 2012
Ultima resposta 7 de mai. de 2012
Respostas 10
Participantes 4