Criar um select com action by anotations [RESOLVIDO]

Olá Pessoal!

Pesquisei bastante e não encontrei, os exemplos q encontro são com action q estende a actionsuport.

Pessoal tenho a action abaixo q retorna os dados de minha tabela ( ven_sexo ) (obs: sei q nao deveria ser uma tabela e sim ‘M’ ou ‘F’, mas é apenas um exemplo)
Contudo na action não sei o que devo colocar como retorno, pois não quero redirecionar para nenhuma tabela, apenas quero retornar os valores para uma tag select

package gsa.action;

import gsa.dao.ConnectionFactory;
import gsa.dao.Ven_Sexo;
import gsa.dao.Ven_SexoDAO;

import java.sql.Connection;
import java.util.List;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
 

public class SearchSexoAction {

	private List<Ven_Sexo> vsexos; 
	
	@Action( value = "/searchSexo", results = {
			@Result( name = "ok" ) 
	})
				
	public String execute(){	
		Connection conn = new ConnectionFactory().getConnection();
		Ven_SexoDAO ven_sexo = new Ven_SexoDAO(conn);
		vsexos = ven_sexo.getLista("");
		return "ok";		
	}

	public List<Ven_Sexo> getVsexos() {
		return vsexos;
	}
	
}

Minha dúvida é o que devo colocar no:

   @Action( value = "/searchSexo", results = {
			@Result( name = "ok" ) 
	})

depois preciso fazer minha select receber a vsexos, correto?

Obrigado pessoal!

Sua idéia é que essa action seja exclusivamente para o “select” no jsp ou a action vai redirecionar para um JSP que possui esse select?

Salve Yoshi!

Olha tenho uma tabela clientes que possui o id_sexo e tenho a tabela sexo.

as duas estao relacionadas atraves do id_sexo.

o que precisaria seria dar ao alterar um cliente ter a opcao de selecionar o sexo Masculino ou Feminino e por baixo preencher o id_sexo.

Mas nao consigo nem trazer os dados da action q pesquisa o ven_sexo.

preciso saber o que preencher nos parametros da @action

Obrigado!

Olha, não sei se entendi bem o que você quer, mas me parece que você pode preencher ou uma coleção do tipo “sexo” ou um Map. Dai basta disponibilizar via “get” público que o JSP tem acesso.


Exemplo com Map:

Action:

public Map getSexos() { Map m = new HashMap(); m.put("M","Masculino"); m.put("F","Deminino"); return m; }

JSP:

<s:radio label="Sexo" list="sexos" name="id_sexo"></s:radio>

Exemplo com Coleção:

Action:

