Em Struts2, a parte da ação, ou seja, a camada do controlador, adota um método de baixa intrusão. Por que você diz isso? Isso ocorre porque na classe de ação do STRUTS2 não precisa herdar nenhuma classe base ou implementar qualquer interface, nem é diretamente associada à API do servlet. Geralmente, é mais parecido com um pojo normal (geralmente deve conter um método de execução sem parâmetros) e pode definir uma série de métodos (sem métodos de parâmetro) no conteúdo e pode ser usado como uma ação independente por meio da configuração, realizando a reutilização do código.
Por exemplo:
Exemplo de pacote; classe pública UserAction {private String UserName; senha de sequência privada; public String Execute () lança exceção {// ……… .. Retorno "Sucesso"; } public string getUserName () {return userName; } public void setUserName (string userName) {this.username = nome de usuário; } public string getPassword () {return senha; } public void setPassword (string senha) {this.password = senha; }}Acesso Acesso Servlet
As propriedades nesta classe de ação podem encapsular parâmetros e processar resultados. O sistema não os distingue estritamente.
No entanto, para tornar a classe de ação desenvolvida pelo usuário mais padronizada, o STRUTS2 nos fornece uma ação de interface, que é definida da seguinte forma:
publicInterface Action {publicstaticFinal String error = "Error"; publicstaticFinal String input = "Input"; publicstaticFinal String None = "None"; publicstaticFinal String Login = "Login"; publicstaticFinal String Success = "Sucesso"; public string execute () lança exceção;}No entanto, quando escrevemos ação, geralmente não implementamos a interface, mas herdamos a suporte da classe de implementação da interface.
O código desta classe é o seguinte:
public class Actionsupport implementa ação, validação, validationAWare, textprovider, localeprovider, serializável {............. public void SetActionErrors (coleção errorMessages) {validationAare.setActionErrors (errorMessages); } coleção pública getActionErrors () {return validationAare.getActionErrors (); } public void setActionMessages (Mensagens de coleta) {validationAWare.SetActionMessages (Mensagens); } coleção pública getActionMessages () {return validationAWare.getActionMessages (); } coleção pública getErRormessages () {return getActionErrors (); } public map getErrors () {return getfielderrors (); } // Defina o erro de verificação do campo do formulário public void setFielderRors (map errorMap) {validationAWare.setFielderrors (errorMap); } mapa público getfielderrors () {return validationAare.getfielderrors (); } public loce getLocale () {actionContext ctx = actionContext.getContext (); if (ctx! = null) {return ctx.getLocale (); } else {log.debug ("contexto de ação não inicializado"); retornar nulo; }} // Método para obter informações internacionais 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 usados para acessar pacotes de recursos internacionais public ResourceBundle getTexts () {return textProvider.getTexts (); } public ResourceBundle getTexts (String abundleName) {return textProvider.getTexts (abundleName); } // Adicione uma mensagem de erro de ação public void AddachartError (String anenerRormessage) {validationAWare.addactionError (anenerRormessage); } // Adicione informações ordinárias da ação public void AddactionMessage (String amessage) {validationAWare.addactionMessage (amessage); } public void addfielderror (string fieldname, string errorMessage) {validationAWare.addfielderror (nome do campo, errorMessage); } public void validate () {} public Object clone () lança clonenotsupportedException {return super.clone (); } .........}Como mencionado anteriormente, o Struts2 não é diretamente acoplado à API do servlet, então como ele acessa a API do servlet?
Acontece que o Struts2 fornece uma classe ActionContext, que simula a API do servlet. Os principais métodos são os seguintes:
1) Objeto Get (chave do objeto): Este método simula o método httpServletRequest.getAttribute (nome da string).
2) Map getApplication () retorna um objeto de mapa que simula uma instância do servletContext.
3) ActionContext estático getContext (): Obtenha a instância do ActionContext do sistema.
4) Map GetSession (): Retorna um objeto de mapa que simula uma instância de HTTPSession.
5) Map GetParameters (): Obtenha todos os parâmetros de solicitação, simulado httpServletRequest.getParameterMap ()
Você pode se perguntar por que esses métodos sempre retornam um mapa? Isso é principalmente para facilitar o teste. Quanto à maneira como ele converte objetos de mapa com instâncias de API do servlet reais, não nos preocupamos com isso, porque o STRUTS2 possui interceptores internos para nos ajudar a concluir essa conversão.
Para usar diretamente a API do servlet, o STRUTS2 nos fornece as seguintes interfaces.
1) ServletContextAwe: a ação que implementa essa interface pode acessar diretamente a instância do servletContext.
2) servletRequestAware: a ação que implementa essa interface pode acessar diretamente a instância HTTPSERVletRequest.
3) ServletResponseAware: a ação que implementa essa interface pode acessar diretamente a instância HTTPSERVletResponse.
O acima fala principalmente sobre servlets de acesso à ação. Vamos dar uma olhada em como a ação do Struts2 implementa a reutilização do código. Veja o UserAction, por exemplo. Se eu deixar essa ação lidar com o registro e o login do usuário (Longin), como devo reescrever essa ação? A UserAction reescrita é a seguinte:
Exemplo de pacote; classe pública UserAction estende o ACOCTUPPIPT {private String UserName; senha de sequência privada; public string registration () lança exceção {// ………… .. Retornar Sucesso; } public String Login () lança Exceção {// ……… .. Retornar Sucesso; } public string getUserName () {return userName; } public void setUserName (string userName) {this.username = nome de usuário; } public string getPassword () {return senha; } public void setPassword (string senha) {this.password = senha; }} Configuração de ação em struts.xml
Tudo bem escrever dessa maneira? Claro, não funciona. Também devemos configurá -lo no arquivo struts.xml. Existem dois métodos de configuração:
1) Use uma maneira normal de especificar o atributo do método para o elemento de ação.
<ação name = "loginaction" class = "exemplo.UserAction" Method = "Login"> <Resultado Nome = "success">/success.jsp </resultado> </ction> <ação name = "registaction" class = "Expletion.Useraction" Method = "Regist"> Result Nome = "SUCCESSO">/SUCCESS.JSP </resultado </Action>
2) Use curingas para especificar o atributo do método para o elemento de ação.
<ação name = ”*ação” class = ”exemplo.Useraction” Method = ”{1}”> <Nome do resultado = ”SUCCESSO”>/SUCCESSO.JSP </SIFORD> </ction>A maneira de usar curingas é muito flexível, e a seguir é uma situação de configuração mais complexa.
<ação name = ”*_*” class = ”Exemplo. {1} ação” Método = ”{2}”> ………. </ction>Onde o espaço reservado {1} corresponde ao anterior * de _ e {2} corresponde ao próximo *.
Configuração de ação com base no método de anotação:
A configuração da ação que eu quero falar abaixo não está no src/struts.xml, mas o pré-requisito para configurá-lo usando a anotação é que, além dos pacotes básicos de seis jar, você também precisa de um suports-2.1.8.8.1.1/lib/struts2-convention-plugin-2.1.8.1.jar
No entanto, o struts.xml ainda precisa de exemplos específicos
Login.jsp
<%@ Page Language = "java" import = "java.util.*" PageEncoding = "utf-8"%> <! Content = "Keyword1, palavra-chave2, palavra-chave3"> <meta http-equiv = "description" content = "Esta é a minha página"> <!-<link rel = "Stylesheet" type = "text/css" href = "styles.css">-> </body> <h3> STRUTS2Gin <H3Gin </h head> <h3> <h3> action = "$ {PageContext.request.ContextPath} /User/Login.QQi" Method = "post"> <table> <tr> <td> nome de usuário </td> <td> <input type = "text" name = "loginname"/</td> name = "pwd"/> </td> </tr> <tr> <td colspan = "2"> <input type = "submit" value = "login"/> </td> </tr> </ table> </form> </body> </html> src/struts.xml
<span style="font-size: large;"><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- Método de codificação de parâmetros de solicitação-> <nome constante = "struts.i18n.encoding" value = "utf-8"/> <!-Especifique o tipo de sufixo de solicitação processado por struts2. Vários separados por vírgulas-> <nome constante = "struts.action.extension" value = "ação, faça, vá, qqi"/> <!-Quando o struts.xml é alterado, seja para recarregar. O valor padrão é falso (usado no ambiente de produção), é melhor abrir o estágio de desenvolvimento-> <constante name = "struts.configuration.xml.reload" value = "true"/> <!-se deve usar o modo de desenvolvimento de struts. Haverá mais informações de depuração no modelo de desenvolvimento. O valor padrão é falso (usado no ambiente de produção) e é melhor abrir o estágio de desenvolvimento-> <constante name = "struts.devmode" value = "false"/> <!-Defina se o navegador armazena conteúdo estático. O valor padrão é verdadeiro (usado no ambiente de produção), é melhor fechar o estágio de desenvolvimento-> <constante name = "struts.serve.static.browSercache" value = "false" /> <!-Especifique que a mola é responsável pela criação do objeto de ação <constante name = "struts.objecty" = "spring" />-> <! name = "struts.enable.dynamicmethodinvocation" value = "false"/> </stuts> </span>
Loginaction.java
pacote 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; importação com.opensymphony.xwork2.actionsupport; /** * Use anotações para configurar a ação * */@parentpackage ("struts-default") // pacote pai @namespace ("/user") @Results ({@Result (name = "SUCCESSO", "/sg.jsp"), @Result (name = "error", location "/" @ExceptionMapping (Exception = "Java.Lange.RuntimeException", resultado = "Erro")}) Public Class LoginAction estende o Actionsupport {private estático final serialversionUid = -2554018432709689579l; String private LoginName; String privada PWD; @Action (value = "login") public string login () lança a exceção {if ("qq" .equals (loginName) && "123" .equals (pwd)) {return sucem; } else {return error; }} @Action (value = "Add", Results = {@Result (name = "success", location = "/index.jsp")}) public string add () lança exceção {return sucel; } 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; }}
Não vou postar sucess.jsp e error.jsp
Explicação da configuração da anotação
1) @parentpackage Especifique o pacote pai
2) @NamesPace Especifique o espaço para nome
3) @Results uma variedade de resultados
4) @Result (Name = "Success", Location = "/Msg.jsp") Um mapeamento de resultados
5) @Action (Value = "Login") Especifica o URL da solicitação para um método de processamento de solicitação. Observe que ele não pode ser adicionado à classe de ação, ao método.
6) @ExceptionMappings Matriz de declaração de exceções de primeiro nível
7) @ExceptionMapping Mapa Uma Exceção de Declaração
Como esse método não é muito comumente usado, você só pode entender