Select multiple com Servlet + JSP

Boa tarde a todos.

Venho mais uma vez ao GUJ pois estou escontrando algumas dificuldades no desenvolvimento de um sistema web. Vamos lá!

Meu sistema possui um relacionamento N para N de duas tabela (MEDICO e ESPECIALIDADES), desse relacionamento surgiu uma terceira tabela (MEDICOESPECIALIDADE) com os campos (cpf e codigoEspecialidade) estou desenvolvemto em MVC. Para não criar uma JSp só para vincular o medico a especialidade eu usei 1 select multiple onde eu listo todas as especialidades na propria tela de medico.

Se o usuário do sistema digitar os dados do medico e selecionar as especialidades o sistema salva de boa. Gostaria de saber como faço para trazer as especialidades selecionadas (em azul) quando o usuario pesquisar por 1 médico.

segue o código abaixo

medico.jsp

[code]
<%@ page language=“java” contentType="text/html; charset=ISO-8859-1"pageEncoding=“ISO-8859-1”%>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>
<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”%>

SINTHOS - Sistema de Internações Hospitalares

							<td><font color="red">* </font>CRM: </td>
							<td><input type="text" lang="1" name="crm" id="crm" class="dados" maxlength="5" onkeypress="return campoNumerico(event)" value="${medico.crm }"/></td>
						</tr>
						<tr>
							<td><font color="red">* </font>RG: </td>
							<td><input type="text" lang="1" name="rg" id="rg" class="dados" maxlength="15" onchange="this.value=this.value.toUpperCase();" value="${medico.rg }"/></td>
						
							<td><font color="red">* </font>Nome: </td>
							<td><input type="text" lang="1" name="nome" id="nome" class="texto" maxlength="50" onchange="this.value=this.value.toUpperCase();" value="${medico.nome }"/></td>
						</tr>
						<tr>
							<td><font color="red">* </font>Endereço: </td>
							<td><input type="text" lang="1" name="endereco" id="endereco" class="texto" maxlength="50" onchange="this.value=this.value.toUpperCase();" value="${medico.endereco }"/></td>
						
							<td><font color="red">* </font>Número: </td>
							<td><input type="text" lang="1" name="numero" id="numero" class="dados" maxlength="10" onchange="this.value=this.value.toUpperCase();" value="${medico.numero }"/></td>
						</tr>
						<tr>
							<td>Bairro: </td>
							<td><input type="text" name="bairro" id="bairro" class="texto" maxlength="50" onchange="this.value=this.value.toUpperCase();" value="${medico.bairro }"/></td>
						
							<td><font color="red">* </font>Cidade: </td>
							<td><input type="text" lang="1" name="cidade" id="cidade" class="texto" maxlength="50" onchange="this.value=this.value.toUpperCase();" value="${medico.cidade }"/></td>
						</tr>
						<tr>
							<td>CEP: </td>
							<td><input type="text" name="cep" id="cep" class="dados" maxlength="9" onkeypress="return campoNumerico(event)" onkeyup="mascaraCep(this,event)" value="${medico.cep }"/></td>
						
							<td><font color="red">* </font>Estado: </td>
							<td><input type="text" lang="1" name="estado" id="estado" class="texto" maxlength="50" onchange="this.value=this.value.toUpperCase();" value="${medico.estado }"/></td>
						</tr>
						<tr>
							<td>Telefone: </td>
							<td><input type="text" name="telefone" id="telefone" class="dados" maxlength="13" onkeypress="return campoNumerico(event)" onkeyup="mascaraTelefone(this,event)" value="${medico.telefone }"/></td>
						
							<td>Especialidades: </td>
							<td>
								<select name="especialidade" id="especialidade" multiple="multiple">
									<c:forEach var="especialidade" items="${listaEspecialidade }">
										<option value="${especialidade.codigoEspecialidade }">${especialidade.descricao }</option>
									</c:forEach>
								</select>
							</td>
						</tr>
					</table>
					<table>
						<tr>
							<td></td>
							<td><font color="red">*</font> Campos Obrigatórios.</td>
						</tr>
					</table>
					<br/>
					<!--<img src="imagens/botaoAnterior.png"> <input type="text" name="navegar" id="navegar" size="4" disabled="disabled"/> <img src="imagens/botaoProximo.png"/>!-->
					<table>
						<tr>
							<td>
								<input type="submit" class="botao" name="acao" value="Salvar" onclick="return validaCampoObrigatorio(formMedico)"/>
								<input type="submit" class="botao" name="acao" value="Excluir"/>	
								<input type="submit" class="botao" name="acao" value="Pesquisar"/>
								<input type="submit" class="botao" name="acao" value="Limpar"/>
							</td>
						</tr>
					</table>
				</form>
			</center>
		</div>
		<br/><br/><br/><br/><br/>
		<a href="cadastros.jsp"><img src="imagens/botaoVoltar.png" border="0"/></a> <img align="right" src="imagens/medico.png"/> 
		<div class="rodape">Todos os Direitos Reservados - SINTHOS</div>
	</div>