public List getSexos() { return dao.getSexos(); //sua lista do banco }

JSP:

<s:radio label="Sexo" list="sexos" name="id_sexo" listKey="id_sexo" listValue="de_sexo"></s:radio> (supondo que os campos de "id" e "descrição" de sexo são "id_sexo" e "de_sexo")

Tanto com Map como com coleção, na Action também deve haver um “setter”:
public setId_sexo(String id_sexo) {
this.id_sexo = id_sexo;
}

Assim, o que chega na Action é apenas “m” ou “f”.

Ola Yoshi!

Obrigado pelo apoio, consegui fazer funcionar junto com o jqgrid.

alterei a action para:

package gsa.action;

import gsa.dao.ConnectionFactory;
import gsa.dao.Ven_Sexo;
import gsa.dao.Ven_SexoDAO;

import java.sql.Connection;
import java.util.List;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

public class SearchSexoAction {

	public List&lt;Ven_Sexo&gt; getSexos() {
		return sexos;
	}


	public void setSexos(List&lt;Ven_Sexo&gt; sexos) {
		this.sexos = sexos;
	}

	private List&lt;Ven_Sexo&gt; sexos;	
	

	//@Result( name = "ok", location="/WEB-INF/pages/testeselect.jsp" )
	@Action( value = "searchSexo", results = {
		@Result( name = "ok", location="/WEB-INF/pages/testeselect.jsp" )
	})
				
	public String execute(){	
		Connection conn = new ConnectionFactory().getConnection();
		Ven_SexoDAO vSexoDao = new Ven_SexoDAO(conn);
		sexos = vSexoDao.getLista("");
		return "ok";		
	}

	
}

Criei a testeselct.jsp:

&lt;%@taglib prefix="s" uri="/struts-tags"%&gt;

&lt;s:select list="sexos" listKey="id_sexo" listValue="descricao"  theme="simple" /&gt;

Na jsp Cliente criei a chamada via struts para a action:
e no grid precisei alterar o campo id_sexo para fazer

&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"    pageEncoding="ISO-8859-1"%&gt;
&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt; 
&lt;%@ taglib prefix="sj" uri="/struts-jquery-tags"%&gt;
&lt;%@ taglib prefix="sjg" uri="/struts-jquery-grid-tags"%&gt;


	&lt;s:url id="remoteurlCliente" 	action="searchCliente"/&gt;
	&lt;s:url id="remotesexo"          action="searchSexo"/&gt;

        &lt;sjg:gridColumn 
        	id="id_sexo"
        	name="id_sexo" 
        	index="id_sexo" 
        	title="Id. Sexo" 
        	sortable="true"
			width="80"
    		editable="true"
   			search="false"    			
    		edittype="select"
    		editoptions="{ dataUrl : '%{remotesexo}' }"
    		formoptions="{label:'Selecione Sexo'}"	    		    		       	
        	/&gt;	        		        		        		        		        	

agora preciso fazer mostrar a jsp testselect no formulario e nao no grid.

Muito Obrigado pela resposta!

Amigo,

antes, algumas dicas:

1.
se sua action se chama “SearchSexoAction” nem precisa usar anotações no método execute(), caso não queira nenhum mapeamento diferente de um simples redirect de JSP. A Url criada automaticamente seria “search-sexo”. Assim, bastaria você ter uma JSP chamada “/WEB-INF/content/search-sexo.jsp” que esta seria chamada tanto no caso de “success”, como “error” e “input” para essa Action, entendeu?

2. Recomendo fortemente que suas Actions estendam direta ou indiretamente a ActionSupport. Sei que o discurso “uma Action no Struts2 pode ser um simples Pojo” é bonitinho, mas a verdade é que subclasses de ActionSupport trazem métodos e constantes que ajudam e MUITO nosso trabalho.

Bem, não entendi o que você não conseguiu fazer. A tag <s:select> que você mostra no código está quase certinha. Faltou só o atributo “name” lá para identificar como o valor será identificado na Action.

Olá Yoshi!

Na apostila da caelum o pessoal comenta que estender a actionsuport não é mto bom, por isso q estava utilizando anotations, contudo,
como estou inciando em java, fica difícil pesar os prós e contras, mas legal, irei fazer a alteração para testar sua dica utilizando convenções.

Qdo utilizo esta action junto ao jqgrid funciona diretinho, o fato é que criei um formulário personalizado para mostrar os dados ao usuário
ao invés de utilizar o form padrão q o jqgrid utiliza.

Neste caso eu preciso ao efetuar dois cliques na linha do grid mostrar todos os dados no meu form, conforme código abaixo:

	function clienteEdit(){
		var grid	= "#gridCliente";	
		row = $(grid).jqGrid('getGridParam','selrow');
		$(grid).jqGrid( 'GridToForm', [row], "#formCliente" );

                }

Este grid mostra uma lista de clientes, sendo q cada cliente tem o seu sexo, 1 - masculino e 2 - feminino

Neste caso qdo chamo a função acima estou trabalhando para q ele capture o id_sexo do cliente e altere o value do select, assim mostraria corretamente o sexo do mesmo.

Apenas para teste estou setando um código fixo, mas depois irei pegar o código correto q vem da row:


function clienteEdit(){
		var grid	= "#gridCliente";	
		row = $(grid).jqGrid('getGridParam','selrow');

                   	$('#DivSexo').load('searchSexo');
		$('#select_id_sexo option:selected').removeAttr('selected');
		$('#select_id_sexo option[value=1]').attr('selected','selected');

		$(grid).jqGrid( 'GridToForm', [row], "#formCliente" );
}

Estou quase lá. Ele está alterando mas por algum motivo ele altera mas volta para o valor inicial padrão.

Mas, acredito q daqui consigo seguir. Vou testar com calma.

Obrigado pelas dicas!

Bem, quanto a estender ActionSupport não ser uma boa, sinceramente é pra quem não criou uma grande aplicação com Strust2 ou então criou mas não se importa muito com produtividade.
Não ter métodos como “addActionMessage()”, “addActionError()”, “cleanActionMessages()”, dentre outros e as constantes de retorno é um baita XAROPE numa action do tipo “mamãe quero ser só um pojo”.

A única vantagem de não fazer o “extends ActionSupport” é poder dizer “minhas Actions possuem baixo acoplamento” ou “minhas actions são POJOS”. Estender o ActionSupport aumentará um pouco o acoplamento, mas os benefícios são tantos que isso não vira um ponto ruim.

Interessante, é justamente o que não tenho conhecimento suficiente para avaliar. Obrigado pelas explicações. Ainda não precisei utilizar
estes recursos, mas só pelo nome já da para ter uma idéia interessante:

  • addActionError, provavelmente deve redirecionar os erros para uma action central.

Bacana, mesmo. Vc teria algum tutorial de struts 2 para indicar ou algum livro que valha apena?

Obrigado!