Conceitos Fundamentais do Struts2: Configuração e Ciclo de Vida

Um. Configuração do struts.xml:

  1. Método de configruação modular:

Para sistemas com múltiplos módulos, como gerneciamento de ativos e gerenciamento de veículos, podemos separar suas configurações. No arquivo de configuração principal struts.xml, podemos incluir os arquivos específicos de cada módulo:

Estrutura do projeto:

Configuração do struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>


<struts>
    <include file="veiculos.xml"></include>
    <include file="ativos.xml"></include>
</struts>

veiculos.xml:

<struts>

    
    <package name="moduloVeiculos" namespace="/veiculos" extends="struts-default">
        <action name="veiculos" class="br.exemplo.acao.VeiculoAcao">
            <result name="success">${pageContext.request.contextPath}/sucesso.jsp</result>
        </action>
    </package>
    
    
</struts>

Visualizar Códigoaitvos.xml:

<struts>

    
    <package name="moduloAtivos" namespace="/ativos" extends="struts-default">
        <action name="ativos" class="br.exemplo.acao.AtivoAcao">
            <result name="success">${pageContext.request.contextPath}/sucesso.jsp</result>
        </action>
    </package>
    
    
</struts>

Visualizar CódigoVeiculoAcao.java:

public class VeiculoAcao extends ActionSupport{
    private static final long serialVersionUID = 1L;

    public String executar() throws Exception {
        System.out.println("Executando o método padrão da VeiculoAcao");
        return SUCCESS;
    }
}

Visualizar CódigoAtivoAcao.java:

public class AtivoAcao extends ActionSupport{
    private static final long serialVersionUID = 1L;

    public String executar() throws Exception {
        System.out.println("Executando o método padrão da AtivoAcao");
        return SUCCESS;
    }
}

Visualizar CódigoTeste:

  1. Utilização de curingas:

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>


<struts>
    <package name="gerenciamento" namespace="/" extends="struts-default">
        
        <!-- method={1} captura o primeiro curinga -->
        <action name="aluno_*" class="br.exemplo.acao.AlunoAcao" method="{1}">
            <result name="success">sucesso.jsp</result>
        </action>
        
        <action name="turma_*" class="br.exemplo.acao.TurmaAcao" method="{1}">
            <result name="success">sucesso.jsp</result>
        </action>
        
    </package>
</struts>

br.exemplo.acao.TurmaAcao.java:

package br.exemplo.acao;

import com.opensymphony.xwork2.ActionSupport;

public class TurmaAcao extends ActionSupport{
    private String descricao;
    
    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String listar()throws Exception{
        System.out.println("Listando turmas");
        descricao="Lista de turmas";
        return SUCCESS;
    }
    
    public String adicionar()throws Exception{
        System.out.println("Adicionando nova turma");
        descricao="Turma adicionada";
        return SUCCESS;
    }
    
    public String atualizar()throws Exception{
        System.out.println("Atualizando turma");
        descricao="Turma atualizada";
        return SUCCESS;
    }
    
    public String remover()throws Exception{
        System.out.println("Removendo turma");
        descricao="Turma removida";
        return SUCCESS;
    }
    
}

Visualizar Códigobr.exemplo.acao.AlunoAcao.java:

package br.exemplo.acao;

import com.opensymphony.xwork2.ActionSupport;

public class AlunoAcao extends ActionSupport{
    private String nome;
    
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String listar()throws Exception{
        System.out.println("Listando alunos");
        nome="Lista de alunos";
        return SUCCESS;
    }
    
    public String adicionar()throws Exception{
        System.out.println("Adicionando novo aluno");
        nome="Aluno adicionado";
        return SUCCESS;
    }
    
    public String atualizar()throws Exception{
        System.out.println("Atualizando aluno");
        nome="Aluno atualizado";
        return SUCCESS;
    }
    
    public String remover()throws Exception{
        System.out.println("Removendo aluno");
        nome="Aluno removido";
        return SUCCESS;
    }
    
}

Visualizar Códigosucesso.jsp:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Título</title>
</head>
<body>
    Sucesso! ${descricao}
</body>
</html>

Visualizar Códigoindex.jsp:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Título</title>
</head>
<body>
    <h1>Curingas</h1>
    <a href="aluno_listar" target="_blank">Consultar alunos</a>&nbsp;
    <a href="aluno_adicionar" target="_blank">Adicionar aluno</a>&nbsp;
    <a href="aluno_atualizar" target="_blank">Atualizar aluno</a>&nbsp;
    <a href="aluno_remover" target="_blank">Remover aluno</a>&nbsp;
    <br/><br/>
    <a href="turma_listar" target="_blank">Consultar turmas</a>&nbsp;
    <a href="turma_adicionar" target="_blank">Adicionar turma</a>&nbsp;
    <a href="turma_atualizar" target="_blank">Atualizar turma</a>&nbsp;
    <a href="turma_remover" target="_blank">Remover turma</a>&nbsp;<br/>
    

