DúvidasEmJSP-CHECKBOX

12 respostas
Ironlynx
Tenho uma página jsp que mostrará as Turmas q um aluno tem disponíveis para matrícula(são dinâmicas pois cada aluno possui diferentes Turmas a disposição).A seguir:
<%@ page language="java" import="com.siap.*,org.prevayler.*" %>
<%
   Prevayler prevayler = (Prevayler)this.getServletContext().getAttribute("prevayler");
   Turma[] turmas = ((SistemaAcademico)prevayler.prevalentSystem()).getTurmas();
   Usuario usuario=(Usuario)session.getAttribute("usuario");
%>

<html><head><title>SIAP-2004</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<p><h3>Turmas liberadas para cursar:</h3></p>
<form method="POST" action="matriculaConfirmada.jsp">


<table border=0><caption>Selecione as disciplinas para matrícula:</caption>  
 <tr><th></th><th> Turma</th><th> Matéria</th><th> Professor</th><th> Dia(s)</th><th> Horário</th><th> Sala</th><th> Campus</th>    
  
 <%  Turma turma;
      for(int i = 0; i < turmas.length; i++){
              turma=turmas[i];                    
        if((turma.getCurso()).equals(usuario.idCurso))
           out.println("<tr>"+"<th>"+"<input type=CHECKBOX name="+"turma"+">"+"</th>"+"<th>"+" "+turma.idTurma+"</th>"+"<th>"+" "+turma.nomeDaMateria+"</th>"+"<th>"+" "+turma.nomeDoProfessor+"</th>"+"<th>"+" "+turma.diaDaSemana+"</th>"+"<th>"+" "+turma.horario+"</th>"+"<th>"+" "+turma.nomeSala+"</th>"+"<th>"+" "+turma.nomeCampus+"</th>"+"</tr>");   
  %>  

</table>

      
<%    }    %>

<center><input type="submit" value="Matricular"></center>
</form></body></html>
Depois,tenho a página q receberá as CHECKBOXES escolhidas e gravará essas escolhas na Base para depois exibir as escolhidas.Código abaixo:
<%@ page language="java" import="com.siap.*,org.prevayler.*" %>
<% Prevayler prevayler=(Prevayler)this.getServletContext().getAttribute("prevayler");
SistemaAcademico siap=(SistemaAcademico)prevayler.prevalentSystem();
Usuario usuario=(Usuario)session.getAttribute("usuario");
Turma[] turmas=siap.getTurmas();
Turma[] selecionadas=new Turma[turmas.length];
 for(int i=0;i<turmas.length;i++){
  String selecionada=request.getParameter("turma");
    if(turmas[i].getIdTurma().equals(selecionada))
        selecionadas[i]=turmas[i];
 } 
 MatriculaTransaction transacao=new MatriculaTransaction(usuario,selecionadas);
 prevayler.execute(transacao);
 
 %>
<html><head><title>SIAP2004</title>
</head>
<body bgcolor="white">
<CAPTION><font face="ariel" color="#000000"><marquee>
<b><i> SISTEMA DE INFORMAÇÕES ACADÊMICAS PREVALENTE </i></b></font></CAPTION></marquee>

<center><TABLE BORDER=30 width=80% CELLSPACING=150 BORDERCOLOR="blue">
<TR><TH COLSPAN=1><div align=center>
<h3>Disciplinas Matriculadas:</h3></div>

<%    for(int i=0;i<siap.proximaMatriculaId();i++){
         Matricula mat=siap.getMatricula(new Integer(i));
         if(mat.aluno.matricula.equals(usuario.matricula))
      out.println("<tr>"+"<th>"+"</th>"+"<th>"+" "+mat.turmas[i].idTurma+"</th>"+"<th>"+" "+mat.turmas[i].nomeDaMateria+"</th>"+"<th>"+" "+mat.turmas[i].nomeDoProfessor+"</th>"+"<th>"+" "+mat.turmas[i].diaDaSemana+"</th>"+"<th>"+" "+mat.turmas[i].horario+"</th>"+"<th>"+" "+mat.turmas[i].nomeSala+"</th>"+"<th>"+" "+mat.turmas[i].nomeCampus+"</th>"+"</tr>");    
        }
%>

</TH></TR>
</TABLE></center>

<center>
<INPUT TYPE="button" VALUE="Voltar" onClick="history.back()">
</center>
</body>
</html>

