Carregar combo (select) no struts 2 sem entrar na Action

Senhores boa noite.

Sei que no JSF se eu tenho um select e seto a lista como um método do bean esse select é carregado normalmente.

Agora no struts dois não é bem assim.

Para conseguir carregar um select de cidades, por exemplo, eu tenho que colocar no link de acesso à essa página algo como acao!metodoAcao.action que carrega as cidades e mostra tudo na tela.

A pergunta é se é mesmo necessário passar pela action só para carregar esse select?

Aguardo resposta.

Amigo, se não quiser fazer nenhuma POG (entenda-se Scriptlet) é necessário passar por uma Action, sim.

Mas você não precisa criar outro mapeamento ou método específico pra isso. Use um getter público que retorne a coleção que deseja que funciona tranquilo.

O problema, se é que não existe algo que resolva, é que no método getListaCidades() que retorna a lista de cidades eu teria que retornar uma string que seria o direcionamento no struts.xml para a página específica. Aí o get deixaria de ser um List getListaCidades() para ser String getListaCidades(). Tem como contornar isso? E o uso de POG é uma solução ruim?

Agradeço a ajuda.

Amigo, desculpe, mas não entendi o que você quis dizer ^^’

Foi mal vou reformular.

É que no Struts tenho que tem um método que retorne uma String que, dependendo da configuração do struts.xml, direciona para uma página qualquer.

Ex:

public List<Cidades> getListaCidades() {
this.listaCidades = listaCidades;
}

Quando você diz:

Eu entendi que era para usar o get public da variável listaCidades.

Para eu colocar no meu form que chama a página que contém o select de cidades eu não poderei utilizar o método acima pois tenho que retornar uma string para ir para a página que utiliza essa lista. Por isso tenho que ter um método tipo carregaFormulario() que retorne uma string para a página que eu queira.

Entendeu?

Obrigado.

Amigo, insisto que o get público resolve teu problema. Já trabalhei em 4 projetos com Strust2 e já ministrei vários cursos desse framework. Todos os getters públicos da sua Actions são acessíveis como se fossem atributos de requisição em seu JSP, entendeu? Nisso o Struts2 lembra um Managed Bean do JSF.

jyoshiriro me desculpe aí mas ainda não entendi como o get publico poderia resolver meu problema.

Tenho um menu que chama uma página jsp para pesquisa.

				<s:a href="pnr!consultaDesocupacao.action">Desocupar PNR</s:a>

atualmente esse link chama um método da action que retorna uma string que direciona para a pagina que tem o formulário para pesquisa. Isso somente para carregar o select. So pelo fato de passar na action a lista listaAreas já está preenchida.

	public String consultaDesocupacao() {
		return "consultaDesocupacao";
	}

Agora pergunto (novamente desculpas) onde eu poderia chamar o metodo getListaAreas para resolver esse problema?

Se puder passar o seu msn explico melhor a situação. Pelo jeito tu é o cara o struts 2 e sua ajuda será muito importante.

Olha só, não quie ser pedante ou o “sabe tudo”. Desculpe se pareceu isso. Apenas quis passar segurança na minha resposta, ok?

Veja este exemplo:

Action:

[code]public class SalvarBairro extends… {

// método mapeado automaticamente via convenção, sem necessidade ne XML ou anotação
public String execute () {

}

public List getCidades() {
List cidades = … preenche a lista;
return cidades;
}
}[/code]