</body>
[/code]

MedicoCTR

[code]
package sinthos.ctr;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sinthos.bean.Especialidade;
import sinthos.bean.Medico;
import sinthos.bean.MedicoEspecialidade;
import sinthos.dao.EspecialidadeDAO;
import sinthos.dao.MedicoDAO;
import sinthos.dao.MedicoEspecialidadeDAO;

public class MedicoCTR extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;

public MedicoCTR() {
	super();
}   	

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//Defini o tipo de resposta
	response.setContentType("text/html");
	response.setCharacterEncoding("ISO-8859-1");
	//Passa nulo para o médico
	Medico medico = new Medico();
	request.setAttribute("medico", medico);
	//Cria a lista de especialidades
	EspecialidadeDAO daoEspecialidade = new EspecialidadeDAO();
	List<Especialidade> listaEspecialidade = daoEspecialidade.getTodasEspecialidades();
	request.setAttribute("listaEspecialidade", listaEspecialidade);
	//Redireciona para tela
	request.getRequestDispatcher("medico.jsp").forward(request, response);
}  	

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//Defini o tipo de resposta
	response.setContentType("text/html");
	response.setCharacterEncoding("ISO-8859-1");
	//Cria os objetos e variaveis
	Medico medico = new Medico();
	MedicoDAO daoMedico = new MedicoDAO();
	MedicoEspecialidade medicoEspecialidade = new MedicoEspecialidade();
	MedicoEspecialidadeDAO daoMedicoEspecialidade = new MedicoEspecialidadeDAO();
	String acao = request.getParameter("acao");
	//Cria a lista de especialidades
	EspecialidadeDAO daoEspecialidade = new EspecialidadeDAO();
	List<Especialidade> listaEspecialidade = daoEspecialidade.getTodasEspecialidades();
	request.setAttribute("listaEspecialidade", listaEspecialidade);
	//Recupera da tela
	medico.setCpf(request.getParameter("cpf"));
	medico.setCrm(request.getParameter("crm"));
	medico.setRg(request.getParameter("rg"));
	medico.setNome(request.getParameter("nome"));
	medico.setEndereco(request.getParameter("endereco"));
	medico.setNumero(request.getParameter("numero"));
	medico.setBairro(request.getParameter("bairro"));
	medico.setCidade(request.getParameter("cidade"));
	medico.setCep(request.getParameter("cep"));
	medico.setEstado(request.getParameter("estado"));
	medico.setTelefone(request.getParameter("telefone"));
	//Recupera as especialidades selecionadas
	String[] especialidades = request.getParameterValues("especialidade");
	//Recupera o cpf e guarda em MedicoEspecialidade
	medicoEspecialidade.setCpf(request.getParameter("cpf"));
	//Ação dos botões
	if(acao.equals("Salvar")){
		medico = daoMedico.salvarMedico(medico);
		for(String especialidade : especialidades){
			medicoEspecialidade.setCodigoEspecialidade(Integer.parseInt(especialidade));
			medicoEspecialidade = daoMedicoEspecialidade.salvarMedicoEspecialidade(medicoEspecialidade);
		}
		if((medico == null) && (medicoEspecialidade == null)){
			request.getRequestDispatcher("mensagemErro.jsp").forward(request, response);
		}else{
			request.getRequestDispatcher("mensagemOk.jsp").forward(request, response);
		}
	}else if(acao.equals("Excluir")){
		for(String especialidade : especialidades){
			medicoEspecialidade.setCodigoEspecialidade(Integer.parseInt(especialidade));
			daoMedicoEspecialidade.excluirMedicoEspecialidade(medicoEspecialidade.getCpf(), medicoEspecialidade.getCodigoEspecialidade());
		}
		daoMedico.excluirMedico(medico.getCpf());
		request.getRequestDispatcher("mensagemOk.jsp").forward(request, response);
	}else if(acao.equals("Pesquisar")){
		if(medico.getNome().equals("")){
			medico = daoMedico.getMedicoPorCpf(medico.getCpf());
			request.setAttribute("medico", medico);
			request.getRequestDispatcher("medico.jsp").forward(request, response);
		}else{
			medico = daoMedico.getMedicoPorNome(medico.getNome());
			request.setAttribute("medico", medico);
			request.getRequestDispatcher("medico.jsp").forward(request, response);
		}
	}else{
		request.getRequestDispatcher("medico.jsp").forward(request, response);
	}
}   	  	    

}[/code]

