1. Interceptor en Struts2 (núcleo de función de cuadro)
1. Filtro vs interceptor
La función de filtro vs interceptor es una cosa. Los filtros son tecnología en la especificación de servlet que puede filtrar solicitudes y respuestas.
Los interceptores son tecnología en el marco Struts2, implementando la idea de programación AOP (orientada a la sección), que es conectable y puede interceptarse antes o después de acceder a un cierto método de acción.
Pila de Interceptor: une a los interceptores en una cadena en cierto orden. Al acceder al método interceptor, los interceptores en la cadena de interceptor Struts2 se llamarán en secuencia en el orden que definieron previamente.
Principio de ejecución de Struts2 - Análisis subyacente
2. Interceptor personalizado
Struts2 define una interfaz de interfaz de interfaz de interceptor.
Hay tres métodos abstractos en la interfaz del interceptor
• Init: este método se llamará inmediatamente después de que se cree el interceptor, y se llamará solo una vez durante la vida del interceptor. Los recursos relevantes se pueden inicializar en este método.
• Interecept: este método se llamará una vez cada vez que se intercepte una solicitud de acción.
• Destruir: este método se llamará antes de que se destruya el interceptor, y solo se llamará una vez durante el ciclo de vida del interceptor.
Struts a su vez llamará al método de intercepción de cada interceptor registrado por el programador para una acción. Cada vez que se llama al método de intercepción, los puntales pasarán una instancia de la interfaz ActionInvocation.
ActionInvocation: representa el estado de ejecución de una acción dada. El interceptor puede obtener el objeto de acción y el objeto de resultado asociado con la acción del objeto de esta clase. Después de completar la propia tarea del interceptor, el Interceptor llamará al método de invocación del objeto ActionInvocation al siguiente paso en el proceso de procesamiento de acción.
También puede llamar al método AddReresultListener del objeto ActionInVocation para "colgar" uno o más oyentes PreresultListener. Este objeto del oyente puede hacer algo antes de comenzar a ejecutar el resultado de la acción después de ejecutar la acción.
Pasos de interceptor personalizados:
a. Escriba una clase para implementar la interfaz COM.opensymphony.xwork2.interceptor.interceptor o heredar
com.opensymphony.xwork2.interceptor.abstractInterceptor Class. (Modo adaptador), generalmente elige heredar el Interceptor Abstract (el interceptor residirá en la memoria). Porque la clase de Interceptor Abstract implementa la interfaz del Interceptor. Proporciona una implementación en blanco para init y destruir
Escribe dos interceptores Interceptordemo1 e Interceptordemo2
paquete com.itheima.interceptor; import com.opensymphony.xwork2.ActionInVocation; import com.opensymphony.xwork2.interceptor.abstractInterceptor; public class InterceptordemO1 extiende abstractInterceptor {// Este método se llama cada vez que se accede a la acción Interception Intercept (ActionVocation Invocation) Excepción de la excepción {System.out.Println ("; String rtValue = invocation.invoke (); // versión, ¿por qué la cadena regresa aquí? Porque el resultado final devuelve el resultado de la acción, y el resultado de la acción es String Type System.out.println ("Intercept demo1"); return rtValue; }} paquete com.itheima.interceptor; import com.opensymphony.xwork2.ActionInVocation; import com.opensymphony.xwork2.interceptor.abstractInterceptore; import com.opensymphony.xwork2.interceptor.preReresUltener; pública clase interceptordemocon Intercept (ActionInVocation Invocation) lanza la excepción {// Invocation.AddPreReSultListener (new PRERESULTLISTENER () {// // public void beForReSult (ActionInVocation Invocation, String resultCode) {// system.println ("antes del resultado mostrado"); //}); System.out.println ("antes de la intersección demo2"); String rtValue = invocation.invoke (); // liberación system.out.println ("interceptado demo2"); return rtValue; }}b. Debe definirse en Struts.xml, definir el interceptor y definirlo primero antes de usarlo.
<paquete name = "p1" extends = "struts-default"> <!-Interceptor de definición: solo válido para el paquete actual-> <interceptor name = "interceprotdemo1"> </terceptor> <interceptor name = "interceprotdemo2"> </interceptor> </terceptor> </terceptor>
do. Se puede usar en la configuración de acción
<Action Name = "Action1" Method = "Ejecute"> <!- Use el interceptor definido. Si no se especifica ningún interceptor, todos los interceptores en la pila de pila predeterminada se usan de forma predeterminada; Una vez que se especifica cualquier interceptor, el valor predeterminado no es válido-> <interceptor-ref name = "interceProtDemo1"> </ interceptor-ref> <interceptor-ref name = "interceprotdemo2"> </ interceptor-ref> <sult> /success.jsp </sult> </action>
Implementar la clase de acción DemO1Action
paquete com.itheima.action; import com.opensymphony.xwork2.ActionSupport; public class DemoAction extiende ActionSupport {@Override public String Execute () lanza la excepción {System.out.println ("Ejecutar ejecutado"); devolver el éxito; }}Resultados de ejecución
Debido a que las funciones como la carga de archivos, la verificación de datos, la encapsulación de los parámetros de solicitud a la acción en Struts2 son implementadas por el interceptor en el stithack predeterminado predeterminado del sistema, el interceptor que definimos debe consultar el stitle predeterminado predeterminado del sistema, para que la aplicación pueda usar las muchas funciones proporcionadas por el marco Struts2.
Si no se especifica ningún interceptor, todos los interceptores en la pila de pila predeterminada se usan de forma predeterminada; Una vez que se especifica cualquier interceptor, el valor predeterminado no es válido. Además de usar un interceptor personalizado, también debe usar DefaultStack. Puedes hacer esto
Método 1: (utilizado por usted mismo), simplemente configure el stital personalizado y predeterminado en acción.
Método 2: (Cuando todos lo usan), si desea que todas las acciones debajo del paquete usen un interceptor personalizado, debe usar el Interceptor Stack Interceptor-stack, definir una pila Interceptor y luego en la acción, puede definir el Interceptor como el Interceptor predeterminado a través del Interceptor-Interceptor-Ref Name = "MyDeFaultTack"/>, y puede obtener el nombre de Mydefault.
<Conterceptors> <Interceptor name = "InterceProtDemo1"> </interceptor> <interceptor name = "interceProtDemo2"> </aCeptor> <Interceptor-stack name = "mydefaultstack"> <interceptor-ref name = "defaultstack"> </axceptor-ref> <Interceptor-ref name = "InterceProtDemo1"> </ Interceptor-Ref> <Interceptor-Ref name = "InterceProtDemo2"> </ Interceptor-Ref> </ interceptor-stack> </ interceptors> <Action name = "Action3" Method = "Login"> <Interceptor-Ref name = "mydefaultsting"> </interceptor-Ref> <resultado> /success.jsp </ resultado> </action>
3. Struts2's propio interceptor
Caso 1: verifique si el usuario ha iniciado sesión
1. Escriba la página Login.jsp
<Body> <Form Action = "$ {PageContext.Request.ContextPath} /Login.Action" Method = "Post"> <input type = "text" name = "username"/> <br/> <input type = "text" name = "contraseña"/> <br/> <input type = "enviar" valor = "login"/> </form> </body>2. Escriba la clase LoginCheckinterceptor para la verificación de inicio de sesión
paquete com.itheima.interceptor; import javax.servlet.http.httpsession; import org.apache.struts2.servletactionContext; import Invocation) lanza la excepción {httpsession session = servletActionContext.getRequest (). getSession (); // Obtener el objeto de sesión a través del objeto ServletActionContext Object user = session.getAttribute ("user"); if (user == null) {// sin inicio de sesión return "inicio de sesión"; // Revolver a una vista lógica} return Invocation.invoke (); // rele}}3. Escribir el archivo de configuración Struts.xml
<paquete name = "p2" extends = "struts-default"> <portors> <interceptor name = "loginCheckinterceptore"> </interceptor> <interceptor-stack name = "mydefaultstack"> <interceptor-ref name = "defaultStack"> </porteptor-ref> <interceptor-ref name = "loginCheckinterrator"> </interceptor "> </interceptor-ref> </ interceptor-stack> </interceptor-stack> </interceptors> <acción name = "login" método = "login"> <resultado> /login.jsp </ resultado> </action> </paquete>
4. Escribe una clase de acción CustomerAction
paquete com.itheima.action; import org.apache.struts2.servletactionContext; import com.opensymphony.xwork2.ActionSupport; public class CustomerAction extiende ActionSupport {public String Login () {System.out.println ("Login"); ServletactionContext.getRequest (). GetSession (). SetAttribute ("user", "ppp"); devolver el éxito; }}Caso 2: Monitoreo de la eficiencia de ejecución de los métodos de acción
Escribir TimerInterceptor
paquete com.itheima.interceptor; import com.opensymphony.xwork2.actionInVocation; import com.opensymphony.xwork2.interceptor.abstractInterceptors; public class Timerinterceptor extiende Abstract Interceptor {Public String Intercept (ActionInVocation Invocation) Lanza excepción {Long Time = System.nanotime (); String rtValue = invocation.Invoke (); System.out.println (RTValue+"Tiempo de ejecución:"+(System.nanotime ()-Time)+"Nanosegundo"); return rtValue; }}Escribir archivos de configuración
<paquete name = "p2" extends = "struts-default"> <Sceptors> <interceptor name = "logincheckinterceptore"> </sceptor> <interceptor name = "timerinterceptor"> </sceptor> <interceptor-stack name = "myDefaultstack"> <Interceptor-ref name = "Defaultstack"> </aTCECTEOR-REFETRETOR- name = "LoginCheckInterceptor"> </interceptor-ref> <interceptor-ref name = "logincheckinterceptore"> </ interceptor-ref> <interceptor-ref name = "timerinterceptore"> </interceptor-ref> </portor-stack> </aportors> <resulte name = "login">/login.jsp </dult dateS
Como se puede ver en lo anterior, se pueden configurar múltiples filtros en una acción.
4. Interceptor personalizado: puede especificar el método de interceptación o el método de no interceptar
Puede especificar el método de interceptación o un método sin interceptar. Al escribir un filtro, puede implementar la clase MethodFilterInterceptor, que tiene dos campos. Al inyectar parámetros, puede especificarlos sin interceptar. Solo se puede usar uno de los dos parámetros. Cuando hay menos intercepciones, puede usar incluidos los metros. Cuando hay más intercepciones, puede usar excludemethods.
excludemethods = collections.emptySet (); // excluir aquellos
includeMethods = collections.emptySet (); // incluye aquellos
Caso: Continuar ejemplo de verificación de inicio de sesión.
1. Escriba un filtro LoginCheckinterceptor
paquete com.itheima.interceptor; import javax.servlet.http.httpsession; import org.apache.struts2.servletactionContext; import com.opensymphony.xwork2.interceptor.methodfilterinterceptor; public class LoginCheckInterceptor Extiens MethodFilterinterceptor {protegido String DoIntercept (ActionVocation Invocation) lanza la excepción {Httpsession Session = ServletActionContext.getRquest (). GetSession (); Object user = session.getAttribute ("usuario"); if (user == null) {// sin inicio de sesión return "inicio de sesión"; // Revolver a una vista lógica} return Invocation.invoke (); // rele}}2. Escribir archivos de configuración
3. Escribe una clase de acción CustomerAction
paquete com.itheima.action; import org.apache.struts2.servletactionContext; import com.opensymphony.xwork2.ActionSupport; public class CustomerAction extiende ActionSupport {public String add () {System.out.Println ("Call add ()" Call ADD () "); return Succes;} public String EditE Éxito; 4. Escribe una página
addCustomer.jsp
<Body> Agregue un cliente </body>
editCustomer.jsp
<Body> Modifique al cliente </body>
Login.jsp
<Body> <Form Action = "$ {PageContext.Request.ContextPath} /Login.Action" Method = "Post"> <input type = "text" name = "username"/> <br/> <input type = "text" name = "contraseña"/> <br/> <input type = "enviar" valor = "login"/> </form> </body>éxito.jsp
<Body> Oyeah </body>
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.