En Struts2, la parte de acción, es decir, la capa del controlador, adopta un método de baja intrusión. ¿Por qué lo dices? Esto se debe a que en la clase de acción Struts2 no necesita heredar ninguna clase base o implementar ninguna interfaz, ni se combina directamente con la API Servlet. Por lo general, se parece más a un POJO normal (generalmente debe contener un método de ejecución sin parámetros), y puede definir una serie de métodos (sin métodos de parámetros) en el contenido, y puede usarse como una acción independiente a través de la configuración, realizando así la reutilización del código.
Por ejemplo:
Ejemplo de paquete; public classationAction {private String UserName; contraseña de cadena privada; public String Execute () lanza la excepción {// ……… .. return "éxito"; } public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; } public String getPassword () {return Password; } public void setPassword (String Password) {this.password = contraseña; }}Servlet de acceso de acción
Las propiedades en esta clase de acción pueden encapsular los parámetros y procesar los resultados. El sistema no los distingue estrictamente.
Sin embargo, para que la clase de acción desarrollada por el usuario sea más estandarizada, Struts2 nos proporciona una acción de interfaz, que se define de la siguiente manera:
PublicInterface Action {PublicStaticFinal String Error = "Error"; publicstaticFinal String input = "Entrada"; PublicStaticFinal String None = "Ninguno"; PublicStaticFinal String login = "Login"; PublicStaticFinal String Success = "Success"; Public String Execute () lanza la excepción;}Sin embargo, cuando escribimos acciones, generalmente no implementamos la interfaz, sino que heredamos el apoyo de acciones de clase de implementación de la interfaz.
El código de esta clase es el siguiente:
Public Class ActionSupport implementa acción, validable, validationAware, TextProvider, localProvider, serializable {............. public void setActionErrors (colección errorMessages) {validationAware.setActionErrors (errorMessages); } colección pública getActionErrors () {return ValidationAware.GetActionErrors (); } public void setActionMessages (mensajes de colección) {validationAware.SetActionMessages (mensajes); } colección pública getActionMessages () {return ValidationAware.GetActionMessages (); } colección pública getRormesSages () {return getActionErrors (); } mapa público getErrors () {return getFielderRors (); } // Establecer Error de verificación de campo de formulario public void setFielderRors (MAP ERROMAP) {ValidationAware.setFielderRors (errorMap); } Mapa público getFielderRors () {return ValidationAware.getFielDerRors (); } public locale getLocale () {ActionContext ctx = ActionContext.getContext (); if (ctx! = null) {return ctx.getLocale (); } else {log.debug ("contexto de acción no inicializado"); regresar nulo; }} // método para obtener información internacional public String getText (String atextName) {return textProvider.gettext (atextName); } public String getText (string atextName, string defaultValue) {return textProvider.gettext (atextName, defaultValue); } public String getText (String atextName, String defaultValue, string obj) {return textProvider.gettext (atextName, defaultValue, obj); } ......... // Métodos utilizados para acceder a los paquetes de recursos internacionales recursos públicos getTexts () {return textProvider.gettexts (); } public ResourceBundle getTexts (string abundlename) {return textProvider.gettexts (abundlename); } // Agregue un mensaje de error de acción public void addactionError (String anerrormessage) {validationAware.AdDactionError (anerrormessage); } // Agregar información ordinaria de acción public void addactionMessage (String amessage) {validationAware.addactionMessage (amessage); } public void addfielderror (string fieldName, string errorMessage) {validationAware.addfielderror (fieldName, errorMessage); } public void validate () {} public object clone () lanza clonenotsupportedException {return super.clone (); } .........}Como se mencionó anteriormente, Struts2 no está directamente junto con la API de servlet, entonces, ¿cómo accede a la API de servlet?
Resulta que Struts2 proporciona una clase ActionContext, que simula la API Servlet. Los métodos principales son los siguientes:
1) Objeto get (clave de objeto): este método simula el método httpservletrequest.getAttribute (name de cadena).
2) MAP getApplication () Devuelve un objeto de mapa que simula una instancia de ServletContext.
3) Static ActionContext getContext (): Obtenga la instancia de ActionContext del sistema.
4) MAP getSession (): Devuelve un objeto de mapa que simula una instancia de httpsession.
5) MAP getParameters (): Obtenga todos los parámetros de solicitud, simulados httpservletRequest.getParametermap ()
¿Te preguntarás por qué estos métodos siempre devuelven un mapa? Esto es principalmente para facilitar las pruebas. En cuanto a cómo convierte los objetos de mapa con instancias reales de la API de servlet, no nos preocupamos por esto, porque Struts2 tiene interceptores incorporados para ayudarnos a completar esta conversión.
Para usar directamente la API Servlet, Struts2 nos proporciona las siguientes interfaces.
1) ServletContextAware: la acción que implementa esta interfaz puede acceder directamente a la instancia de ServletContext.
2) ServLetRequestaware: la acción que implementa esta interfaz puede acceder directamente a la instancia httpservletRequest.
3) ServletResponseAware: la acción que implementa esta interfaz puede acceder directamente a la instancia httpservletResponse.
Lo anterior habla principalmente de servlets de acceso de acción. Echemos un vistazo a cómo la acción de Struts2 implementa la reutilización del código. Tome la acción de usuario por ejemplo. Si dejo que esta acción maneje tanto el registro como el inicio de sesión (Longin), ¿cómo debo reescribir esta acción? La ACTION de reescritura es la siguiente:
Ejemplo de paquete; Public ClassationAction extiende ActionSupport {Private String UserName; contraseña de cadena privada; Registro de cadena public () lanza la excepción {// ………… .. devuelve éxito; } public String Login () lanza la excepción {// ……… .. return éxito; } public String getUsername () {return UserName; } public void setUsername (String UserName) {this.Username = username; } public String getPassword () {return Password; } public void setPassword (String Password) {this.password = contraseña; }} Configuración de acción en struts.xml
¿Está bien escribir de esta manera? Por supuesto, no funciona. También debemos configurarlo en el archivo Struts.xml. Hay dos métodos de configuración:
1) Use una forma normal de especificar el atributo de método para el elemento de acción.
<Action name = ”loginaction” class = ”Ejemplo.useraction” método = ”login”> <result name = ”stit”>/striture.jsp </ resultado> </action> <action name = ”registaction” class = ”ejemplo.useraction” método = ”regist”> <resultado name = ”éxito”>/éxito.jsp </sult> </action>
2) Use comodines para especificar el atributo de método para el elemento de acción.
<Action name = ”*Action” class = ”Ejemplo.useraction” Method = ”{1}”> <resultado name = ”éxito”>/éxito.jsp </resultado> </action>La forma de usar comodines es demasiado flexible, y la siguiente es una situación de configuración más compleja.
<Action name = ”*_*” class = ”Ejemplo. {1} Action” Method = ”{2}”> ………. </action>Donde el marcador de posición {1} coincide con el anterior * de _, y {2} coincide con el siguiente *.
Configuración de acción basada en el método de anotación:
La configuración de la acción de la que quiero hablar a continuación no está en SRC/Struts.xml, pero el requisito previo para configurarla usando la anotación es que, además de los seis paquetes básicos de JAR, también necesita un Struts-2.1.8.1/lib/struts2-Convention-Plugin-2.1.1.1.Jar
Sin embargo, Struts.xml todavía necesita ejemplos específicos
Login.jsp
<%@ page lenguaje = "java" import = "java.util.*" pageEncoding = "utf-8"%> <! DocType html público "-// w3c // dtd html 4.01 transitional // en"> <html> <fead> <title> struts2log en verificación </title> <s meta httptp Content = "Keyword1, Keyword2, Keyword3"> <meta http-equiv = "Descripción" Content = "Esta es mi página"> <!-<Link rel = "Stylesheet" type = "text/css" href = "styles.css">-> </head> <body> <h3> struts2Login </h3> <hr /> <horm /> <horm Action = "$ {PageContext.Request.ContextPath} /user/login.qqi" método = "post"> <table> <tr> <td> username </td> <td> <input type = "text" name = "loginname"/> </td> </tr> <tr> <td> contraseña <//td> <td> <td <passyame "/" contraseña " name = "pwd"/> </td> </tr> <tr> <td colspan = "2"> <input type = "subt" value = "login"/> </td> </tr> </table> </form> </body> </html> src/struts.xml
<span style = "font-size: grande;"> <? Xml versión = "1.0" encoding = "utf-8"?> <! Doctype Struts public "-// Apache Software Foundation // Dtd Struts Configuración 2.1.7 // en" "http://struts.apache.org/dtds/struts-2.1.1.7.7.7.dtd" Método de codificación de parámetros de solicitud-> <constant name = "struts.i18n.encoding" value = "utf-8"/> <!-Especifique el tipo de sufijo de solicitud procesado por Struts2. Múltiples separados por comas-> <constant name = "struts.action.extension" valor = "acción, do, go, qqi"/> <!-cuando se cambia struts.xml, ya sea a recargar. El valor predeterminado es falso (utilizado en el entorno de producción), es mejor abrir la etapa de desarrollo-> <constant name = "struts.configuration.xml.reload" valor = "true"/> <!-si utilizar el modo de desarrollo de los puntales. Habrá más información de depuración en el modelo de desarrollo. El valor predeterminado es falso (utilizado en el entorno de producción), y es mejor abrir la etapa de desarrollo-> <constant name = "struts.devmode" value = "false"/> <!-Establezca si el navegador almacena contenido estático. El valor predeterminado es verdadero (utilizado en el entorno de producción), es mejor cerrar la etapa de desarrollo-> <constant name = "struts.serve.static.browserCache" value = "false" /> <!-Especifique que Spring es responsable de la creación del objeto de acción <nombre constante = "Struts.ObjectFactory" Value = "Spring" />-> <!-Si inicia la llamada de método estatal-> <Constant Constant name = "Struts.enable.dynamicMethodinVocation" value = "false"/> </struts> </span>
LoginAction.java
paquete com.javacrazyer.web.action; importar org.apache.struts2.convention.annotation.action; importar org.apache.struts2.convention.annotation.ExceptionMapping; importar org.apache.struts2.convention.annotation.exceptionMappings; importar org.apache.struts2.convention.annotation.namespace; importar org.apache.struts2.convention.annotation.parentpackage; importar org.apache.struts2.convention.annotation.result; importar org.apache.struts2.convention.annotation.results; import com.opensymphony.xwork2.ActionSupport; /** * Use anotaciones para configurar Action * */@ParentPackage ("Struts-Default") // paquete parent @namespace ("/user") @Results ({@Result (name = "éxito", ubicación = "/sg.jsp"), @Result (name = "Error", ubicación = "/error.jsp")}) = "java.lange.runteException", resultado = "error")}) La clase pública LoginAction extiende accionesPport {private static final long SerialVersionUid = -2554018432709689579l; Cadena privada LoginName; cadena privada pwd; @Action (value = "Login") public String Login () lanza la excepción {if ("Qq" .Equals (LoginName) && "123" .Equals (pwd)) {return éxito; } else {error de retorno; }} @Action (value = "add", resultados = {@Result (name = "éxito", ubicación = "/index.jsp")}) public String add () lanza la excepción {return éxito; } public String getLoginName () {return LoginName; } public void setLoginName (String LoginName) {this.loginName = loginName; } public String getPwd () {return pwd; } public void setPwd (string pwd) {this.pwd = pwd; }}
No publicaré strits.jsp y error.jsp
Explicación de la configuración de la anotación
1) @ParentPackage Especifique el paquete principal
2) @namespace especifica el espacio de nombres
3) @Results una variedad de resultados
4) @Result (name = "éxito", ubicación = "/msg.jsp") Una asignación de resultados
5) @Action (valor = "inicio de sesión") Especifica la URL de solicitud para un método de procesamiento de solicitudes. Tenga en cuenta que no se puede agregar a la clase de acción, al método.
6) @ExceptionMappings Matriz de Declaración de Excepciones de primer nivel
7) @ExceptionMapping Map una excepción de declaración
Dado que este método no se usa muy comúnmente, solo puede entenderlo