Qual é a relação entre SpringMVC e Spring?

Autor: Zhuangsheng Wen
link: https: //www.zhihu.com/question/39678061/answer/312545961
Fonte: sabe quase com
direitos autorais do autor. Para reimpressões comerciais, entre em contato com o autor para autorização. Para reimpressões não comerciais, indique a fonte.

Processo básico do Spring Web Framework

Conheça o framework Spring MVC, agora vamos dar uma olhada em seu processo

O Spring MVC Framework é tão grande quanto o processo: quando o programa da web é iniciado, ContextLoaderServlet lerá as informações do arquivo de configuração correspondente e inicializará o controlador DispatchServlet por meio de injeção. Quando uma solicitação HTTP for recebida, DispatchServlet deixará HandlerMapping ir Manipule esta solicitação. HandlerMapping seleciona um Controlador de acordo com a URL da solicitação (não necessariamente uma URL, ela pode ser personalizada, muito flexível). Em seguida, DispatchServlet irá chamar o método handlerRequest do Controlador selecionado e chamar o Controlador antes e depois deste método interceptor (se configurado) e, em seguida, retorna uma coleção de visualizações e modelos ModelAndView. A estrutura resolve a visualização por meio de ViewResolver e retorna um objeto View e, finalmente, chama o método de renderização de View para retornar ao cliente

DispatcherServlet

Este é o controlador do framework, que é uma classe concreta, que é inicializada pelo objeto de contexto em tempo de execução. O controlador em si não controla o processo, mas é apenas o "controlador" do Controlador. Ele apenas delega a responsabilidade de processar a solicitação para O controlador correspondente. O
controlador herda da classe base abstrata FrameworkServlet e seu atributo webApplicationContext representa o contexto do programa da web, e a implementação padrão deste objeto de contexto é ler informações de configuração de um arquivo XML (claro, também pode estar em outros formatos de arquivo) . WebApplicationContext é na verdade o pacote de beans. Este pacote fornece a estrutura básica de toda a estrutura do Spring. Analisarei o conteúdo deste pacote no futuro. Mas agora só preciso saber que WebApplicationContext representa o objeto de contexto de um aplicativo da web.

Agora vamos ver como funciona o DispatchServlet:

DispatchServlet herda da classe base abstrata FrameworkServlet, e os métodos doGet () e doPost () em FrameworkServlet chamam serviceWrapper (), vá para serviceWrapper () para ver, acontece que delegou a implementação específica para doService (solicitação) , resposta); método. Portanto, agora está claro que DispatchServlet realmente implementa a função do método doService ().
Em particular, o método initFrameworkServlet () de FrameworkServlet é o método de inicialização do controlador, usado para inicializar objetos como HandlerMappings , Isso também está atrasado para a implementação da subclasse. Na verdade, é uma implementação do padrão Template. Não nos chame, chamaremos u. Em geral, o Spring implementa sua inversão de controle desta forma: use o framework para Controle o fluxo, não o usuário

Vá para doService () e dê uma olhada, você verá que é outra função auxiliar doDispatch (solicitação, resposta) que realmente funciona. Não há como, continue a ler e encontrar essas duas linhas de código

HandlerExecutionChain mappedHandler = null;
mappedHandler = getHandler (processingRequest, false) ;

Olhando para o código-fonte de HandlerExecutionChain, verifica-se que ele realmente envolve o Controlador e seus Interceptores;

getHandler () é para recuperar o objeto handlerMapping correspondente de HandlerMappings (isto é uma lista, objetos handlerMapping armazenados), cada objeto HandlerMapping representa um mapeamento de controlador e URL (na verdade, em tempo de execução, é um mapeamento de HandlerExecutionChain e URL, e O objeto HandlerExecutionChain é, na verdade, um wrapper para o Controller e seus interceptores. HandlerMapping pode ser considerado um mapeamento entre o Controller e a URL. Esse HandlerMapping é injetado em tempo de execução por meio do arquivo de configuração. Geralmente, a subclasse SimpleUrlHandlerMapping
obtém o objeto HandlerMapping. , Continue a olhar para baixo e encontre:

if(mappedHandler.getInterceptors()!=null)

    {
    
    
        for (int i = 0; i < mappedHandler.getInterceptors().length; i++) {
    
    
            HandlerInterceptor interceptor = mappedHandler.getInterceptors()[i];
            if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {
    
    
                triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
                return;
            }
            interceptorIndex = i;
        }
    }

Aqui está o interceptor que está chamando o Controlador, o princípio é esta frase:

interceptor.preHandle(processedRequest, response,mappedHandler.getHandler(), mv);

O método preHandle passa no parâmetro mappedHandler.getHandler () para implementar chamadas recursivas! O método interceptor.postHandle é muito geral. Só que este método é chamado após o método handleRequest

Continue lendo:

HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

Verificou-se que a operação real de handleRequest do controlador é delegada ao método de manipulação de HandlerAdapter, e um ModelAndView é retornado.Eu acho que o significado de adicionar uma camada aqui deve ser desacoplar o controlador e DispatchServlet.

Então é muito simples, chame o método render (), neste método, ViewResoler analisa o nome da visão, e então chama o método render do objeto de visão para mostrar a visão apropriada para o usuário

Neste ponto, o processo do controlador está encerrado

HandlerMapping

Ao usar o HandlerMapping, o controlador pode usar a URL para realizar um mapeamento padrão com um controlador e realizar o UrlHandlerMapping da subclasse específica do mapeamento de URL.

Spring também nos permite personalizar o mapeamento, como mapeamento por sessão, cookie ou estado do usuário. E tudo isso só precisa implementar a interface HandlerMapping. Mas o mapeamento de URL já pode atender à maioria dos requisitos

Controlador

Controller é semelhante a Structs Action. A interface Controller tem apenas um método handleRequest (), que coloca de volta um objeto ModelAndView. Como o objetivo do projeto dizia, cada Controller é um componente java, então pode ser configurado arbitrariamente no contexto, propriedades do componente Será configurado durante a inicialização. O Spring fornece várias implementações específicas. É conveniente para nós usarmos

ViewResolver

O controlador geralmente retorna um objeto ModelAndView que contém o nome da visualização em vez do objeto da visualização. Isso remove completamente a relação de acoplamento entre o controlador e a visualização, e também pode fornecer suporte de internacionalização aqui. Em seu arquivo de configuração, você pode:

welcomeView.class = org.springframework.web.servlet.view.InternalResourceView
welcomeView.url=/welcome.jsp
也可以
welcomeView.class = org.springframework.web.servlet.view.xslt.XsltView
welcomeView.url=/xslt/default.xslt

Visão

Este também é um componente java. Ele não faz nenhum processamento de solicitação ou lógica de negócios. Ele apenas obtém os dados passados ​​pelo modelo e exibe os dados. O método de renderização nele funciona de acordo com o seguinte processo:

  1. Defina os dados do modelo para o escopo da solicitação
  2. Obtenha o URL da visualização
  3. Encaminhe para o URL correspondente

Acho que você gosta

Origin blog.csdn.net/qq1350975694/article/details/108735186
Recomendado
Clasificación