Este artigo implementa principalmente a função de encaminhamento de solicitação do Struts. Outras funções farão compensar lentamente.
Recentemente, aprendi o conteúdo do Javassist e vi um artigo.
Aqui está uma estrutura simples do Struts2 e, ao mesmo tempo, você adiciona um pouco de seu próprio entendimento.
Este artigo implementa principalmente a função de encaminhamento de solicitação do Struts. Outras funções farão compensar lentamente.
Primeiro de tudo, na estrutura do Struts2, a implementação e o salto de solicitações são configurados principalmente por struts.xml. Um <tion> rótulo indica uma definição de uma solicitação, que contém o nome "Nome" da solicitação; O <Resultado "Label define o tipo" Nome "do resultado, incluindo 'sucesso', 'None', 'Login', 'Input', 'Error'; ② o tipo" Tipo ", incluindo 'Dispatcher (padrão)' '', 'Cadeia', 'redirecionamento', 'redirecção', 'stream'; Depois de configurar o Struts.xml, o formulário na interface pode encontrar a tag de ação correspondente através do valor do atributo de nome definido pela propriedade Ação, de modo a encontrar os métodos de classe e execução correspondentes. Em seguida, corresponda à string String retornada pelo método de execução para corresponder ao nome na tag de resultado e execute a próxima operação de solicitação de acordo com o tipo definido.
Bem, depois de entender como o Struts2 conecta a interface solicitando a mesma função do programa, podemos implementar essa parte da função por meio de nosso próprio código.
Então, como começamos?
Seremos divididos em duas partes com funções simples ①Ação parte da parte do resulto
a parte da ação
① Precisamos encontrar a classe correspondente e os métodos de execução de acordo com a solicitação da interface
parte do resultado
① Precisamos retornar a string de tipo de 'sucesso', 'nenhum', 'login', 'entrada' e 'erro'
② Diferentes tipos de endereço de solicitação precisam ser especificados para diferentes tipos de retorno
③ Os tipos que precisam ser definidos, incluindo 'Dispatcher (padrão)', 'Chain', 'Redirect', 'Redirectaction', 'Stream'
Neste artigo, os tipos de retorno de resultado apenas percebem os dois tipos de 'sucesso' e 'login' e, por enquanto, eles não consideram o tipo de solicitação. A função perfeita será reabastecida mais tarde.
Então, vamos ver como alcançar a função acima através do código.
Em primeiro lugar, as duas anotações personalizadas de Ação de Anotação e Resultação solicitam o método e o método correspondentes da string retornada pelas duas anotações personalizadas de ações
/ ** * Ação Nota: O nome da ação é equivalente ao URL -Pattern * @Author Linling * */ @retention (retentionPolicy.Runtime) @TargetType.Method Blic @Interface AçõesNoTation {String actionName () default ""; () Padrão {};} /*** Retorne ao objeto de anotação: o nome é equivalente ao nome do resultado na configuração do Struts, incluindo 'sucesso', 'nenhum', 'erro', 'entrada. Login '; () padrão "index.jsp";}
Em seguida, definimos uma classe ActionContext para salvar o conteúdo necessário para uma solicitação
/*** Implemente os suportes de simulação saltam para o conteúdo necessário para executar o método correspondente de acordo com o arquivo de configuração*@Author Linling **/public class ActionContext {/*** equivalente a url -pattern no web.xml, o Somente* /URL de sequência privada; Por exemplo: Chave: 'Sucesso'; Ação de objeto privado; * / Private String [] ActionParamsName;
Analysepackage é um método necessário para montar o ActionContext
/** * Atravessou o arquivo de classe no pacote Scan_Package, que usa o método de Ação para analisá -lo, montou -o em um objeto ActionContext e o colocou no urlmap * @param real_path scan_package * @thro ws ClassnotfoundException * @throws Instanciação InstantionException * @THOWSOWSECTALACCESSEXCECTIMENTO * @THOWSFOUNDEXCECCETO */ Public Static Void Analysepackage (String real_path, string scan_package foundException, instantificationException, ilegalAccessException, NotFoundException {file file = Real_path); if (file.isdirectory ()) {[] File = File_Path); ] f ILES = FILE.LISTFILES (); ClassStype = Class.Forname (nome do arquivo); .GetAnnotation (ActionAnnoTation.class); Método Erro de Annitation! " + Método +", ActionName: " + url +", resultado.Length: " + Results.lengts.lengt H);} actionContext.Seturl (url); ActionTexText.SetMethod (Method.getName ()) Mapa <res) mapa = novo hashmap <res) (); é nulo ");} map.put (resultado.name (), value);} actionContext.SetResults (map); act ionContext.SetClasStype (classtype); actionContext. Method.getParameterTypes ());
GetParams é uma matriz de parâmetro de solicitação com base no conteúdo da solicitação na solicitação HTTPSERVletRequest.
/** * Com base no tipo de parâmetro Parastype e nome do parâmetro ActinParamSName para analisar a solicitação de solicitação para criar um objeto de parâmetro [] * @param request * @paramstype * @param actionParamsName * @retourn * @lança instantiationException * @THOWLACESSEXCECTION * @ @ lança ilegalargumentException * @ @ @ @ @ @ lança involutionAntArgeTexception * @THOWS NosuchMedHodException * @Throws SecurityException */ Public Static Object [] Quest Request, classe <?> [] paramstype, string [] actionParamsname) lança instantação,, ilegalaccessExcepty, ilegalag [] actionParamsName) Invocat IONTARGEXCION, NosuchMethodException, SecurityException {Object [Object] Objects = new Object [ParamStype.Length]; Estilo parampe [i])) {objetos [i] = paramsutils.getparam (solicitação, paramstype [i], actionParamsName [i]);} else {class <?> Classtype = paramstype [i]; ClassStype.getDetDeclardFields (); ) {{String key = iterator.Next (); Comprimento! Valor da String = MAP.GET (Chave) [0]; } Retornar objetos;}
Ok, a seguir. Podemos implementar o método de ação
Public class LoginAction {@ActionNoTation (ActionName = "Login.Action", Results = {@Resultanitation (name = ResultType.success, value = "i ndex.jsp"),@resultannotation (name = resulttype.login, value = "login . (ActionName = "loginForuse.action", Results = {@Resannotation (nome = resultado (INT número, Loginpojo Loginpojo) {if ("hello" .equals (loginpojo.getUserName ()) && "mundial" .equojo.getpa ssword ())) {retorna resulttype.success;} resultType.login;}}}}}}}
Em seguida, o que precisamos fazer é permitir que o programa atravesse todos os métodos no diretório de trabalho ao iniciar e usar o método de Ação para descobrir e montá -lo no ActionContext. Dessa forma, quando a solicitação chegar, podemos encontrar o ActionContext correspondente de acordo com o endereço da solicitação e chamar o método pelo mecanismo de reflexão.
Definimos dois servlets. Um é usado para executar programas de inicialização. Um usado para filtrar todas as solicitações de ação
<Verlet> <Vertlet> strutsinitServlet </servlet-name> <Servlet-class> com.bayern.struts.servletsinitServlet </servlet-class> <par am-name> scan_package </amon-name> <am-value> com .Bayern.Struts.One </amul-value> </irit-param> <adarble-on-startup> 10 </load-startup> <Servlet-name> DispatcheserServlet </Servlet-Name> <Servlet-Class> com.bayern.struts.one.servlet.dispatcherServlet </servlet-mapping </servlet-mapping> <Verlet-name> DispatcheserServlet </servlet-name> <url-tattern>*. Magamento de servlet>
DispatcheserServlet implementa a filtragem da solicitação de ação usada e permite que ele execute o método de ação correspondente e faça o próximo salto
Ublic void DoPost (HTTPServletRequest Solicy, HttpServletResponse Response) lança serviço).; (Solicitação, ActionContext.getParamStype (), ActionContext.getActionParamsName (); .GetAction (), params);
Bem, agora implementamos a função de encaminhamento de solicitação mais simples do Strut2 Framework. A função é muito difícil e muitos casos ainda não a consideraram.
O acima é todo o conteúdo deste artigo. Espero que todos possam gostar.