</body>
</html>

Visualizar CódigoTeste:

  1. A configuração com curingas pode ser simplificada:

struts.xml:

<struts>
    <package name="gerenciamento" namespace="/" extends="struts-default">
        <action name="*_*" class="br.exemplo.acao.{1}Acao" method="{2}">
            <result name="success">sucesso.jsp</result>
        </action>
    </package>
</struts>

Como {1}Acao captura aluno/turma em minúsculo, o index.jsp deve ser modificado para usar maiúsculas:

index.jsp:

<body>
    <h1>Curingas</h1>
    <a href="Aluno_listar" target="_blank">Consultar alunos</a>&nbsp;
    <a href="Aluno_adicionar" target="_blank">Adicionar aluno</a>&nbsp;
    <a href="Aluno_atualizar" target="_blank">Atualizar aluno</a>&nbsp;
    <a href="Aluno_remover" target="_blank">Remover aluno</a>&nbsp;
    <br/><br/>
    <a href="Turma_listar" target="_blank">Consultar turmas</a>&nbsp;
    <a href="Turma_adicionar" target="_blank">Adicionar turma</a>&nbsp;
    <a href="Turma_atualizar" target="_blank">Atualizar turma</a>&nbsp;
    <a href="Turma_remover" target="_blank">Remover turma</a>&nbsp;<br/>
    

</body>

O resultado do teste está correto

Do. Invocação de métodos dinâmicos:

struts.enable.DynamicMethodInvocation, habilita a invocação de métodos dinâmicos, o padrão é false;O struts.xml modificado fica da seguinte forma:

<struts>
    
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    
    <package name="gerenciamento" namespace="/" extends="struts-default">
        <action name="aluno" class="br.exemplo.acao.AlunoAcao">
            <result name="success">sucesso.jsp</result>
        </action>
        
        <action name="turma" class="br.exemplo.acao.TurmaAcao">
            <result name="success">sucesso.jsp</result>
        </action>
    </package>
</struts>

index.jsp:

<body>
    <h1>Invocação de métodos dinâmicos</h1>
    <a href="aluno!listar" target="_blank">Consultar alunos</a>&nbsp;
    <a href="aluno!adicionar" target="_blank">Adicionar aluno</a>&nbsp;
    <a href="aluno!atualizar" target="_blank">Atualizar aluno</a>&nbsp;
    <a href="aluno!remover" target="_blank">Remover aluno</a>&nbsp;
    <br/><br/>
    <a href="turma!listar" target="_blank">Consultar turmas</a>&nbsp;
    <a href="turma!adicionar" target="_blank">Adicionar turma</a>&nbsp;
    <a href="turma!atualizar" target="_blank">Atualizar turma</a>&nbsp;
    <a href="turma!remover" target="_blank">Remover turma</a>&nbsp;<br/>
    

</body>

Visualizar CódigoTeste:

Três. Ciclo de vida do Action

Exemplo:

br.exemplo.acao.OlaAcao.java:

package br.exemplo.acao;

import com.opensymphony.xwork2.ActionSupport;

public class OlaAcao extends ActionSupport{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public OlaAcao() {
        System.out.println(this);
    }

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

Visualizar Códigostruts.xml:

<?xml version="1.0" encoding="UTF-8" ?>


<struts>
    <package name="gerenciamento" namespace="/" extends="struts-default">
        <action name="ola" class="br.exemplo.acao.OlaAcao">
            <result name="success">sucesso.jsp</result>
        </action>
    </package>
</struts>

Visualizar CódigoCada vez que solicitamos o link ola, uma instância de OlaAcao é criada, e o construtor da classe imprime o objeto atual;

Resultado do teste:

Várias acessos: http://localhost:8080/Struts2Chap01/ola

console:

Comprovando:

Cada solicitação ola cria uma nova instância de OlaAcao;Cada criação de nova instância garante segurança, mas criar novas instância a cada requisição pode ser considerado um desperdício, e em casos de alta concorrência, pode causar problemas de memória;Quando o Spring gerenciar as Actions do Struts2, elas serão singletons por padrão (embora também possam ser configuradas como multi-instância).----------------------

Tags: Struts2 java MVC framework xml-config

Publicado em 6-23 00:26