Aguém pode dar uma idéia do que fazer. Abraço!

* CPF:

Entendi o que quer fazer, mas estou com uma dúvida:

Vejo que você tem um formulario com os dados do médico e uma combo(tag select) com suas especialidades. Que está cadastrando normal!

Quando o usuário consultar um médico ele traga as especialidades na combo(tag select) em azul é isso?

Se for isso, você pode utilizar o <% %> na sua tag option e lá verficar com o Java. Se o id for igual ao id da sua consulta você coloca um style na sua tag option.

Brother, depois dê uma olhada em JSF. Com certeza não teria esse trabalho todo, não só nesse seu problema, mas em toda a sua página. Validações, Capturar Campos etc.

Mas é isso ai, está no caminho certo.

alberthy.

Não estou usando JSF pq comecei meus estudos a pouco tempo, se vc tiver algum material e puder me passar eu ficaria muito agradecido. Com relação aos problemas que estou tendo aqui, eu fiz algumas mudanças e esta quase dando certo.

1º - Criei um método na minha classe MedicoEspecialidadeDAO que me retorna uma lista com todas as especialidades do medico de acordo com o cpf que eu passo.

public List<MedicoEspecialidade> getMedicoEspecialidadePorCpfMedico(String cpf){ List<MedicoEspecialidade> listaMedicoEspecialidade; BoxSQL box = new BoxSQL(); box.setParameter("CPF", cpf); try{ listaMedicoEspecialidade = box.getList("medicoEspecialidadePorCpf.sql", MedicoEspecialidade.class); }finally{ box.release(); } return listaMedicoEspecialidade; }

2º - Quando o usuário escolhe a opção “Pesquisar” eu crio uma lista do objeto MedicoEspecialidade no Servlet, chamo esse método e passo essa lista para tela

medico = daoMedico.getMedicoPorCpf(medico.getCpf()); request.setAttribute("medico", medico); List<MedicoEspecialidade> listaMedicoEspecialidade = daoMedicoEspecialidade.getMedicoEspecialidadePorCpfMedico(medicoEspecialidade.getCpf()); request.setAttribute("listaMedicoEspecialidade", listaMedicoEspecialidade); request.getRequestDispatcher("medico.jsp").forward(request, response);

3º - Na página JSP eu criei um laço que quando o medico for != de nulo ele me traz a lista com suas especialidades com fundo azul e letras brancas

<select name="especialidade" id="especialidade" multiple="multiple"> <c:if test="${medico != null }"> <c:forEach var="medicoEspecialidade" items="${listaMedicoEspecialidade }"> <option value="${medicoEspecialidade.codigoEspecialidade }" style="background-color: #3399ff; color: #FFFFFF "> ${medicoEspecialidade.especialidade.descricao } </option> </c:forEach> </c:if> <c:forEach var="especialidade" items="${listaEspecialidade }"> <option value="${especialidade.codigoEspecialidade }">${especialidade.descricao }</option> </c:forEach> </select>

A principio deu certo, preciso agora arrumar os laços forEach pq do jeito que está ele traz as especialidades do medico selecionadas e a lista de especialidades, ou seja, se um medico é neurologista ele vai trazer neurologista em azul e em baixo vai trazer de novo.

Alguma dica para não duplicar os dados no select???

[b]Tenta isso:

List<MedicoEspecialidade> listaMedicoEspecialidade = new ArrayList<MedicoEspecialidade>();

Abraço![/b]

Ah, sobre o material não tenho como lhe ajudar. Tem muito material na internet sobre esse assunto, mas posso lhe afirmar que não é melhor que muitos livros disponíveis para compra.

Tenho vários, na época que estava estudando, os materias da internet não foram sufucientes, tive que comprar mesmo.

Quando tiver estudando JSF, você vai ver a diferença.

Só para você ter uma idéia, não é preciso você capturar os campos da sua página html, o valor do campo já fica diretamente ligado ao seu atributo, bastando só chamar um método para salvar todo seu formulário.

<h:inputText value="controle.medico.nome" />

<h:commandButton action="controle.salvar" value="Salvar" />

Classe Controle:

public String salvar(){
   session.save(medico);
   return "form";
}

Nesse caso, utilizando hibernate.

Abraço.

Alberthy, tentei aqui não não deu certo.

Vou mudar a lógica que estou utilizando nos laços c:forEach da minha página JSP. Assim que eu conseguir posto a resposta aqui.

Com relação ao JSF, pelo que você demostrou no exemplo acima, a diminuição de trabalho é visivel. Vou dar uma olhada em alguns livros à venda na internet.

Abraço!!!