o Fato é q não consigo pegar as turmas escolhidas para gravar(...).Jah tentei com getParameterNames() e não funcionou tb...
Idéias/Trechos de cód são Bem-Vindas!

12 Respostas

pcalcado

Pelo amor de Zahl, coloca tudo isso numa classe… :stuck_out_tongue: JSP não deve processar nada referente à regra de negócio!! Acessar qualquer persistência diretamente é atropelar um mihão de camadas…

Esse seu request.getParameter(“turma”); não vai adiantar, na primeira JSP vc define o nome como dinâmico, não existe nenhum com nome ‘turma’.

Faça algo assim:

<%  Turma turma;
      for(int i = 0; i < turmas.length; i++){
         turma=turmas[i];                   
        if((turma.getCurso()).equals(usuario.idCurso)){
%>
<input type=CHECKBOX name="turma<%=turma%>">
</th>
<th><%=turma.idTurma%></th>
<th><%=turma.nomeDaMateria%></th>
<th><%=turma.nomeDoProfessor%></th>
<th><%=turma.diaDaSemana%></th>
<th><%=turma.horario%></th>
<th><%=turma.nomeSala%></th>
<th><%=turma.nomeCampus%></th>
</tr>;   
<%
}
}
  %>

[list]
1 - Provavelmente você deveria usar turma.idTurma ao ivnés de turma como nome (ele deve identificar o bojeto)

2 - Evite o uso de atributos public, use getters e setters
[/list]
Em quem cadastra os dados (um servlet ou classe de negócio):
[list]
2.1 - Pegue o vetor com o nome dos parâmetros
2.2 - Para cada parâmetro, verifique se ele começa com ‘turma’, se começar faça a operaçãod esejada
2.3 - Prepare um objeto apra exibir (uma Collection com lsita d eturma, por exemplo)
2.4 Coloque esta em request
2.5 - Dê forward para sua JSP
26 - Recupere na JSP o atributo (Collection)psoto em request
[/list]

[]s

Ironlynx
Mudei o Matricula.jsp:
<%@ page language="java" import="com.siap.*,org.prevayler.*" %>
<%
   Prevayler prevayler = (Prevayler)this.getServletContext().getAttribute("prevayler");
   Turma[] turmas = ((SistemaAcademico)prevayler.prevalentSystem()).getTurmas();
   Usuario usuario=(Usuario)session.getAttribute("usuario");
%>

<html><head><title>SIAP-2004</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<p><h3>Turmas liberadas para cursar:</h3></p>
<form method="POST" action="matriculaConfirmada.jsp">


<table border=0><caption>Selecione as disciplinas para matrícula:</caption>  
 <tr><th></th><th> Turma</th><th> Matéria</th><th> Professor</th><th> Dia(s)</th><th> Horário</th><th> Sala</th><th> Campus</th></tr>    
  
 <%  Turma turma;
      for(int i = 0; i < turmas.length; i++){
              turma=turmas[i];                    
        if((turma.getCurso()).equals(usuario.idCurso)){ 
 %>
 <tr><th><input type=CHECKBOX name="turma<%=turma%>"></th> 
 <th><%=turma.idTurma%></th> 
 <th><%=turma.nomeDaMateria%></th> 
 <th><%=turma.nomeDoProfessor%></th> 
 <th><%=turma.diaDaSemana%></th> 
 <th><%=turma.horario%></th> 
 <th><%=turma.nomeSala%></th> 
 <th><%=turma.nomeCampus%></th> 
 </tr>
 <% ;
 }
   %>        

</table>

      
<%    }    %>

<center><input type="submit" value="Matricular"></center>
</form></body></html>
Mas agora philip,só a primeira turma tah aparecendo para ser cadastrada!Eram para ser 3!No sistema academico as turmas são:
turmas[1]=new Turma("3002","Mecânica Quântica","Planck,Max","Informática","QUA,SEX","34,35,36","noite","C-1001","Tribobó");
    	turmas[2]=new Turma("3003","Cálculo1000","Gauss,Karl","Informática","SEG","31,32,33","noite","B-202","Itaquaquecetuba");
    	turmas[3]=new Turma("3006","FísicaI","Hawking,Stephen","Informática","TER","31,32,33","noite","B-202","Itaquaquecetuba");
