Select Multiple Struts 2

28 respostas
F

Fala ae galera, blz?

Estou desenvolvendo um projeto em struts 2 e ainda surgem algumas dúvidas.
Alguem pode me dar um exemplo de um Select Multiplo e de como receber esses dados?

Vlw galera,
Abraços

28 Respostas

R

O select vc faz assim

<SELECT MULTIPLE NAME=“choice” SIZE=“3”>
<OPTION VALUE=“Less than 1 year.”>Less than 1 year.</OPTION>
<OPTION VALUE=“1-5 years.”>1-5 years.</OPTION>
<OPTION VALUE=“5-10 years.”>5-10 years.</OPTION>
<OPTION VALUE=“More than 10 years.”>More than 10 years.</OPTION>
</SELECT>

e para recuperar os dado no teu form vc tem que ter um atributo que é um array de String com o nome da propriedade name do teu componente, assim:
private String[] choice;

[]s

F

Isso ae não eh Struts…
E po não tem como recuperar dessa forma ae pelo struts!

J
Código na Action:
public class TestarSelect extends ActionSupport{

	int idunico;
	int[] idsmultiplos;
	
	Map<Integer, String> itens;
	
	@Override
	public String execute() throws Exception {
		// faça o que quiser com idunico ou idsmultiplos
		return SUCCESS;
	}

   public Map<Integer, String> getItens() {
		itens = new HashMap<Integer, String>();
		itens.put(1, "Lady Gaga");
		itens.put(2, "Adele");
		itens.put(3, "Beyonce");
		itens.put(4, "Gaby Amarantos");
		return itens;
	}
// demais getters e setters
Código do JSP
<s:form>
		<s:select label="Escolha uma" list="itens" name="idunico"></s:select>
		<s:select label="Escolha quantas quiser" list="itens" name="idsmultiplos" multiple="true" size="%{itens.size()}"></s:select>
		<s:submit value="Vai!"></s:submit>
	</s:form>

Espero ter ajudado.

F

Show, irei testar aqui…

Mas nesse caso ae está apenas listando os dados no Select…
E pra eu receber os dados dessa lista?

valeuuu
abraços

J

Amigo, isso que te mandei já faz receber tudo na action.
Basta os ‘idunico’ e ‘idmultiplos’ terem seus setters.

F

Você me ajuda a fazer isso receber do banco?

eu tentei assim, mas ele nao aceita inteiro.
Eu preciso receber o id e nome da tabela alunos!

Map<Integer, String> itens;  
  
   public Map<Integer, String> getItens() {  
	   
	   try{
	   PreparedStatement stmt = this.connection.prepareStatement("SELECT * FROM alunos");
	   ResultSet rs = stmt.executeQuery();
	   
	   while(rs.next()) {
			Alunos alunos = new Alunos();
			
			itens = new HashMap<Integer, String>();  
	        itens.put(1, alunos.getId_alunos());
	        itens.put(2, alunos.getNome());  
  
	        return itens;  
		}

		rs.close();
		stmt.close();
	   
	   }catch (SQLException e) {
				throw new RuntimeException(e);
	   }
        
    }

Minha class Alunos ja tem todos os getters and setters!

obrigadão!

J

amigo, teu

return itens;

deveria estar fora do “while”. Assim você sempre vai retornar o mapa só com 1 elemento.

E que teu

itens = new HashMap<Integer, String>();

Deveria estar ANTES do while também.

E teu código no while simplesmente não tá pegando nada do banco. Você instanciou um “alunos” e usou seus getters… e o “rs”, fez o que com ele? Ele que contém o conteúdo do de cada linha do resultado da consulta.

Como assim? Quem não aceita?

Por favor, poste os códigos inteiros de seu JSP e sua Action. Assim a ajuda fica beeeeeeeem mais fácil :wink:

F
Map<Integer, String> itens;  
  