Url para chamar: salvar-bairro!input (assim o método execute é ignorado e o Struts2 “sabe” que você quer ir para uma entrada.

No JSP (salvar-cidade.jsp, se quiser aproveitar a convenção e dispensar XML e anotação):

<s:select list="cidades" .../>

Mesmo depois da execução, na chamada do execute, pode ocorrer um erro e você ser redirecionado novamente para o mesmo JSP. Mesmo assim o getter de Cidades resolve teu problema.

Espero ter ajudado.

Mas como faço isso de uma url em outra jsp? Como o método getCidades sabe que tem que ir para a página x.jsp?
Se puder implementar isso utilizando meu exemplos acima.

Tranquilo, so quero entender essa porra.

Abraço.

É tipo igual ao VRaptor?

Aki

Utiliza o nome da classe para direcionar para o jsp?

Não é o Struts 2 que é igual o VRaptor e sim o contrário (eu sei, dá no mesmo, to querendo dizer que o Struts2 tinha isso há mais tempo).

O getCidades não encaminha pra lugar nenhum! O Struts2 mapea automaticamete o “salvar-cidade.jsp” para qualquer retorno que você der no método execute. Os getters públicos só possibilitam o JSP de resultado ter acesso a objetos dinâmicos.

jyoshiriro consegui resolver o problema que era não passar por um método para carregar meus selects.

Agora surgiram outra dúvidas.

Minha classe que interage com as jsp chama-se PNRAction porém não consegui utilizar pnr-action na chamada do formulário.

Ex:

<s:form action = "pnr-action!input">
....

</s:form>

Outra coisa e se eu fosse utilizar outro retorno personalizado para o método? Tipo pnr-Action!desocupar e mapear isso no struts.xml não funcionou aki comigo, ele procurou por um método chama desocupar na action.

Já resolvi só para tirar essas dúvidas novas.

Amigo, nunca deve-se chamar “!input” num formulário. Esse esquema de “inpuit” é para vocE^chegar no JSP de formulário sem executar o método principal de sua Action. No atributo action do seu form use o mapeamento sem “!input” no final, ok?

Está ficando cada vez mais obscuro. Pena que estou sem tempo algum para estudar no momento. Tenho que me virar com ajuda de vocês.

Vou explicar a situação toda porque sinceramente não entendi nada do que você está tentando me ensinar.

Tenho um jsp que lista todas as opções de funcionalidades em um determinado módulo de um projeto.

<li>
	<img src="layout/img/icone_new.gif" height="20px" width="20px" />
	<s:a href="*********">Desocupar PNR</s:a>
</li>

O Link acima envia o usuário para uma tela que tem um select que deve estar preenchido com algumas opções para seleção.

<s:form>
	<s:textfield name="permissionario.nip" label="NIP" maxlength="8" onkeypress="mascara(this,soNumeros)" size="7"></s:textfield>
	<s:textfield name="permissionario.nome" label="Nome" size="40"></s:textfield>
	<s:select list="listaAreas" listKey="idArea" listValue="descArea" label="Endereço" />
	<s:submit value="" cssClass="submit" ></s:submit>
</s:form>

Minha dúvida era se tinha alguma maneira (Como funciona no JSF) de listar esse <s:select> sem passar pela Action. Essa dúvida o amigo jyoshiriro respondeu.

E ainda disse que eu não precisava de um método específico somente para passar pela action e retornar para a jsp com o select populado.

Minha Action:


.......

public class PNRAction extends ActionSupport implements SessionAware {

........

@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return super.execute();
	}

..........

private List<PNRArea> listaAreas;

public List<PNRArea> getListaAreas() {
		listaAreas = PNRAreaDAO.getInstance().getAll();
		return listaAreas;
	}

public void setListaAreas(List<PNRArea> listaAreas) {
		this.listaAreas = listaAreas;
	}

............

E para solucionar na marra escrevia um método tipo:

public String formularioDesocupacao() {
        return "desocuparPNR";
}

Isso só para passar pela Action e preencher a listaAreas.

Agora jyoshiriro eu não entendi muito bem o que fazer para não precisar passar por um método. Agradeço sua paciencia e aguardo sua ajuda.

Parei um pouco de trabalhar com Struts 2 mais essa dúvida em particular gostaria que algum santo me ajudasse a entender.

Pronto entendi tudo. Coisa simples que no momento de desespero não vai nem f…!

Agora para os amigos do Struts 2 tem que habilitar alguma coisa para poder utilizar annotations? Pois faço tudo certinho como meu amigo aqui ensinou ai ele sempre vai atrás das configurações no struts.xml.