Eu tô ficando velho... eu fiz de outras formas:
<%     for(int i = 0; i < turmas.length; i++){
              if((turmas[i].getCurso()).equals(usuario.idCurso)){ 
 %>
 <tr><th><input type=CHECKBOX name="turma<%=turmas[i]%>"></th> 
 <th><%=turmas[i].idTurma%></th> 
 <th><%=turmas[i].nomeDaMateria%></th> 
 <th><%=turmas[i].nomeDoProfessor%></th> 
 <th><%=turmas[i].diaDaSemana%></th> 
 <th><%=turmas[i].horario%></th> 
 <th><%=turmas[i].nomeSala%></th> 
 <th><%=turmas[i].nomeCampus%></th> 
 </tr>
e assim:
<%  Turma[] turma=new Turma[turmas.length];
      for(int i = 0; i < turmas.length; i++){
              turma[i]=turmas[i];                    
        if((turma[i].getCurso()).equals(usuario.idCurso)){ 
 %>
 <tr><th><input type=CHECKBOX name="turma<%=turma%>"></th> 
 <th><%=turma[i].idTurma%></th> 
 <th><%=turma[i].nomeDaMateria%></th> 
 <th><%=turma[i].nomeDoProfessor%></th> 
 <th><%=turma[i].diaDaSemana%></th> 
 <th><%=turma[i].horario%></th> 
 <th><%=turma[i].nomeSala%></th> 
 <th><%=turma[i].nomeCampus%></th> 
 </tr>
Mas mesmo assim soh exibe a primera da q era para ser exibida...
Ironlynx

Matei!Dah primeira forma funciona tranquilo!O problema era no Tomcat que não atualizava minhas mudanças... :shock:
Aqui o Tomcat tem um comportamento esquisito,como ficar rodando um tempo,mesmo depois de finalizado... :shock: :shock: :shock:

Bom,mas meu problema ainda continua sendo pegar os checkboxes selecionados para efetuar a matricula!!!Segue um exemplo:
<%@ page language="java" import="com.siap.*,org.prevayler.*" %>
<% Prevayler prevayler=(Prevayler)this.getServletContext().getAttribute("prevayler");
SistemaAcademico siap=(SistemaAcademico)prevayler.prevalentSystem();
Usuario usuario=(Usuario)session.getAttribute("usuario");
Turma[] turmas=siap.getTurmas();
Turma[] selecionadas=new Turma[turmas.length];
 for(int i=0;i<turmas.length;i++){
  String selecionada=request.getParameter("turma");
    if(turmas[i].getIdTurma().equals(selecionada))
        selecionadas[i]=turmas[i];
 } 
 MatriculaTransaction transacao=new MatriculaTransaction(usuario,selecionadas);
 prevayler.execute(transacao);
 
 %>
<html><head><title>SIAP2004</title>
</head>
<body bgcolor="white">
<CAPTION><font face="ariel" color="#000000"><marquee>
<b><i> SISTEMA DE INFORMAÇÕES ACADÊMICAS PREVALENTE </i></b></font></CAPTION></marquee>

<center><TABLE BORDER=30 width=80% CELLSPACING=150 BORDERCOLOR="blue">
<TR><TH COLSPAN=1><div align=center>
<h3>Disciplinas Matriculadas:</h3></div>

<%    for(int i=0;i<siap.proximaMatriculaId();i++){
         Matricula mat=siap.getMatricula(new Integer(i));
         if(mat.aluno.matricula.equals(usuario.matricula)){         
%>
<tr><th></th> 
<th><%=mat.turma[i].idTurma%></th> 
<th><%=mat.turma[i].nomeDaMateria%></th> 
<th><%=mat.turma[i].nomeDoProfessor%></th> 
<th><%=mat.turma[i].diaDaSemana%></th> 
<th><%=mat.turma[i].horario%></th> 
<th><%=mat.turma[i].nomeSala%></th> 
<th><%=mat.turma[i].nomeCampus%></th> 
</tr> 
<% ;
 }
 }
   %> 

</TH></TR>
</TABLE></center>

<center>
<INPUT TYPE="button" VALUE="Voltar" onClick="history.back()">
</center>
</body>
</html>
Ironlynx

Eu sei disso philip,mas eh q botando no jsp,eu tenho os benefícios da recompilação automática…e é um protótipo,ninguem irá ver o código,eu não escrevi getters e setters para não inchar nada(devido a quantidade de objetos de negócio,isso dobraria o tam das classes).Quando eu for postar na Web,certamente irei mudar,mas no momento,o importante eh tudo funcionar…

[/quote]

pcalcado

“Ironlynx”:
Quando eu for postar na Web,certamente irei mudar,mas no momento,o importante eh tudo funcionar…

Esse negócio de ‘depois eu mudo’ nunca dá certo :wink:

[]s

Ironlynx

Na verdade,eu tô seguindo um exemplo dado pelo Daniel(faça de uma forma e depois evolua com ela…),ateh pq eu tenho mania de fazer as coisas da melhor forma possível,e ,se eu tivesse utilizado isso nesse pf,ainda tava na parte swing(q sequer será apresentada!).Um amigo nosso com pouco tempo de java resolveu utilizar um bando de patterns e boas práticas no projeto e se deu mal…(fatalmente estorará a deadline…)

pcalcado

Uma coisa é uma coisa, outra coisa é outra coisa (impressionante como essa frase diz tudo sem dizer nada…).

Você quer algo que funcione, para mostrar para a banca(Badim e seus amigos, hehe), para provar sua idéia, como ela funciona, blablabla? Está acostumado a programar em ZahlScript? Faça tudo em ZahlScript, ora. Vai ser rápido e você vai ter uma prova de conceito.

O exemplo do Daniel é baseado em metodologias ágeis, e neste tipo de desenvolvimento existe um constante refactoring e se está semrpe entregando releases pro cliente. O projeto final (como é na Estácio, pelo menos) segue um modelo totalmente em cascata (6 meses de modelagem e requisitos, 6 meses de implementação, ponto final). Para aplicar uma prática de early-release, você poderia ter prototipado seu sistema desde o início e mostrado ao seu ‘cliente’ (orientador) como o sistema estava ficando. Não sei se você fez algo do tipo, mas se tiver feito seu prazo não está mais permitindo refactoring arquitetural, o projeto está próximo do deadline.

Pelo que entendo do seu sistema (e sei muito pouco sobre ele), ó projeto final em si é um exemplo de aplicação com prevalência. Num caso assim, realmente vale bem a pena focar na arquitetura do seu sistema com persistência, objetos de negócio POJO, blablabla, e a interface é apenas um detalhe de implementação. O que acontece é que você está colocando a arquitetura do seu acesso a dados espalhado pelo código, uma prática muito ruim (geralmente seguir boas práticas sai muito mais rápido que qualquer outra metodologia ‘faz ai’).

É claro que você semrpe pode considerar que estamos falando de uma universidade onde a pessoa que dá aula de Orientação à Objetos porgramou em COBOL a vida toda, onde KSH vira kernel shell (e é mais rápido que o bash porque roda em modo kernel…zahl nos ajude!) numa aula de sistemas operacionais, e outras bizarrices que dão um tópico por si só. O que eles querem ver é o trequinho funcionando. Sinceramente não curto esse negócio de ‘o que importa é estar pronto’, porque você está aprendendo enquanto faz, e o ‘ah, é só desta vez…’ costuma se repetir eternamente.

Mas é claro, tem o prazo…

[]s

Ironlynx
Mas é claro, tem o prazo...
Prazo,morcegos e papagaios-de-pirata... Bom,aqui:
<%@ page language="java" import="com.siap.*,org.prevayler.*" %>
<% Prevayler prevayler=(Prevayler)this.getServletContext().getAttribute("prevayler");
SistemaAcademico siap=(SistemaAcademico)prevayler.prevalentSystem();
Usuario usuario=(Usuario)session.getAttribute("usuario");
Turma[] turmas=siap.getTurmas();
Turma[] selecionadas=new Turma[turmas.length];
 for(int i=0;i<turmas.length;i++){
  String selecionada=request.getParameter("turma.idTurma");
    if(turmas[i].getIdTurma().equals(selecionada))
        selecionadas[i]=turmas[i];
 } 
 MatriculaTransaction transacao=new MatriculaTransaction(usuario,selecionadas);
 prevayler.execute(transacao);
 
 %>
<html><head><title>SIAP2004</title>
</head>
<body bgcolor="white">
<CAPTION><font face="ariel" color="#000000"><marquee>
<b><i> SISTEMA DE INFORMAÇÕES ACADÊMICAS PREVALENTE </i></b></font></CAPTION></marquee>

<center><TABLE BORDER=30 width=80% CELLSPACING=150 BORDERCOLOR="blue">
<TR><TH COLSPAN=1><div align=center>
<h3>Disciplinas Matriculadas:</h3></div>

<%  Turma t;  
      for(int i=0;i<siap.proximaMatriculaId();i++){
         Matricula mat=siap.getMatricula(new Integer(i));
         System.out.println(mat);
         if(mat.aluno.matricula.equals(usuario.matricula)){  
            t=mat.turmas[i];       
%>
<tr><th></th> 
<th><%=t.idTurma%></th> 
<th><%=t.nomeDaMateria%></th> 
<th><%=t.nomeDoProfessor%></th> 
<th><%=t.diaDaSemana%></th> 
<th><%=t.horario%></th> 
<th><%=t.nomeSala%></th> 
<th><%=t.nomeCampus%></th> 
</tr> 
<% ;
 }
 }
   %> 

</TH></TR>
</TABLE></center>

<center>
<INPUT TYPE="button" VALUE="Voltar" onClick="history.back()">
</center>
</body>
</html>
Eu descobir q a matrícula tah sendo criada,meu transactionLog tb e talz..mas qdo eu vou recuperar a(s) turma(s) para exibí-la tah dando um nullpointer!Não era para dar,pois meu objeto matrícula tah ok.(código de hash tah ok:com.siap.Matricula@16089a5)?Alguma idéia?
Ironlynx

Usando:

String[] escolha=request.getParameterValues("turma");
  Turma[] selecionadas=new Turma[escolha.length];
  if(escolha!=null){
  for(int i=0;i<turmas.length;i++){
    if(turmas[i].getIdTurma().equals(escolha[i]))
        selecionadas[i]=turmas[i];}

Eu obtenho um claro estouro em:
if(turmas[i].getIdTurma().equals(escolha[i]))
mas qual seria a melhor forma de comparação por um array de strings recebido?(for dentro do for?!Ai!isso não eh muito bunito…)[/code]

pcalcado

Que tem de feio for dentro de for?

for(int i=0;i<blablabla;i++){
 for(int x=0;x<nhenhenhen;x++){
   if(x==i) return true;
 }
}

//ou
for(int i=0;i<blablabla;i++){
 if(comparar(i, meuArray)) return tue;
 }
}

...

public boolean comparar(int i, int[] array){
 for(int x=0;x<nhenhenhen;x++){
   if(array[i]==i) return true;
 }
return false
}

//Que fica (talvez) mais legível...

[]s

Ironlynx

Philip,eu fiz assim:

String[] escolha=request.getParameterValues("turma"); Turma[] selecionadas=new Turma[escolha.length]; if(escolha!=null){ for(int i=0;i<turmas.length;i++){ for(int j=0;j<escolha.length;j++) if(turmas[i].getIdTurma().equals(escolha[j])) selecionadas[j]=turmas[i];} MatriculaTransaction transacao=new MatriculaTransaction(usuario,selecionadas); prevayler.execute(transacao); }
E pela primeira vez apareceu uma Turma matriculada! :smiley:
Mas o problema eh q soh uma tah aparecendo ao invés de 3 q eu seleciono…Ah,meu CHECKBOX ta assim:
<input type=CHECKBOX name=“turma” value="<%=turma.idTurma%>">

rafaelgloria

Form básico:

&lt;html&gt;
&lt;body&gt;
&lt;form name="form" action="teste2.jsp" method="post"&gt;
&lt;input type=CHECKBOX name="teste"&gt;
um
&lt;/input&gt;
&lt;input type=CHECKBOX name="teste"&gt;
dois
&lt;/input&gt; 
&lt;input type=CHECKBOX name="teste"&gt;
tres
&lt;/input&gt;
&lt;input type=submit&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;

Pagina JSP que recebe os checkboxes:

&lt;%
	String&#91;&#93; teste = new String&#91;100&#93;;
	teste = request.getParameterValues&#40;"teste"&#41;;
%&gt;
&lt;html&gt;
&lt;body&gt;
&lt;% for &#40;int i=0; i&lt;teste.length; i++&#41;&#123;%&gt;
&lt;%= teste&#91;i&#93; %&gt;&lt;br&gt;
&lt;% &#125; %&gt;
&lt;/body&gt;
&lt;/html&gt;

Qq tamus ae,
Abs,
Rafael.

Criado 30 de outubro de 2004
Ultima resposta 4 de nov. de 2004
Respostas 12
Participantes 3