1. Interceptador no Struts2 (núcleo da função de quadro)
1. Filtro versus interceptador
A função filtro versus interceptador é uma coisa. Os filtros são tecnologia na especificação do servlet que pode filtrar solicitações e respostas.
Os interceptores são a tecnologia na estrutura do STRUTS2, implementando a idéia de programação AOP (orientada para a seção), que é flugable e pode ser interceptada antes ou depois de acessar um determinado método de ação.
Pilha de interceptores: junte -se aos interceptores em uma corrente em uma certa ordem. Ao acessar o método interceptador, os interceptores na cadeia interceptores do STRUTS2 serão chamados em sequência na ordem em que definidos anteriormente.
Princípio de execução do STRUTS2 - Análise subjacente
2. Interceptador personalizado
O STRUTS2 define uma interface interceptora interceptora.
Existem três métodos abstratos na interface interceptores
• init: esse método será chamado imediatamente após a criação do interceptador e será chamado apenas uma vez durante a vida do interceptador. Os recursos relevantes podem ser inicializados neste método.
• Intercepto: esse método será chamado quando uma solicitação de ação for interceptada.
• Destruir: Este método será chamado antes que o interceptador seja destruído e será chamado apenas uma vez durante o ciclo de vida do interceptador.
Por sua vez, os struts chamarão o método de interceptação de cada interceptador registrado pelo programador para uma ação. Cada vez que o método de interceptação é chamado, os suportes passam uma instância da interface ActionInvocation.
ActionInvocation: representa o status de execução de uma determinada ação. O interceptador pode obter o objeto de ação e o objeto de resultado associado à ação do objeto desta classe. Depois de concluir a própria tarefa do Interceptor, o interceptador chamará o método Invoke do objeto ActionInvocation para a próxima etapa no processo de processamento de ação.
Você também pode chamar o método AddPreresultListener do objeto ActionInvocation para "pendurar" um ou mais ouvintes pré -cultivadores. Esse objeto do ouvinte pode fazer algo antes de começar a executar o resultado da ação após a execução da ação.
Etapas interceptadoras personalizadas:
um. Escreva uma classe para implementar a interface com.opensymphony.xwork2.intercept.intercept, ou herdar
com.opensymphony.xwork2.intercept.abstractInterceptor Classe. (Modo adaptador), geralmente escolhe herdar o AbstractIntercept (Interceptor residirá na memória). Porque a classe AbstractInterceptor implementa a interface interceptora. Fornece uma implementação em branco para init e destrua
Escreva dois interceptores interceptordemo1 e interceptordemo2
pacote com.itheima.interceptor; importar com.opensymphony.xwork2.actionInvocation; importação com.opensymphony.xwork2.intercept.abstractInterceptor; public class InterceptOrdemo1 estende a interceptor abstrate -IMPROTCETOR {// esse método é chamado de tempo que a ação é accessada. String rtValue = invocação.invoke (); // liberação, por que a string retorna aqui? Porque o resultado final retorna o resultado da ação, e o resultado da ação é o tipo string system.out.println ("intercept demo1"); retornar rtvalue; }} pacote com.itheima.interceptor; importar com.opensymphony.xwork2.actionInvocation; importar com.opensymphony.xwork2.intercept.abstractInterceptor; importe.opensymPhony.xwork2.Intercept.preResulting This Classe interceptemo2 ASTENDESSINTERCORTORMOR {Metoder the ClasstEnTendemo2 ASTENDENSINTERCORTOR { Intercept (ACTHONVocation Invocation) lança Exceção {// Invocation.addPreresultListener (new prereresultListener () {// // public void beforeResult (Invocação de ação, antes da String ResultCode) {// System.out.printnn ("Antes do resultado exibido"); //} System.out.println ("Antes do intercepto Demo2"); String rtValue = invocação.invoke (); // release System.out.println ("Demo2 interceptado"); retornar rtvalue; }}b. Ele precisa ser definido em struts.xml, definir o interceptador e defini -lo primeiro antes do uso.
<pacote name = "p1" estende = "struts-default"> <!-interceptador de definição: válido apenas para o pacote atual-> <interceptor name = "interceprotDemo1"> </sociumtor> <interceptor name = "interceprotDemo2"> </soccetor> </interceptor> </intercetor>
c. Pode ser usado na configuração de ação
<ação name = "Action1" Method = "Execute"> <!- Use o interceptador definido. Se nenhum interceptador for especificado, todos os interceptores na pilha padrão da pilha serão usados por padrão; Depois que qualquer interceptador é especificado, o padrão é inválido-> <interceptor-ref name = "interceprotDemo1"> </sociumpor-ref> <interceptor-ref name = "interceprotDemo2"> </interceptor-ref> <sult> /success.jsp </resultado> </action>
Implementar a classe de ação Demo1Action
pacote com.itheima.action; import com.opensymphony.xwork2.actionsupport; public class Demo1Action estende o ACTIONSupport {@Override public String Execute () lança a exceção {System.out.println ("Execute executado"); sucesso de sucesso; }}Resultados de execução
Como as funções como o upload de arquivos, a verificação de dados, encapsulando os parâmetros de solicitação à ação no STRUTS2 são implementados pelo interceptador no padrão padrão do sistema, o interceptador que definimos precisa se referir à estrutura padrão do sistema, para que o aplicativo possa usar as muitas funções fornecidas pela estrutura de struts2.
Se nenhum interceptador for especificado, todos os interceptores na pilha padrão da pilha serão usados por padrão; Depois que qualquer interceptador é especificado, o padrão é inválido. Além de usar um interceptador personalizado, você também precisa usar o DefaultStack. Você pode fazer isso
Método 1: (Usado por você), basta configurar o padrão personalizado e padrão em ação.
Método 2: (Quando todo mundo o usa), se você deseja que todas as ações do pacote usem um interceptador personalizado, precisará usar a pilha interceptadora de pilha interceptores, definir uma pilha interceptora e, em seguida, na ação, você pode definir o myDeptackSceptor como o interceptor padrão, e o Nome do Nome do MyDeftack "/>.
<Interceptores> <Interceptor name = "interceprotDemo1"> </soceptor> <interceptor name = "interceprotDemo2"> </socceptor> <interceptor-stack name = "myDefaultStack"> <Interceptor-ref Name = "defaultstack"> </intercetor-refref> name = "interceProtDemo1"> </interceptor-ref> <interceptor-ref name = "interceprotDemo2"> </interceptor-ref> </interceptor-stack> </interceptores> <ação name = "action3" Method = "login"> <interceptor-name = "MyDeffult (myDeffull (action3" Method3 ""> <intercetor-rame = "MyDeffult (myDeffull (action3" Method3 ""> <intercetor-reftha) <sild> /success.jsp </sireld> </ction>
3. Interceptor de Struts2
Caso 1: verifique se o usuário está conectado
1. Escreva a página login.jsp
<Body> <form ação = "$ {PageContext.request.ContextPath} /Login.action" method = "post"> <input type = "text" name = "userName"/> <br/> <input type = "text" name = "senha"/<br/> <input Type = "submit")2. Escreva a classe LogIncheckInterceptor para verificação de login
pacote com.itheima.intercept; importar javax.servlet.http.httpSession; importar org.apache.struts2.servLeActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xercetor.ActRepTractInTocation; Invocation) lança Exceção {HttpSession Session = ServletActionContext.getRequest (). getSession (); // Obtenha o objeto de sessão através do servletActionContext Object User = session.getAttribute ("Usuário"); if (user == null) {// sem login retornar "login"; // retornar a uma exibição lógica} retornar invocação.invoke (); // release}}3. Escreva o arquivo de configuração de configuração Struts.xml
<pacote name = "p2" estends = "struts-default"> <iSceptors> <interceptor name = "logincheckIntercept"> </interceptor> <interceptor-stack name = "myDefaultStack"> <interceptor-recef name = "defaultstack"> </intercetor-rept-Eptor-rEfor-recer-rhef-name = " </interceptor-ref> </soceptorstack> </interceptor-stack> </socceptors> <ação name = "login" method = "login"> <sirel> /login.jsp </resultado> </ction> </package>
4. Escreva uma classe de ação CustomOAction
pacote com.itheima.action; importar org.apache.struts2.servletActionContext; importar com.opensymphony.xwork2.actionSupport; public class CustomOActionAction estende o ACOCTIPPORT {public String Login () {System.out.println ("login"); ServletActionContext.getRequest (). GetSession (). SetAttribute ("Usuário", "PPP"); sucesso de sucesso; }}Caso 2: Monitorando a eficiência da execução dos métodos de ação
Escreva TimerInterInterceptor
pacote com.itheima.intercept; import com.opensymphony.xwork2.actionInvocation; importação com.opensymphony.xwork2.intercept.abstractIntercept; classe public timerInterInterceptor estende abstrateInterceptor {public string intercept (actionInvocation Invocation) lança a exceção {long time = System.nanTime (); String rtValue = invocação.invoke (); System.out.println (rtValue+"Tempo de execução:"+(System.nanotime ()-tempo)+"nanosegund"); retornar rtvalue; }}Escreva arquivos de configuração
<pacote name = "p2" estends = "struts-default"> <greptectors> <interceptor name = "LogIncheckIntercept"> </interceptor> <interceptor name = "timerIntercept"> </interceptor> <interceptor-stack name = "myDefaultStack"> <Interceptref Nome = " name = "LogIncheckIntercept"> </socceptor-ref> <interceptor-ref name = "LogIncheckIntercept"> </socceptor-ref> <interceptor-ref name = "timerIntercept"> </interceptor-ref> </intercetortack> <spceptorporin> <souldin> ") </interceptor-ref> </intercetortack> <spectors> <soulTen>") ") </interceptor-ref> </intercetortack> <spectors> <soulTen>") ") </interceptor-ref> </intercetortack> <spectors> <soulTen>") ") </interceptor-ref> </intercetortack> <spectors> names.
Como pode ser visto no exposto, vários filtros podem ser configurados em uma ação.
4. Interceptor personalizado: pode especificar o método de interceptação ou o método de não interceptar
Ele pode especificar o método de interceptação ou um método sem interceptar. Ao escrever um filtro, você pode implementar a classe MethodFilterIntercept, que possui dois campos. Ao injetar parâmetros, você pode especificar aqueles sem interceptar. Apenas um dos dois parâmetros pode ser usado. Quando há menos interceptações, você pode usar os métodos. Quando houver mais interceptações, você pode usar o excluiMethods.
excludemethods = collection.Emptyset (); // exclui aqueles
incluirmethods = collection.Emptyset (); // inclui aqueles
Caso: Continue Exemplo de verificação de login.
1. Escreva um filtro LogIncheckInterceptor
package com.itheima.interceptor;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.opensymphony.xwork2.intercept.methodfilterInterceptor; public class LogIncheckInterceptor estende o métodoFilterInterScept {String protegida doIntercept (ACTIONVocation Invocation) lança exceção {httpssession Session = servLetActionContext.GeTequest (). GetSession (); Objeto user = session.getAttribute ("usuário"); if (user == null) {// sem login retornar "login"; // retornar a uma exibição lógica} retornar invocação.invoke (); // release}}2. Escreva arquivos de configuração
3. Escreva uma classe de ação CustomerAction
pacote com.itheima.action; importar org.apache.struts2.servletActionContext; importar com.opensymphony.xwork2.actionSupport; public class CustomerAction estende Ações da suporte {public string string () {System.out.println ("Call add ()" () "); método "); retornar sucesso;} public string Login () {System.out.println (" Login "); ServletActionContext.getRequest (). 4. Escreva uma página
addcustomer.jsp
<Body> Adicione um cliente </body>
editcustomer.jsp
<Body> modifique o cliente </body>
login.jsp
<Body> <form ação = "$ {PageContext.request.ContextPath} /Login.action" method = "post"> <input type = "text" name = "userName"/> <br/> <input type = "text" name = "senha"/<br/> <input Type = "submit")succcess.jsp
<Body> oyeah </body>
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.