   public Map<Integer, String> getItens() {  
	   
	   try{
	   PreparedStatement stmt = this.connection.prepareStatement("SELECT * FROM alunos");
	   ResultSet rs = stmt.executeQuery();
	   
	   itens = new HashMap<Integer, String>();  
	   
	   while(rs.next()) {
			
		   itens.put(1, rs.getInt("id_alunos")); 
	       itens.put(2, rs.getString("nome"));  
            
		}
	   
	   	rs.close();
		stmt.close();
		
		return itens;
	   
	   }catch (SQLException e) {
				throw new RuntimeException(e);
	   }
        
    }
package br.com.scb.modelo;

public class Alunos {
	
	private int [] id_alunos;
	private String nome;
	private String curso;
	private String matricula;
	private String email;
	
	public int[] getId_alunos() {
		return id_alunos;
	}
	public void setId_alunos(int[] id_alunos) {
		this.id_alunos = id_alunos;
	}

	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public String getCurso() {
		return curso;
	}
	public void setCurso(String curso) {
		this.curso = curso;
	}
	
	public String getMatricula() {
		return matricula;
	}
	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}
	
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}

}

Ele da erro na linha itens.put(1, rs.getInt("id_alunos"));

fica sublinhado o put!

J

Bem, se sua intenção era que o código do aluno fosse a chave do mapa e seu nome o valor do mapa teu código tá errado mesmo. Deveria ser:

itens.put(rs.getInt("id_alunos"), rs.getString("nome"));

Só isso mesmo. Do jeito que estava você adicionava 2 elementos ao mapa a cada linha do resultado.

J

Teu while deve ter só essa linha dentro mesmo.

F

blz, sumiu o errro...

No jsp não aparece nada, eu coloquei como vc flw:

<s:form>  
					        <s:select label="Escolha quantas quiser" list="itens" name="id_alunos" multiple="true" size="%{itens.size()}"></s:select>  
					        <s:submit value="Vai!"></s:submit>  
					    </s:form>

Não aparece nada!

da esse erro:

Mar 31, 2012 2:32:08 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.Error: Unresolved compilation problem: 
	The method setId_alunos(int[]) in the type Alunos is not applicable for the arguments (int)

	at br.com.scb.dao.AlunosDAO.getLista(AlunosDAO.java:83)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	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.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)
	at org.apache.jsp.cadastrar_002dprojetos_jsp._jspx_meth_c_005fforEach_005f0(cadastrar_002dprojetos_jsp.java:435)
	at org.apache.jsp.cadastrar_002dprojetos_jsp._jspService(cadastrar_002dprojetos_jsp.java:300)
	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.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	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(Unknown Source)
J

Amigo, insisto que envie TODO o código de sua Action. Assim fica bem mais fácil te ajudar.

E mais, provavelmente você chamou a ação mapeada via get antes de mandar os parâmetros. Enfim, provavelmente agora é problema de mapeamento.

Mande, se quiser ajuda de qualidade, TODO o código de sua Action, TODO o código do JSP e TODO o código de configuração (XMLs, caso não tenha usado CoC).

Não precisa mandar o código do POJO “Alunos”.

Abraços.

F

ProjetoDAO.java

package br.com.scb.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;

import br.com.scb.jdbc.ConnectionFactory;
import br.com.scb.modelo.Componentes;
import br.com.scb.modelo.Projetos;

public class ProjetosDAO extends ActionSupport {
	
	private static final long serialVersionUID = 1L;

	private final Connection connection;
	
	public ProjetosDAO(){
		connection = new ConnectionFactory().getConnection();
	}

	
	Map<Integer, String> itens;  
  
   public Map<Integer, String> getItens() {  
	   
	   try{
	   PreparedStatement stmt = this.connection.prepareStatement("SELECT * FROM alunos");
	   ResultSet rs = stmt.executeQuery();
	   
	   itens = new HashMap<Integer, String>();  
	   
	   while(rs.next()) {
	       itens.put(rs.getInt("id_alunos"), rs.getString("nome"));  
		}
	   
	   	rs.close();
		stmt.close();
		
		return itens;
	   
	   }catch (SQLException e) {
				throw new RuntimeException(e);
	   }
        
    }

}

