Select Multiple Struts 2

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

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

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

Código na Action:

[code]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[/code]

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.

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

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

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!

[code]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);
   }
    
}  [/code]

Minha class Alunos ja tem todos os getters and setters!

obrigadão!

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:

[code]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);
   }
    
}[/code]

[code]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;
}

}
[/code]

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

fica sublinhado o put!

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.

Teu while deve ter só essa linha dentro mesmo.

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:

[code]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)[/code]

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.

ProjetoDAO.java

[code]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);
   }
    
}

}
[/code]

cadastrar-projetos.jsp

[code]<%@ 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” %>

SCB - Painel de Administração <%@ include file="header.jsp" %>

<%@ include file=“top.jsp” %>

<%@ 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>

<%@ include file=“footer.jsp” %>

[/code]

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

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

O que é CoC?
Eu utilizo anotation…

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

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?

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?

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

[code]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;
}

}[/code]

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>