simples… ela retorna uma lista pra pagina lista-clientes.jsp
porem eu gostaria de usar essa mesma lista em outra JSP, para popular uma combo…
dúvida: preciso criar outra select identica somente mudando o campo location ou existe alguma outra maneira de utilizar essa action em outra pagina jsp?
aí que tá… eu preciso do mesmo metodo… vou colar aqui…
@Action(value = "carregaProdutos", results = {
@Result(name="ok",location="/jsp/lista-clientes.jsp"),
@Result(name="erro",location="/erro.jsp")
})
public String execute(){
try {
this.veiculos = new VeiculosDAO().getVeiculos();
this.usuarios = new UsuarioDAO().listaVendedoresVeiculos();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("erro no carregaProdutosAction"+e.getMessage());
return "erro";
}
return "ok";
}
eu ja tenho o metodo getVeiculos() retornando “ok” , precisaria manter esse ok pra pagina lista-clientes.jsp nao parar de funcionar… caso eu coloque outro return… como eu definiria qual é o correto… ao meu ver ele sempre retornaria “ok”.
pensei algo sobre (se os dados vieram da pagina 1 retorne “ok” se nao retorne “outraPagina”…se der erro retorne “erro”).
drsmachado
O retorno não deve ser fixo e, você pode colocar um parâmentro de restrição:
Stringpage;//getter e setter de page@Action(value="carregaProdutos",results={@Result(name="ok",location="/jsp/lista-clientes.jsp"),@Result(name="erro",location="/erro.jsp"),@Result(name="outrapag",location="/outra.jsp")})publicStringexecute(){Stringretorno="erro";//caso nada de certo, erro será retornadotry{this.veiculos=newVeiculosDAO().getVeiculos();this.usuarios=newUsuarioDAO().listaVendedoresVeiculos();}catch(SQLExceptione){e.printStackTrace();System.out.println("erro no carregaProdutosAction"+e.getMessage());returnretorno;}if(page.equals("lista-clientes"){retorno="ok";}elseif(page.equals("outra"){retorno="outrapag";}returnretorno;}
Saca?
N
nesken
cara muito obrigado… funciona em partes…
na minha aplicação eu tenho o mesmo menu pra todas as paginas… então eu poderia ir para lista-clientes.jsp ou para lista-estoque.jsp estando na tela inicial… de acordo com minha vontade… vou colocar esta string page para receber o “name” do menu, acho que funciona…
drsmachado
Sim, deverá funcionar.
A idéia central do struts é criar uma estrutura que te permita ampliar a forma de desenvolvimento, baseada em MVC.
Isso implica em centralizar ações no controller (no caso, Action) e, dessa forma, você pode utilizar recursos de lógica e java.
N
nesken
drsmachado, se nao for abusar muito da sua boa vontade… como eu pego o “name” de algum campo da minha jsp pela action?
se eu estivesse fazendo atravez de servlets bastava usar o request.getparameter…
drsmachado
Se ele não estiver referenciado em uma tag do struts, não pega.
Por isso existem as <s:>
N
nesken
então. eu importei a taglib <%@taglib uri="/struts-tags" prefix="s" %>
mas qual o parametro que passo no meu menu?? eu nao conhecia essa taglib e estou procurando sobre ela… coloquei assim nos meus menus.
<s:a href="carregaProdutos" name="listaClientes">Lista de Clientes por Modelo<sup>novo</sup></s:a>
<s:a href="carregaProdutos" name="estoqueVeiculos">Estoque de veículos<sup>novo</sup></s:a></li>
mas acho que está errado… e na minha action eu criei uma variavel String … mas nao sei como receber o “name” que vem do meu jsp…
<%@pagelanguage="java"contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%><%@tagliburi="/struts-tags"prefix="s"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html; charset=ISO-8859-1"><title>Exemplo s:url</title></head><body><s:urlaction="hello"var="helloLink"><s:paramname="userName">Bruce Phillips</s:param></s:url><p><ahref="${helloLink}">Hello Bruce Phillips</a></p></body></html>
Onde:
s:url = Tag que irá criar um link
action = É a action para a qual você quer apontar
var = É o nome da variável que será criada contendo a informação da url a ser acessada
s:param = Tag que adiciona parâmetro à url
name = Nome do parâmetro
${helloLink} = EL que captura a variável criada pelo s:link e permite que ela seja utilizada como href do elemento html
No teu caso, a action seria a mesma, porém, o param seria diferente, mas com mesmo nome:
<s:url action="carregaProdutos" var="cpLista">
<s:param name="page">listaClientes</s:param>
</s:url>
<s:url action="carregaProdutos" var="cpEstoque">
<s:param name="page">estoqueVeiculos</s:param>
</s:url>
<li><a href="${cpLista}">Lista de Clientes por Modelo<sup>novo</sup></a></li>
<li><a href="${cpEstoque}">Estoque de veículos<sup>novo</sup></a></li>
a tag
é porque montei um menu dropdown…
Entendi a logica: Quando clico no menu “estoque de Veiculos” ele direciona para a variavel cpEstoque… que por sua vez aciona a action “carregaProdutos” enviando “page” que contem a informaçao “estoqueVeiculos”.
Só que estou tendo erro de nullpointer no if… dentro da action… ela está assim.
Results:@Action(value = "carregaProdutos", results = {
@Result(name="lista",location="/jsp/lista-clientes.jsp"),
@Result(name="erro",location="/jsp/erro.jsp"),
@Result(name="estoque",location="/jsp/pesquisaEstoque.jsp")
erro: java.lang.NullPointerException br.com.intranet.action.CarregaProdutosAction.execute(CarregaProdutosAction.java:34)
a linha 34 é a linha do if da lista… mas o erro ocorre neste if mesmo que eu clique no menu do estoque.
Obrigado pela sua aula e paciência.
drsmachado
Acontece que page não está recebendo o valor.
Será preciso checar toda a tua Action para saber o que está acontecendo.
N
nesken
entao... aí volta na minha pergunta inicial... eu usaria request.getparameter como eu vou pegar os dados na action?
minha action está somente assim.
publicclassCarregaProdutosAction{privateList<Veiculo>veiculos;privateList<Usuario>usuarios;Stringpage;@Action(value="carregaProdutos",results={@Result(name="lista",location="/jsp/lista-clientes.jsp"),@Result(name="erro",location="/jsp/erro.jsp"),@Result(name="estoque",location="/jsp/pesquisaEstoque.jsp")})publicStringexecute(){try{this.veiculos=newVeiculosDAO().getVeiculos();this.usuarios=newUsuarioDAO().listaVendedoresVeiculos();}catch(SQLExceptione){e.printStackTrace();System.out.println("erro no carregaProdutosAction"+e.getMessage());return"erro";}if(page.equals("listaClientevis")){return"lista";}elseif(page.equals("estoqueVeiculos")){return"estoque";}return"erro";}
nao vi necessidade de postar os gatters and setters.. eu criei a variavel page... mas como receber os dados da pagina?
drsmachado
Esquece o request.getParameter;
No Struts 2 a associação entre atributo e parâmetro é feita de forma automática.
Quando você possui um parâmetro com nome param e, na Action, um atributo com nome param com os devidos getter e setter, a associação é automática:
A idéia central do struts 2 é relacionar a jsp e seus parâmetros com os atributos da Action, assim como no javaBean chamado pela tag do jsp jsp:useBean que referencia os parâmetros pela tag jsp:setProperty
No caso da tua Action, basta criar o getter e setter para page…
N
nesken
hummm… realmente funcionou… como eu não tinha declarado a variavel page como “private” achei que nao precisaria do getter and setter pra ela… cara muito obrigado… foi um aprendizado muito bom…
drsmachado
Essa questão serve para algumas lições.
Sempre declare atributos que não serão estáticos como private.
Sempre prefira encapsular os atributos, utilizando getters e setters.