Pesquisei em vários lugares e não achei oque queria. Preciso listar atributos de tabelas diferentes através de um formulário JSP usando JSTL. Ele precisa cadastrar os atributos do formulário que pertence a várias tabelas e depois listar.Está cadastrando no baco pq conferi, mas quando vai listar no JSP não pega os atributos.
Esse é meu formulário que faz o cadastro cadastro.jsp
<div id="main" class="container-fluid">
<h3 class="page-header">Cadastrar Monografia</h3>
<form action="mvc">
<input type="hidden" name="logica" value="GravaMonografiaLogic">
<input type="hidden" name="idMonografia" value="${monografia.idMonografia}">
<!-- area de campos do form -->
<div class="row">
<div class="form-group col-md-4">
<label for="aluno">Aluno</label> <input type="text" name="aluno"
class="form-control" id="aluno" value="${monografia.getAluno().getNome()}">
</div>
<div class="form-group col-md-4">
<label for="orientador">Orientador</label> <input type="text" name="orientador"
class="form-control" id="orientador" value="${monografia.getProfessor().getNome()}">
</div>
<!-- <div class="form-group col-md-4">
<label for="coorientador">Co-Orientador</label> <input type="text" name="coorientador"
class="form-control" id="coorientador" value="${aluno.professor}">
</div>
</div>-->
<div class="row">
<div class="form-group col-md-4">
<label for="titulo">Título</label> <input type="text" name="titulo" class="form-control" id="titulo" value="${monografia.titulo}">
</div>
<hr />
<div id="actions" class="row">
<div class="col-md-12">
<button type="submit" class="btn btn-primary">Salvar</button>
<a href="mvc?logica=ListaMonografiaLogic" class="btn btn-default">Cancelar</a>
</div>
</div>
</form>
</div>
Esse é minha classe com o método public List getLista() que faz o SELECT
public class MonografiaDao {
//Conexão com o banco
private Connection connection;
public MonografiaDao(){
this.connection = new ConnectionFactory().getConnection();
//Método Listar
public List<Monografia> getLista() throws SQLException{
PreparedStatement stmt = this.connection.prepareStatement("select * from monografia inner join professor on professor_idProfessor = idProfessor inner join aluno on aluno_idAluno = idAluno ");
ResultSet rs = stmt.executeQuery();
List<Monografia> monografias = new ArrayList<Monografia>();
while(rs.next()){
//criando o objeto monografia
Monografia monografia = new Monografia();
monografia.setIdMonografia(rs.getInt("idMonografia"));
monografia.setTitulo(rs.getString("titulo"));
monografia.setAluno(rs.getString("nome"));
/*Aluno aluno = new Aluno();
aluno.setIdAluno(rs.getInt("idAluno"));
aluno.setNome(rs.getString("nome"));
Professor professor = new Professor();
professor.setIdProfessor(rs.getInt("idProfessor"));
professor.setNome(rs.getString("nome"));*/
//adicionando o objeto na lista
monografias.add(monografia);
}
rs.close();
stmt.close();
return monografias;
}
Depois de cadastrar ele passa por essa lógica GravaMonografiaLogic
package br.com.daniel.mvc.logica;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import br.com.daniel.sistemamono.dao.MonografiaDao;
import br.com.daniel.sistemamono.modelo.Aluno;
import br.com.daniel.sistemamono.modelo.BancaDefesa;
import br.com.daniel.sistemamono.modelo.Monografia;
import br.com.daniel.sistemamono.modelo.Professor;
public class GravaMonografiaLogic implements Logica {
@Override
public String executa(HttpServletRequest req, HttpServletResponse res) throws Exception{
int idMonografia = 0;
int idProfessor = 0;
int idAluno = 0;
if(req.getParameterMap().containsKey("idMonografia") && !req.getParameter("idMonografia").isEmpty())
idMonografia = Integer.parseInt(req.getParameter("idMonografia"));
String titulo = req.getParameter("titulo");
Monografia monografia = new Monografia();
monografia.setIdMonografia(idMonografia);
monografia.setTitulo(titulo);
String orientador = req.getParameter("orientador");
Professor professor = new Professor();
professor.setIdProfessor(idProfessor);
professor.setNome(orientador);
String nomeAluno = req.getParameter("aluno");
Aluno aluno = new Aluno();
aluno.setIdAluno(idAluno);
aluno.setNome(nomeAluno);
BancaDefesa bancaDefesa = new BancaDefesa();
//salva a monografia
MonografiaDao dao;
try{
dao = new MonografiaDao();
if(monografia.getIdMonografia()==0)
dao.adiciona(monografia, aluno, professor, bancaDefesa);
else
dao.altera(monografia);
}catch (Exception e) {
e.printStackTrace();
}
return "mvc?logica=ListaMonografiaLogic";
}
Depois passa pela lógica ListaMonografiaLogic
package br.com.daniel.mvc.logica;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import br.com.daniel.sistemamono.dao.*;
import br.com.daniel.sistemamono.modelo.*;
public class ListaMonografiaLogic implements Logica {
@Override
public String executa(HttpServletRequest req, HttpServletResponse res) throws Exception{
// Monta a lista de contatos
List<Monografia> monografias = new MonografiaDao().getLista();
// Guarda a lista no request
req.setAttribute("monografias", monografias);
return "/WEB-INF/jsp/monografia/listaMonografias.jsp";
}
E por fim faz a listagem nessa página JSP listaMonografias.jsp Acredito que o problema maior esteja nesse jsp, no laço <:cforEach>, pois preciso buscar em mais de uma tabela para fazer a listagem.
<div id="list" class="row">
<div class="table-responsive col-md-12">
<table class="table table-striped" cellspacing="0" cellpadding="0">
<thead>
<tr>
<th>ID</th>
<th>Título</th>
<th>Aluno</th>
<th>Orientador</th>
<th class="actions">Ações</th>
</tr>
</thead>
<tbody>
<!-- Percorre monografias montando as linhas da tabela -->
<c:forEach var="monografia" items="${monografias}" >
<tr>
<td>${monografia.idMonografia}</td>
<td>${monografia.titulo}</td>
<td>${monografia.getAluno().getNome()}</td>
<td>${monografia.getProfessor().gettome()}</td>
<td class="actions"><a class="btn btn-success btn-xs"
href="view.html">Visualizar</a> <a
class="btn btn-warning btn-xs" href="mvc?logica=MonografiaLogic&idMonografia=${monografia.getIdMonografia()}">Alterar</a> <a
class="btn btn-danger btn-xs" href="mvc?logica=RemoveMonografiaLogic&idMonografia=${monografia.getIdMonografia()}" data-toggle="modal"
data-target="#delete-modal">Excluir</a></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
Não sei bem como está implementado, mas se não me engano, nas ELs vc não precisa usar o getAluno().getNome(). Você pode usar apenas monografia.aluno.nome, caso aluno seja um atributo de monografia e tem o get/set implementado direito. e se você sobrescrever o toString de aluno usando o atributo nome, nem precisaria desse .nome depois de aluno. Mesma coisa com professor. Não sei se isso que comentei aqui ajuda de alguma forma, pois não compreendi ao certo o problema.
— PaduCantuaria 08 de nov de 2017