cadastrar-projetos.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>  
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>SCB - Painel de Administração</title>
<%@ include file="header.jsp" %> 
</head>
<body>

<%@ include file="top.jsp" %>


<!-- Content wrapper -->
<div class="wrapper">
	
	<%@ include file="menu.jsp" %>
	
	<!--MELHORAR A VALIDAÇÃO AQUI-->
    
	<div class="success message">
		<s:if test="hasActionMessages()">
			<s:actionmessage/>
		</s:if>	
	</div>
    
    <jsp:useBean id="dao" class="br.com.scb.dao.ProfessoresDAO" />
    <jsp:useBean id="dao_aluno" class="br.com.scb.dao.AlunosDAO" />
    <jsp:useBean id="dao_projetos" class="br.com.scb.dao.ProjetosDAO" />
    
    <!-- Content -->
    <div class="content">
    	<div class="title"><h5>Projetos</h5></div>
        
        <form action="cadastraProjetos" method="post" id="valid" class="mainForm">
        
      <div class="widget first">
            <div class="head"><h5 class="iList">Cadastrar Projetos</h5></div>
            
            <div class="rowElem dualBoxes">
            <h6>Componentes do Projeto</h6><br />
               
              <div class="floatleft w40">
                    
              		<select id="box1View" multiple="multiple" class="multiple" style="height:200px;">
                        
                        <c:forEach var="aluno" items="${dao_aluno.lista}"> 
	                    	<option value="${aluno.id_alunos}">${aluno.nome}</option>
	                	</c:forEach>
	                	
                    </select>
                    <br/>
                    <span id="box1Counter" class="countLabel"></span>
                    
                    <div class="displayNone"><select id="box1Storage"></select></div>
                </div>
                    
                <div class="floatleft dualControl">
                    <button id="to2" type="button" class="dualBtn mr5 mb15">&nbsp;&gt;&nbsp;</button>
                    <button id="allTo2" type="button" class="dualBtn">&nbsp;&gt;&gt;&nbsp;</button><br />
                    <button id="to1" type="button" class="dualBtn mr5">&nbsp;&lt;&nbsp;</button>
                    <button id="allTo1" type="button" class="dualBtn">&nbsp;&lt;&lt;&nbsp;</button>
                </div>
                    
                <div class="floatright w40">
                      <s:form>  
					        <s:select label="Escolha quantas quiser" list="itens" name="id_alunos" multiple="true" size="%{itens.size()}"></s:select>  
					        <s:submit value="Vai!"></s:submit>  
					    </s:form>   
                  <br/>
                    <span id="box2Counter" class="countLabel"></span>
                    
                    <div class="displayNone"><select id="box2Storage"></select></div>
              </div>
            <div class="fix"></div>
            </div>
            
            <!--FIM COMPONENTE-->
            
              <input type="submit" value="Cadastrar" class="basicBtn submitForm mb22" />
              <div class="fix"></div>

        </div>
        
        </form>
    </div>
    <div class="fix"></div>
</div>

<!-- Footer -->
<%@ include file="footer.jsp" %> 


</body>
</html>

erro

Mar 31, 2012 11:31:12 AM com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
WARNING: No configuration found for the specified action: '/cadastrar-projetos.jsp' in namespace: ''. Form action defaulting to 'action' attribute's literal value.
Mar 31, 2012 11:31:12 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
tag 'select', field 'list', name 'id_alunos': The requested list key 'itens' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
	at org.apache.struts2.components.Component.fieldError(Component.java:237)
	at org.apache.struts2.components.Component.findValue(Component.java:358)
	at org.apache.struts2.components.ListUIBean.evaluateExtraParams(ListUIBean.java:80)
	at org.apache.struts2.components.Select.evaluateExtraParams(Select.java:105)
	at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:858)
	at org.apache.struts2.components.UIBean.end(UIBean.java:510)
	at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
	at org.apache.jsp.cadastrar_002dprojetos_jsp._jspx_meth_s_005fselect_005f0(cadastrar_002dprojetos_jsp.java:447)
	at org.apache.jsp.cadastrar_002dprojetos_jsp._jspx_meth_s_005fform_005f0(cadastrar_002dprojetos_jsp.java:404)
	at org.apache.jsp.cadastrar_002dprojetos_jsp._jspService(cadastrar_002dprojetos_jsp.java:282)
	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.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	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(Unknown Source)

