ActionContext
O ActionContext é o contexto da ação, onde o STRUTS2 salva automaticamente alguns objetos necessários durante a execução da ação, como sessão, parâmetros, localidade etc. O STRUTS2 criará o ActionContext correspondente com base em cada encadeamento que executa a solicitação HTTP, ou seja, um encadeamento possui um context exclusivo. Portanto, os usuários podem usar o método estático ActionContext.getContext () para obter o ActionContext do thread atual. É precisamente por esse motivo que os usuários não precisam se preocupar em fazer a segura de tópicos de ação.
De qualquer forma, o ActionContext é usado para armazenar dados. O próprio Struts2 colocará muitos dados nele, e os usuários também podem colocar os dados que desejam. A estrutura de dados do próprio ActionContext é uma estrutura de mapeamento, ou seja, um mapa, que usa uma chave para mapear o valor. Para que os usuários possam usá -lo como usar o mapa ou usar diretamente o método Action.getContextMap () para operar no mapa.
Os dados colocados no próprio STRUTS2 incluem ActionInvocation, Application (ou seja, ServletContext), ConversionErrors, Locale, Ação Nome, Parâmetros de Solicitação, Sessão HTTP e Pilha de Valor, etc. Para uma lista completa, consulte seu Javadoc (o apêndice deste artigo discute o que ele contém).
Devido às características que podem ser obtidas por métodos de ação somente de encadeamento e estáticos do ActionContext, ele pode ser obtido diretamente em classes não de ação sem esperar que a ação seja passada ou injetada. Deve -se notar que ele é válido apenas em threads criados devido à solicitação (porque o ActionContext correspondente é criado ao solicitar), mas é inválido nos threads iniciados pelo servidor (como o método init de Fliter). Devido à conveniência de acessá-lo em classes que não são de ação, o ActionContext também pode ser usado para passar dados para o JSP em classes que não são de ação (porque o JSP também pode acessá-los facilmente).
A conexão e a diferença entre valuestack e ActionContext:
Similaridades: todas elas são usadas dentro do escopo de uma solicitação HTTP, ou seja, sua vida útil é uma solicitação.
Diferenças: a pilha de valor é a estrutura da pilha e o ActionContext é a estrutura do mapa (mapa).
Contato: o mapa obtido pelo método valuestack.getContext () é na verdade o mapa do ActionContext. Olhando para o código -fonte do STRUTS2, podemos ver (linha 79 de org.apache.struts2.dispatcher.ng.prepareoperations em struts2.3.1.2, método CreateActionContext). Ao criar o ActionContext, o valuestack.getContext () é usado como um parâmetro do construtor do ActionContext. Portanto, o Valuestack e o ActionContext podem ser essencialmente obtidos um do outro.
Nota: Em alguns documentos, a palavra "contexto da pilha" aparecerá, que é realmente o valor que está sendo salvo no ActionContext. Portanto, ao ler esses documentos, você deve ver claramente se a estrutura da pilha (ou seja, pilha de valor) é colocada ou a estrutura de mapeamento (o contexto da pilha de valor, ou seja, ActionContext).
Como obter o ActionContext:
Em um interceptador personalizado: use ActionInvocation.getInvocationContext () ou use ActionContext.getContext ().
Na classe de ação: deixe o interceptador injetar ou usar o actionContext.getContext ().
Nas classes que não são de ação: deixe a classe de ação passar os parâmetros, injetar usando o mecanismo de injeção ou use ActionContext.getContext (). Nota: ActionContext.getContext () só pode ser chamado pelo código em execução no thread de solicitação, caso contrário, o NULL será retornado.
No JSP: Geralmente, não há necessidade de obter o próprio ActionContext.
Como economizar um valor em um actionContext:
Nas classes Java, como interceptador, classe de ação, classe de não ação, etc.: Use o método ActionContext.put (chave do objeto, valor do objeto).
No JSP: a tag <s: set value = "..."/> armazenará o valor no ActionContext por padrão (é claro, a tag <s: set> também pode armazenar o valor em outros lugares). Além disso, muitas tags têm atributos VAR (o atributo de ID foi usado antes, mas agora o atributo de ID foi preterido). Esse atributo pode armazenar um valor no ActionContext, a chave é o valor do atributo VAR e o valor é o valor do atributo de valor da tag. (Alguns documentos escrevem sobre o armazenamento de valores no contexto do valuestack, que é realmente o mesmo)
Como ler um valor de um ActionContext:
Nas classes Java, como Interceptor, Ação Classe, Classe de Ação, etc.: Use o método ActionContext.get (chave do objeto).
No JSP: use uma expressão OGNL começando com #, por exemplo, o método ActionContext.get ("Nome") será chamado. NOTA: Se os atributos de uma determinada tag não forem analisados como expressões OGNL por padrão, você precisará usar %{} para incluir a expressão e uma expressão semelhante a " %{#nome}" aparecerá. (Veja mais para "#" aqui)
Em suma, o uso do ActionContext no JSP é porque é uma estrutura de mapeamento e, por outro lado, pode ler algumas configurações de ação. Quando você precisa fornecer valores comuns para muitas ações, você pode ter cada ação fornecer o método getxxx (), mas uma maneira melhor é armazenar esses valores comuns no ActionContext no modelo interceptador ou jsp (porque o modelo interceptador ou JSP é frequentemente usado para várias ações).
Alguns exemplos:
Código Java
// Esta classe demonstrará a operação no ActionContext no interceptador PublicClass MyInterceptor estende abstruminterceptor {public string intercept (ACTIONVocation Invocation) lança Exceção {// obtive ActionContext actionContext actionContext = Invocation.getInvocationContext (); // salvar a pessoa do valor Pessoa = new Person (); ActionContext.put ("Pessoa", pessoa); // obtenha o valor do valor do objeto = actionContext.get ("pessoa"); // obtenha httpServletRequest httpServletRequest request = (httpServletRequest) actionContext.get (strutsstatics.http_request); // Obtenha o mapa da solicitação, ou seja, o valor operado por httpServletRequest.getAttribute (...) e httpServletRequest.setAttribute (...) map requestmap = (map) actionContext.get ("request"); // Outros códigos // ...... retorna invocação.invoke (); }} Código Java
// Esta classe demonstrará a operação do ActionContext na ação publicClass MyAction estende o ACOCTOPPORT {@Override public String Execute () lança exceção {// obtenha o valor actionContext actionContext = actionContext.getContext (); // Salvar o Value Person = New Pessoa (); // Esta é a classe definida no exemplo anterior ActionContext.put ("Pessoa", pessoa); // obtenha o objeto de value objeto = actionContext.get ("pessoa"); // outros códigos // ...... Retornar sucesso; }} Código HTML
<! Doctype html> <html> <head> <metahttp-equiv = "content-type" content = "text/html; charset = utf-8"> <title> jsp página </title> </head> <! the ActionContext has been stored in the ActionContext, you can use "#person" to get it, as follows --> <s:propertyvalue="#person"/> <!-- Get the name attribute of the person, as follows --> <s:propertyvalue="#person.name"/> <!-- Get the value stored by Struts2 in ActionContext, such as the Map of request, as follows --> <s: PropertyValue = "#request"/> <!-Obtenha o valor armazenado por struts2 no ActionContext, como o mapa da sessão, como a seguir-> <s: PropertyValue = "#Session"/> <!-Obtenha o valor de parâmetros ou parâmetros-seguindo o STRUTS2 na seguinte-SOPLECT: saving the value in ActionContext in JSP--> <!-- Save a string "myName", the key is "myKey", as follows --> <s:setvalue="%{'myName'}"var="myKey"/> <!-- Use the s:bean tag to create an object and save it in ActionContext, the key is myObject, as follows --> <s: beanname = "com.example.person" var = "myObject"/> <!-Depois disso, você pode usar "#" para lê-los, como segue-> <s: propertvalue = "#myKey"/> <s: propertyValue = "#myObject"/> </body> </html> 3. HTTPSERVletRequest Class ou mapa de solicitação
O STRUTS2 fornece duas operações mediante solicitação: uma é a classe HttpServletRequest fornecida pelo servidor da Web, que é a mesma que a operação de solicitações em projetos tradicionais da Web Java; O outro é um "mapa de solicitação", que é uma classe de mapeamento que encapsula os atributos do httpServletRequest. A operação do mapa é equivalente a operar os atributos do httpServletRequest. A razão pela qual o mapa é fornecido é que é conveniente operar e o outro é que ele pode usar o OGNL para ler solicitações nas tags JSP. De qualquer forma, essas duas solicitações são interoperáveis. Quanto aos conceitos como o ciclo de vida da solicitação, ele não é diferente de outros projetos da Web Java, e este artigo não será descrito em detalhes.
Use a classe HttpServletRequest ou mapa de solicitação
Embora os dois sejam interoperáveis, em termos de atributos de solicitação de leitura, o uso de mapas de solicitação é muito mais conveniente e não expõe interfaces desnecessárias. Obviamente, o HttpServletRequest tem alguns métodos que o mapa de solicitações não possui. Obviamente, o primeiro deve ser usado ao usar esses métodos.
Usando o mapa ou actionContext da solicitação:
Ambos são mapas e ambos os ciclos de vida são um pedido.
Nos projetos tradicionais da Web Java, o valor é frequentemente passado ao JSP através dos atributos da solicitação: primeiro setAttribute () no servlet e depois getAttribute () no JSP. Obviamente, no projeto STRUTS2, você ainda pode usar esse método, mas abandonar a função de entrega fornecida pelo Struts2 não vale o esforço. Embora o autor não tenha encontrado o documento oficial dizendo que você deve substituir o mapa da solicitação pelo ActionContext, e não descobriu que existe um mapa no programa que pode obter o ActionContext, mas não pode obter a solicitação, na estrutura do Struts2, o Operating ActionContext é mais conveniente do que operar o mapa da solicitação. Portanto, o autor recomenda: tente usar o ActionContext em vez do mapa da solicitação para passar o valor.
O mapa da solicitação às vezes contém valores definidos por outras estruturas, como estruturas de primavera. Ao obter esses valores, você precisa usar o mapa de solicitações porque não há no ActionContext.
Através do ActionContext, você pode obter a classe httpServletRequest: "httpServletRequest request = (httpServletRequest) actionContext.get (strutsstatics.http_request);".
Você também pode obter o mapa da solicitação através do ActionContext: "mapa requestmap = (map) actionContext.get (" request ");". Portanto, na tag JSP, você pode obter os dados do mapa da solicitação usando a expressão "#Request".
Como obter httpServletRequest:
Se já houver um ActionContext, use "ActionContext.get (strutsstatics.http_request)" para obter o httpServletRequest.
Em um interceptador personalizado, primeiro obtenha o ActionContext e depois obtenha -o através do ActionContext.
Em ação, primeiro obtenha o ActionContext e, em seguida, obtenha -o através do ActionContext. Ou deixe a ação implementar a interface ServletRequeStaware e use o ServletConfigIntercept Interceptor, para que o interceptador injete httpServletRequest.
No JSP, você geralmente não precisa obter httpServletRequest.
Como obter o mapa da solicitação:
Se já houver um ActionContext, use "actionContext.get (" request ")" para obter.
Em um interceptador personalizado, primeiro obtenha o ActionContext e depois obtenha -o através do ActionContext.
Em ação, primeiro obtenha o ActionContext e, em seguida, obtenha -o através do ActionContext. Ou deixe a ação implementar a interface RequestAware e use o ServletConfigIntercept Interceptor, para que o interceptador injete a solicitação de mapa.
No JSP, use "#Request" para obter o mapa da solicitação e use "#request.key" ou "#request ['key']" para ler o valor no mapa.
Em suma, a solicitação ainda está em conformidade com as regras gerais dos sites de java. No entanto, o autor recomenda que os usuários tentem evitar usar a solicitação para passar valores.
Alguns exemplos:
// Esta classe demonstrará a operação do mapa de httpServletRequest e solicitará no interceptor publicClass MyInterceptor estende o abstrumintercept {public string intercept (ACTIONVocation Invocation) lança exceção {// obtém actionContext ActionContext actionContext = Invocation.GetinVocationContext (); // obtenha httpServletRequest httpServletRequest httpServletRequest = (httpServletRequest) actionContext.get (strutsstatics.http_request); // Obtenha o mapa do mapa requestmap = (map) actionContext.get ("request"); // Crie uma classe como uma pessoa da instância = nova pessoa (); // As duas linhas de declarações a seguir têm a mesma função httpServletRequest.setAttribute ("pessoa", pessoa); requestmap.put ("pessoa", pessoa); // Outros códigos // ...... retorna invocação.invoke (); }} // Esta classe demonstrará a operação do mapa de httpServletRequest e solicitar em ação (o método estático obtém actionContext) publicClass MyAction estende o ActionOpport {@Override public String Execute () lança exceção {// obtenha actionContext actionContext ActionContext = actionContect.get.genxt {// obtenha actionContext actionContextContext = actionContect.get.get.Context; // obtém httpServletRequest httpServletRequest httpServletRequest = (httpServletRequest) actionContext.get (strutsstatics.http_request); // Obtenha o mapa do mapa requestmap = (map) actionContext.get ("request"); // Crie uma classe como uma pessoa da instância = nova pessoa (); // As duas linhas de declarações a seguir têm a mesma função httpServletRequest.setAttribute ("pessoa", pessoa); requestmap.put ("pessoa", pessoa); // outros códigos // ...... Retornar sucesso; }} // Esta classe demonstrará o uso do servletRequeStaware em ação para obter httpServletRequest (Nota: você precisa usar o servletConfigIntercept Interceptor) PublicClass MyAction estende o ActionPorpPort implementa servletrequestAware {private httpsletlefest solicitação; // Este método é um método da interface servletRequestAware publicVoid SetServletRequest (solicitação httpServLeQuest) {this.Request = request; } @Override public string Execute () lança a exceção {// httpServletRequest está pronta no campo desta classe e pode ser usado diretamente // ...... o sucesso de retorno; }} // Esta classe demonstrará o uso do servletRequeStaWare em ação para obter o mapa da solicitação (Nota: você deseja usar o servletConfigIntercept Interceptor) publicClass MyAction estende o ActioPorpPort implementa o requestAware {map <string, object> request; // Este método é um método da interface RequestAWare PublicVoid setRequest (map <string, object> request) {this.request = request; } @Override public String Execute () lança Exceção {// O mapa da solicitação está pronto no campo da classe e pode ser usado diretamente // ...... Retornar Sucesso; }}<! Doctype html> <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <title> jsp página </title> </head> <body> <! é o valor armazenado automaticamente no ActionContext por struts2 (a chave é a solicitação); portanto, use "#" para acessar o ActionContext e ler a solicitação-> <s: property value = "#request"/> <!-as duas linhas seguintes são o valor da chave "nome" no mapa que acessa a solicitação-> <s:)#"#"#" </body> </html>
3. Parâmetros, ou seja, parâmetros de solicitação de get ou solicitação
Os parâmetros são parâmetros passados pelo navegador para o servidor ao solicitar Get ou Post. Nos projetos da Web Java tradicionais, use métodos como httpServletRequest.getParameter () para obter parâmetros e você pode usar diretamente httpServletRequest.getParameterMap () para obter um mapa com parâmetros encapsulados. No STRUTS2, o STRUTS2 armazena diretamente o mapa acima no ActionContext, com os "parâmetros" da chave. Além disso, o ActionContext também fornece diretamente o método ActionContext.getParameters () para obter este mapa. Portanto, o método de parâmetros operacionais em cada componente do STRUTS2 é muito semelhante ao método de operação do mapa da solicitação, e este parágrafo não será descrito em detalhes.
4. Mapa da aula e sessão HTTPServletSession
A sessão em projetos tradicionais da Web Java está familiarizada e a usamos para gravar o status da sessão de um usuário. O STRUTS2 encapsula o HTTPServletSession em um mapa, ou seja, o "mapa da sessão", que é semelhante ao processamento da solicitação. No entanto, para salvar os recursos do sistema, não criaremos sessões quando não precisarmos de sessões. Pode ser por isso que o HTTPServletSession não seja colocado no ActionContext em Struts2. Se o seu programa precisar usar o HTTPServletSession, você deve primeiro obter o httpServletRequest e depois usar getSession () ou getSession (booleano b) para obtê -lo e decidir se você precisa criar uma sessão. Para o mapa da sessão, o STRUTS2 ainda o coloca no ActionContext (a chave é "sessão"), mas não se preocupe, o mecanismo deste mapa faz sessões apenas quando são criados novos valores. Em resumo, a operação do HTTPServletSession in STRUTS2 deve primeiro obtê -lo através do httpServletRequest, e a operação do mapa da sessão é exatamente o mesmo que a operação do mapa de solicitação, que não será descrito em detalhes neste parágrafo.
5. Mapa de servletContext e aplicação
Nos projetos tradicionais da Web Java, o ServletContext é usado para armazenar variáveis globais, e cada máquina virtual Java possui apenas um servletContext por projeto da web. Este ServletContext é criado por um servidor da Web para garantir sua singularidade. O ServletContext possui alguns métodos que podem operar seus atributos, e essas operações são semelhantes à operação de um mapa. Portanto, o Struts2 encapsula novamente: ele encapsula os atributos do servletContext em um mapa, ou seja, "mapa de aplicativos" e também o coloca no actionContext (Key Is Application). Portanto, se a operação do mapa do aplicativo estiver no mapa da solicitação, este parágrafo não será descrito em detalhes.
Quanto à operação no ServletContext, é semelhante à operação no httpServletRequest: o struts2 coloca o servletContext no ActionContext, e o servletConfigInterceptor fornece a interface de injeção servletContextAwe para servletContext. Portanto, este parágrafo não será descrito em detalhes.
Nota: Usando "#Application" nas expressões OGNL pode obter o mapa do aplicativo, não o servletContext. No entanto, no código Java incorporado no JSP (como "< % Application.getAttribute (" "); %>"), o aplicativo é um servletContext, não um mapa.