Struts 2 - ajuda com tag doubleselect

olá galera,

preciso novamente da ajuda de vcs…
estou desenvolvendo um pequeno projeto com Struts 2 versão 2.1.6…
estou usando a convenção e as anotações… não gosto muito de xml :roll:
na verdade esse e meu primeiro projeto q faço com Struts…
sempre utilizei o JSF (faria isso com uma mão amarrada nas costas em JSF)
e estou apanhando das tags do Struts… a bola da vez agora e a doubleselect.
preciso de 2 combo, onde ao selecionar uma opção no 1º carrega o 2º… tipo estado / cidade.
não estou conseguindo fazer nem o exemplo basico com listas estaticas…
eu seleciono o item no combo 1 e não acontece nd com o combo 2.

exemplo basico

***************************** JSP ****************************************
<s:doubleselect label="Teste" list="{'fruit','other'}"
                            doubleName="dishes" doubleList="top == 'fruit' ? {'apple', 'orange'} :
                            {'monkey', 'chicken'}" />

*************************** Action ********************************************

private String dishes;
// getter and setter

nem isso consigo fazer funcionar… isso pq ja apanhei um monte para montar as listas dinamicas q tambem não funcionaram…

por favor me ajudem…

olá galera!!!
finalmente consegui resolver meu problema com o doubleselect… :stuck_out_tongue:

oq estava acontecendo era que nesta versão do struts o javascript gerado pela tag não “combina” muito bem com o esquema de conveção… o javascript não funcionava por causa do hifem na action (tipo listar-chamados)…
fiquei triste :cry: pois conveção de codigo ajuda e muito na hora do desenvolvimento… ate parece q o framework tem vida propria… kkkk

oq tive que fazer para funcionar foi retirar o hifem do nome da action e utilizar anotações para mapear o resultado…

e td funcionou normalmente… :smiley: :smiley: :smiley:

gostaria de deixar aqui um exemplo de codigo para aqueles q tambem tem duvidas com esta tag.

1º - criaremos um index.jsp apenas para chamar a action (poderiamos tambem digitar no navegador 8) )

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  
<%@ taglib prefix="s" uri="/struts-tags" %> 
    
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>Hello</h1>

	<s:a namespace="/actions" action="testtag">go to Test DoubleSelect tag</s:a>
</body>
</html>

no index.jsp não tem nd de absurdo… e apenas um link…

2º - Criaremos nossa pagina de teste da coisa… primeiro com lista estatica…

[code]
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

<%@ taglib prefix=“s” uri="/struts-tags"%>

Insert title here

Test DoubleSelect Tag

<s:doubleselect label="doubleselect" 
	headerKey="0" headerValue="--Selecione--" 
            name="name"
	list="{'fruit','other'}" 

            doubleName="dishes"
	doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" />

<s:submit value="salvar" action="salvar-test"/>

</s:form>

[/code]

na primeira versão da test-tag.jsp temos 3 tags…
<s:form>, <s:doubleselect> e <s:submit>

detalharemos o doubleselect…

label="doubleselect"  >>> nome q sera exibido (label =))
headerKey="0"  >>> posição q sera adicionado o headerValue
headerValue="--Selecione--"  >>> valor q sera adicionado no default 
name="name" >>> onde a tag fara o binding do resultado do combo 1
list="{'fruit','other'}"  >>> lista de item do  combo 1

doubleName="dishes" >>> onde a tag fara o binding do resultado do combo 2
doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" >>> lista de item do  combo 2... com uma pequena logica...

3º - nossa Action…

//imports aqui...
public class TestTagAction extends ActionSupport implements Preparable {

	private static final long serialVersionUID = 1L;

	private String name;
	private String dishes;

	private List<String> listNames;
	private List<String> listDishes;

        // aqui estou fazendo o mapeamento da action "testtag" com o result "success" para o jsp "test-tag.jsp"
	@Action(value = "testtag", 
			results = { @Result(name = "success", location = "/test-tag.jsp") })
	public String testTag() {

              //aqui poderia realizar alguma coisa... sei lah

		return SUCCESS;
	}