Po cara, muito obrigado mesmo pela atenção!
abraços

J

E os XMLs de mapeamento?
Os não os têm (no caso, se estiver usando CoC)

F

O que é CoC?
Eu utilizo anotation…

Nesse caso ae tenho que mapear no struts.xml? ou no web.xml?
abraços

J

CoC - Convention over Configuration.
Assim, se usar as convenções do Struts2 sequer precisa usar anotações na maioria dos casos. Dai você não usar nem anotação nem XML.

E todo caso, não vi anotação nenhuma na tua classe… tem certeza que enviou a que está no teu projeto?

J

Amigo, desculpa se to parecendo “cri cri”, mas é que com o código que você mandou não dá pra saber teus mapeamentos nem como faz pra chegar no teu JSP via aplicação, nem como teu JSP chama a Action, entendeu?

F

Não amigo, o que eu preciso mesmo são de dicas e esporros ;D pra eu melhorar...
Pra inputar os dados de um form eu uso os anotations.

O que eu preciso por ali no jsp para vir o lance do ProjetosDao.java? me ajuda?

Mais uma vez agradeço pelas dicas e paciencia!

Segue uma action que falta que eh o:

CadastraProjetos.java

package br.com.scb.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

import br.com.scb.modelo.Projetos;
import br.com.scb.dao.ProjetosDAO;

public class CadastraProjetosAction extends ActionSupport {

	private static final long serialVersionUID = -5817485575269317513L;
	
	private Projetos projetos;
	
	@Action( value="cadastraProjetos", results = {
			@Result(name="ok", location="/cadastrar-projetos.jsp")
	})
	
	public String execute(){
		//HttpServletRequest request = ServletActionContext.getRequest();

		new ProjetosDAO().adiciona(projetos);
		addActionMessage("Projeto cadastrado com sucesso!");
		return "ok";		
	}

	public Projetos getProjetos() {
		return projetos;
	}

	public void setProjetos(Projetos projetos) {
		this.projetos = projetos;
	}
	
	
}
J

Amigo… tá meio estranho teu código…

<s:if test="hasActionMessages()"> <s:actionmessage/> </s:if>

Não precisa disso… basta o

<s:actionmessage/>

Que nada acontece se não houverem mensagens adicionadas na Action.

Ao invés de tanto

<%@ include ...

Poderia ter usado o sitemesh plugin que facilita muito e evita essas coisas, facilitando a refatoração posteriormente.

Particularmente não acho uma boa prática usar

<jsp:useBean

Acho que a melhor opção seria instanciar esses DAOs na Action. Fazer o JSP usar o DAO diretamente ficou muito estranho na minha opinião.
Ademais, você pediu pra instanciar 3 DAOs mas só usa 1 no JSP.

Outro detalhe: não entendi porque seus DAOs estendem ActionSupport… Realmente não precisava. Acredito que teu código ficou um tanto “mix” (IMO).

Tua tag <s:form> não indica a Action pra onde vai, logo ela vai submeter para a mesma que redirecionou para esse JSP.

Bem, o erro que aparece no log indica que o Struts2 não conseguiu obter uma valor de coleção na tag <s:select>.
Ora, se você botou “itens” lá, o Struts2 tentou pegar “getItens()” da classe CadastraProjetosAction.

Acredito que sua tag deveria invocar essa lista ou mapa de um dos DAOs que instanciou. Talvez isso funcione:

<s:select label="Escolha quantas quiser" list="%{#attr.dao_aluno.lista}" name="id_alunos" multiple="true" size="%{#attr.dao_aluno.lista.size()}"></s:select>
F

Po, retornou meio estranho....

