Um. Configuração do struts.xml:
- 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:
- 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>
<a href="aluno_adicionar" target="_blank">Adicionar aluno</a>
<a href="aluno_atualizar" target="_blank">Atualizar aluno</a>
<a href="aluno_remover" target="_blank">Remover aluno</a>
<br/><br/>
<a href="turma_listar" target="_blank">Consultar turmas</a>
<a href="turma_adicionar" target="_blank">Adicionar turma</a>
<a href="turma_atualizar" target="_blank">Atualizar turma</a>
<a href="turma_remover" target="_blank">Remover turma</a> <br/>
</body>
</html>
Visualizar CódigoTeste:
- 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>
<a href="Aluno_adicionar" target="_blank">Adicionar aluno</a>
<a href="Aluno_atualizar" target="_blank">Atualizar aluno</a>
<a href="Aluno_remover" target="_blank">Remover aluno</a>
<br/><br/>
<a href="Turma_listar" target="_blank">Consultar turmas</a>
<a href="Turma_adicionar" target="_blank">Adicionar turma</a>
<a href="Turma_atualizar" target="_blank">Atualizar turma</a>
<a href="Turma_remover" target="_blank">Remover turma</a> <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>
<a href="aluno!adicionar" target="_blank">Adicionar aluno</a>
<a href="aluno!atualizar" target="_blank">Atualizar aluno</a>
<a href="aluno!remover" target="_blank">Remover aluno</a>
<br/><br/>
<a href="turma!listar" target="_blank">Consultar turmas</a>
<a href="turma!adicionar" target="_blank">Adicionar turma</a>
<a href="turma!atualizar" target="_blank">Atualizar turma</a>
<a href="turma!remover" target="_blank">Remover turma</a> <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).----------------------