Mesma Action para Jsp diferentes

15 respostas
N

Olá pessoal. Estou evoluindo aos poucos em java… muita coisa encontrei aqui no GUJ, logo agradeço antecipadamente pela ajuda.

O caso é o seguinte… possuo a action

@Action(value = "carregaProdutos", results = { @Result(name="ok",location="/jsp/lista-clientes.jsp"), @Result(name="erro",location="/erro.jsp") })

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?

15 Respostas

drsmachado
Você precisa criar apenas a configuração da action
@Action(value = "carregaProdutos", results = {   
            @Result(name="ok",location="/jsp/lista-clientes.jsp"),   
            @Result(name="erro",location="/erro.jsp") 
            //Adicione
            ,
            @Result(name="outrapag", location="/outra.jsp")
    })
N

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:

String page;
//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")      
    })   
    public String execute(){   
String retorno = "erro";//caso nada de certo, erro será retornado
        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 retorno;   
        }   
        if(page.equals("lista-clientes"){
            retorno = "ok";
       }else if(page.equals("outra"){
          retorno = "outrapag";
        }
        return retorno;   
    }

Saca?

N

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

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

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…

Obrigado mais uma vez.

drsmachado

Vamos por partes.
A taglib do struts 2 não contempla o elemento do html. ele até possui um <s:url> mas é uma estrutura diferente.
Veja um exemplo

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
   <%@taglib uri="/struts-tags" prefix="s" %>
<!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=ISO-8859-1">
<title>Exemplo s:url</title>
</head>
<body>
<s:url action="hello" var="helloLink">
  <s:param name="userName">Bruce Phillips</s:param>
</s:url>

<p><a href="${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>

<p><a href="${cpLista}">Lista de Clientes</a></p>
<p><a href="${cpEstoque}">Estoque de Veiculos</a></p>

Este exemplo foi encontrado aqui http://struts.apache.org/2.2.3/docs/using-struts-2-tags.html

N

meu menu está assim agora:

<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")

    if:if (page.equals("listaClientes")){ return "lista"; }else if (page.equals("estoqueVeiculos")){ return "estoque"; } return "erro";

    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

    entao... aí volta na minha pergunta inicial... eu usaria request.getparameter como eu vou pegar os dados na action?
    minha action está somente assim.

    public class CarregaProdutosAction {
    	private List<Veiculo> veiculos;
    	private List<Usuario> usuarios;
    	String page;
    
    	@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")
    	})
    	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";
    		}
    		if (page.equals("listaClientevis")){
    			return "lista";
    		}else if (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:

    <html>
    <body>
    <s:form action="NomeAction">
    Nome<input type="text" name="meuNome"/><br/>
    <s:submit value="Enviar"/>
    </s:form>
    </body>
    </html>
    

    E a Action

    public class TesteAction{
     private String meuNome;
     public void setMeuNome(String meuNome){
     this.meuNome = meuNome;
    }
    public String getMeuNome(){
     return this.meuNome;
    }
    
    @Action(value="NomeAction, results{
      @Result(name="ok", location="pagina.jsp")
    })
    public String verificaMeuNome(){
      if(meuNome != null){
       return "ok";
      }else{
      return "erro";
    }
    }
    }
    

    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

    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.

    Criado 8 de dezembro de 2011
    Ultima resposta 9 de dez. de 2011
    Respostas 15
    Participantes 2