<select id="cadastrar-projetos_id_alunos" multiple="multiple" size="2" name="id_alunos">
<option value="br.com.scb.modelo.Alunos@5b3e5d">br.com.scb.modelo.Alunos@5b3e5d</option>
<option value="br.com.scb.modelo.Alunos@1eb8f6d">br.com.scb.modelo.Alunos@1eb8f6d</option>
</select>

Realmente tenho 2 alunos cadastrados, mas ta vindo o bean todo...
Axo que deve ter que usar outro atributo ali no

abraços

J

Simples. É que o método em questão não retorna um Mapa.
Quando retorna um mapa o <s:select> separa a chave do valor naturalmente.

Nesse caso você provavelmente tem uma lista. Dai tem que usar os atributos “listKey” e “listValue” na tag <s:select>. O primeiro é o que ficará no “value” do select e o segundo é a parte visível ao usuário.

F

Ai meu amigo, show de bola…
Agora pegou namoral…

<s:select label=“Escolha quantas quiser” list="%{#attr.dao_aluno.lista}" listKey=“id_alunos” listValue=“nome” name=“id_alunos” multiple=“true” size="%{#attr.dao_aluno.lista.size()}"></s:select>

Agora deixa eu te perguntar, como faço para pegar essa lista lá na action? tenho que por algo especifico la?
Porque tipo vo pegar esses dados e inserir no banco.

Pode me dar um caminho?
abraços e obrigado!

J

Simples: coloca o DAO na Action e não no JSP.

Dai bota um “getXXX” na Action que usa o método do DAO.

Mas, se você já tem muito código com DAOs instanciados direto nos JSPs, deixa assim.

F

jyoshiriro:
Simples: coloca o DAO na Action e não no JSP.

Dai bota um “getXXX” na Action que usa o método do DAO.

Mas, se você já tem muito código com DAOs instanciados direto nos JSPs, deixa assim.

Cara até agora eu não entendi esse lance de por o DAO na action…
Em qual action?
Como vo chamar isso naquele jsp?

Se eu tirar o jsp bean não vai funcionar a linha.

<s:select id="box1View" cssClass="multiple" cssStyle="height:200px;" list="%{#attr.dao_aluno.lista}" listKey="id_alunos" listValue="nome" name="id_alunos" multiple="true" size="%{#attr.dao_aluno.lista.size()}"></s:select>

agradeço mais uma vez a paciência e a ajuda!
abraços

J

Na Action instancia o DAO que quiser como atributo de instância.

Dai cria um “getLista()”, por exemplo. e dentro dele bota: return teuDao.getLista().

R

Isso serve tanto para struts quato para Spring, é meio que padrão a forma de recuperar os dados , pois eles vão na requisão, que faz o bind no form, eu uso e sempre usei dessa forma e funciona corretamente

F

Po ta retornando NULL...
Não consigo gravar no banco o id_alunos e id_projetos...

Quando eu coloco na mão o id_alunos ele grava, o getId_alunos que está retornando null!

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.NullPointerException
	br.com.scb.dao.ProjetosDAO.adiciona(ProjetosDAO.java:76)
	br.com.scb.action.CadastraProjetosAction.execute(CadastraProjetosAction.java:24)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
	com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)
	org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
	org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:211)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:211)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:90)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:192)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510)
	org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>  
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>SCB - Painel de Administração</title>
<%@ include file="header.jsp" %> 
</head>
<body>

<%@ include file="top.jsp" %>