         // aqui estou fazendo o mapeamento da action "salvar-test" com o result "success" para o jsp "show-result"
	@Action(value = "salvar-test", 
			results = { @Result(name = "show-result", location = "/show-result.jsp") })
	public String salvarTest() {

		System.out.println("Name = " + name);
		System.out.println("Dishes = " + dishes);
  
                //com isso aqui ele ja saberia q é para ir para o jsp "show-result"... convenção =)
                // mais fiz o mapeamento na anotação...
		return "show-result"; 
	}

        // isso aqui vem da interface Preparable... 
       // estou utilizando para carregar a lista =)
	@Override
	public void prepare() throws Exception {

		listNames = new ArrayList<String>();
		listNames.add("fruit");
		listNames.add("other");

	}

        // isso aqui serve para vc utilizar o combo dinamico...
        // estou adicionando na mão, mais poderia realizar uma busca em um bando de dados...
        // o parametro top vem do jsp... na verdade e oq o cara escolher no combo 1 
	public List<String> getDoubleList(String top) {
		
		listDishes = new ArrayList<String>();

		if (top.equalsIgnoreCase("fruit")) {
			listDishes.clear();
			listDishes.add("apple");
			listDishes.add("orange");
		} else {
			listDishes.clear();
			listDishes.add("monkey");
			listDishes.add("chicken");
		}

		return listDishes;

	}

// getter and setter aqui.... 

}

4º - agora o test-tag.jsp com um select dinamico…

[code]
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

<%@ taglib prefix=“s” uri="/struts-tags"%>

Insert title here

Test Tag

<s:doubleselect label="doubleselect" 
	headerKey="0" headerValue="--Selecione--" name="name"
	list="listNames" doubleName="dishes"
	doubleHeaderKey="0" doubleHeaderValue="--Selecione--"
	doubleList="getDoubleList(top)" />

<s:submit value="salvar" action="salvar-test"/>

</s:form>

[/code]

oque mudou agora e q o doublelist esta utilizando o resultado do metodo getDoubleList(String top) para carregar a lista…
com isso temos a segunda lista dinamica :smiley: :smiley: :smiley:

para colcoar o combo 1 dinamico basta carregar a listNames de algum lugar tipo bd…

5º - aqui um jsp de resultado bem simples…

[code]
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>

<%@ taglib prefix=“s” uri="/struts-tags"%>

Insert title here

Results of test

<s:property value="name"/>
<s:property value="dishes"/>
[/code]

isso aqui foi so para mostrar que ele realmente faz o binding certinho =)

bom galera e isso aew… me desculpem pelo livro q fiz…
espero ter ajudado alguem =)

at + abs

Fala cara, se puder me dar uma força eu to tentando popular dinamicamente meu double select através da sessão mas quando seleciono o item da primeira combo o struts nem se emociona não faz nada… ai fiquei na duvida em qual action eu coloco o o metodo getDoubleList() na action chamadora ou na action da tela que esta a double select

metodo getDoubleList(String top)

	public List<Consultor> getDoubleList(String top){ //top é o id da especialidade da tarefa;
		
		GenericDaoHibernateImpl<Consultor, String> daoConsultor = new GenericDaoHibernateImpl<Consultor, String>(Consultor.class);
		
		List<Consultor> consutores = new ArrayList<Consultor>();
		for (Consultor c : daoConsultor.findAll()) {
			
			for (Especialidade e : c.getEspecialidades()) {
				
				if (Integer.valueOf(top) == e.getId()) {
					consutores.add(c);
				}
			}
		}
		return consutores;
	}

TelaAlocarConsultor.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
  <head>
    <title>Audit - Alocar Consultor</title>
  </head>
  <body>

  <s:form action="alocarConsultor">
  <s:doubleselect label="Selecione a Tarefa"  theme="simple" 
		  headerKey="0" headerValue="--- Please Select ---" name="tarefa"  
  		  list="#session.tarefas" doubleName="Consultores"
  		  listKey="especialidade.id"
  		  listValue="nome"
  		  doubleList="getDoubleList(top)" doubleListKey="cpf" doubleListValue="nome"></s:doubleselect>
 
  
       
     <s:submit value="salvar" action="salvar-test"/>  
 
 
    </s:form>
  </body>
</html>