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
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
[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” %>
<%@ 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"> > </button>
<button id="allTo2" type="button" class="dualBtn"> >> </button><br />
<button id="to1" type="button" class="dualBtn mr5"> < </button>
<button id="allTo1" type="button" class="dualBtn"> << </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>