<!-- Content wrapper -->
<div class="wrapper">
	
	<%@ include file="menu.jsp" %>
	
	<!--MELHORAR A VALIDAÇÃO AQUI-->
    
	<div class="success message">
		<s:if test="hasActionMessages()">
			<s:actionmessage/>
		</s:if>	
	</div>
    
    <jsp:useBean id="dao" class="br.com.scb.dao.ProfessoresDAO" />
    <jsp:useBean id="dao_alunos" class="br.com.scb.dao.AlunosDAO" />
    
    <!-- Content -->
    <div class="content">
    	<div class="title"><h5>Projetos</h5></div>
        
        
      <div class="widget first">
        <div class="head"><h5 class="iList">Cadastrar Projetos</h5></div>
        
        <div class="rowElem dualBoxes">
        <h6>Componentes do Projeto</h6><br />
               
		<div class="floatleft w40">
			<s:form action="cadastraProjetos" method="post" id="valid" styleClass="mainForm">  
				<s:select id="box1View" cssClass="multiple" cssStyle="height:200px;" list="%{#attr.dao_alunos.lista}" listKey="id_alunos" listValue="nome" name="id_alunos" multiple="true" size="%{#attr.dao_aluno.lista.size()}"></s:select>
				<s:submit value="Cadastrar" styleClass="basicBtn submitForm mb22"></s:submit>      
			</s:form>
			
			    <br/>
		      
		</div>
                
            <div class="fix"></div>
            </div>
            
            <!--FIM COMPONENTE-->
            
              <!--input type="submit" value="Cadastrar" class="basicBtn submitForm mb22" / -->
              
              <div class="fix"></div>
			
        </div>
        
    </div>
    <div class="fix"></div>
</div>

<!-- Footer -->
<%@ include file="footer.jsp" %> 


</body>
</html>

Quando exibo o html a parte do form está assim:

<div class="floatleft w40">
			<form id="valid" name="valid" action="/scb/cadastraProjetos.action" method="post" styleClass="mainForm">
<table class="wwFormTable">  
				<tr>
    <td class="tdLabel"></td>
    <td
><select name="id_alunos" size="2" id="box1View" class="multiple" style="height:200px;" multiple="multiple">
    <option value="15">Thiago</option>
    <option value="16">Andrei Ribeiro</option>

</select>
<input type="hidden" id="__multiselect_box1View" name="__multiselect_id_alunos" value="" />
</td>
</tr>

				<tr>
    <td colspan="2"><div align="right"><input type="submit" id="valid_0" value="Cadastrar" styleClass="basicBtn submitForm mb22"/>
</div></td>
</tr>
      
			</table></form>



			
			    <br/>
		      
		</div>

CadastraProjetosAction.java

package br.com.scb.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

//import br.com.scb.modelo.Projetos;
import br.com.scb.modelo.Componentes;
import br.com.scb.dao.ProjetosDAO;

public class CadastraProjetosAction extends ActionSupport {

	private static final long serialVersionUID = -5817485575269317513L;
	
	private Componentes componentes;
	
	@Action( value="cadastraProjetos", results = {
			@Result(name="ok", location="/cadastrar-projetos.jsp")
	})
	
	public String execute(){

		new ProjetosDAO().adiciona(componentes);
		addActionMessage("Projeto cadastrado com sucesso!");
		return "ok";		
	}

	public Componentes getComponentes() {
		return componentes;
	}

	public void setComponentes(Componentes componentes) {
		this.componentes = componentes;
	}
	
	
}

ProjetosDAO.java

package br.com.scb.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.List;

import br.com.scb.jdbc.ConnectionFactory;
import br.com.scb.modelo.Componentes;
import br.com.scb.modelo.Projetos;


public class ProjetosDAO {
	

	private final Connection connection;
	
	public ProjetosDAO(){
		connection = new ConnectionFactory().getConnection();
	}
	
	//ADICIONAR Projetos
	
	public void adiciona(Componentes componentes) {
 		
		String sql = "INSERT INTO componentes_projetos (id_alunos, id_projetos) values (?,?)";
		PreparedStatement stmt;
		
			//Projetos projetos = new Projetos();
			try {
				stmt = connection.prepareStatement(sql);
				stmt.setInt(1, componentes.getId_alunos());
				stmt.setInt(2, 1);
				stmt.execute();
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		
	}
	
			

}
F

Alguem me ajuda?
preciso extrair os dados dessa select multipla!

valeu galera!
abraços

Criado 30 de março de 2012
Ultima resposta 3 de abr. de 2012
Respostas 28
Participantes 3