Respostas:
O trabalho do DispatcherServlet é pegar um URI de entrada e encontrar a combinação certa de manipuladores (geralmente métodos nas classes Controller ) e visualizações (geralmente JSPs) que se combinam para formar a página ou recurso que deveria ser encontrado nesse local.
talvez eu tenha
/WEB-INF/jsp/pages/Home.jsp
e um método em uma classe
@RequestMapping(value="/pages/Home.html")
private ModelMap buildHome() {
return somestuff;
}
O servlet Dispatcher é o bit que "sabe" chamar esse método quando um navegador solicita a página e combinar seus resultados com o arquivo JSP correspondente para criar um documento html.
Como isso ocorre varia muito com a configuração e a versão do Spring.
Também não há razão para o resultado final ter que ser páginas da web. Ele pode fazer o mesmo para localizar pontos finais de RMI , manipular solicitações SOAP , qualquer coisa que possa entrar em um servlet.
Dispatcher Servlet
arquivo xml ao usar Annotation Based @RestController
?
No Spring MVC, todas as solicitações recebidas passam por um único servlet. Este servlet - DispatcherServlet
- é o controlador frontal. O controlador frontal é um padrão de design típico no desenvolvimento de aplicativos da web. Nesse caso, um único servlet recebe todos os pedidos e os transfere para todos os outros componentes do aplicativo.
A tarefa do DispatcherServlet
é enviar solicitação ao controlador Spring MVC específico.
Geralmente, temos muitos controladores e DispatcherServlet
refere-se a um dos seguintes mapeadores para determinar o controlador de destino:
BeanNameUrlHandlerMapping
;ControllerBeanNameHandlerMapping
;ControllerClassNameHandlerMapping
;DefaultAnnotationHandlerMapping
;SimpleUrlHandlerMapping
.Se nenhuma configuração for realizada, os DispatcherServlet
usos BeanNameUrlHandlerMapping
e DefaultAnnotationHandlerMapping
por padrão.
Quando o controlador de destino é identificado, a DispatcherServlet
solicitação é enviada. O controlador realiza algum trabalho de acordo com a solicitação (ou o delega para outros objetos) e retorna ao DispatcherServlet
modelo e ao nome da visualização.
O nome da exibição é apenas um nome lógico. Esse nome lógico é então usado para procurar a Visualização real (para evitar o acoplamento com o controlador e a Visualização específica). Em seguida, DispatcherServlet
refere-se ViewResolver
ae mapeia o nome lógico da Visualização para a implementação específica da Visualização.
Algumas implementações possíveis do ViewResolver
são:
BeanNameViewResolver
;ContentNegotiatingViewResolver
;FreeMarkerViewResolver
;InternalResourceViewResolver
;JasperReportsViewResolver
;ResourceBundleViewResolver
;TilesViewResolver
;UrlBasedViewResolver
;VelocityLayoutViewResolver
;VelocityViewResolver
;XmlViewResolver
;XsltViewResolver
.Quando DispatcherServlet
determina a visualização que exibirá os resultados, ela será renderizada como resposta.
Finalmente, DispatcherServlet
retorna o Response
objeto de volta ao cliente.
DispatcherServlet
é a implementação do Spring MVC do padrão do controlador frontal .
Veja a descrição nos documentos do Spring aqui .
Essencialmente, é um servlet que leva a solicitação de entrada e delega o processamento dessa solicitação a um dos vários manipuladores, cujo mapeamento é específico na DispatcherServlet
configuração.
DispatcherServlets
, se sua arquitetura fizer mais sentido dessa maneira, mas geralmente não há motivos para isso.
Sei que esta questão já está marcada como resolvida, mas quero adicionar uma imagem mais recente explicando esse padrão em detalhes (fonte: spring in action 4):
Explicação
Quando a solicitação sai do navegador (1) , ela carrega informações sobre o que o usuário está solicitando. No mínimo, a solicitação estará carregando o URL solicitado. Mas também pode transportar dados adicionais, como as informações enviadas em um formulário pelo usuário.
A primeira parada nas viagens da solicitação é no DispatcherServlet da Spring. Como a maioria das estruturas da Web baseadas em Java, o Spring MVC direciona solicitações por meio de um único servlet de controlador frontal. Um controlador frontal é um padrão comum de aplicativo da Web em que um único servlet delega a responsabilidade por uma solicitação a outros componentes de um aplicativo para executar o processamento real. No caso do Spring MVC, o DispatcherServlet é o controlador frontal. O trabalho do DispatcherServlet é enviar a solicitação para um controlador Spring MVC. Um controlador é um componente do Spring que processa a solicitação. Mas um aplicativo típico pode ter vários controladores, e o DispatcherServlet precisa de ajuda para decidir a qual controlador enviar a solicitação. Portanto, o DispatcherServlet consulta um ou mais mapeamentos de manipulador (2)para descobrir onde será a próxima parada da solicitação. O mapeamento do manipulador presta atenção especial ao URL transportado pela solicitação ao tomar sua decisão. Depois que um controlador apropriado é escolhido, o DispatcherServlet envia a solicitação de maneira alegre para o controlador escolhido (3). No controlador, a solicitação diminui sua carga útil (as informações enviadas pelo usuário) e espera pacientemente enquanto o controlador processa essas informações. (Na verdade, um controlador bem projetado realiza pouco ou nenhum processamento em si e, em vez disso, delega a responsabilidade pela lógica comercial a um ou mais objetos de serviço.) A lógica executada por um controlador geralmente resulta em algumas informações que precisam ser transportadas para o usuário e exibido no navegador. Esta informação é referida como o modelo. Mas enviar informações brutas de volta para o usuário não é suficiente - ele precisa ser formatado em um formato amigável, geralmente HTML. Para isso, as informações precisam ser fornecidas para uma visualização, geralmente uma JavaServer Page (JSP). Uma das últimas coisas que um controlador faz é empacotar os dados do modelo e identificar o nome de uma exibição que deve renderizar a saída. Em seguida, ele envia a solicitação, juntamente com o nome do modelo e da visualização, de volta ao DispatcherServlet(4) . Para que o controlador não seja acoplado a uma visualização específica, o nome da visualização passado para DispatcherServlet não identifica diretamente um JSP específico. Nem sequer sugere necessariamente que a visualização é um JSP. Em vez disso, ele carrega apenas um nome lógico que será usado para procurar a visualização real que produzirá o resultado. O DispatcherServlet consulta um resolvedor de visualização (5) para mapear o nome da visualização lógica para uma implementação específica da visualização, que pode ou não ser um JSP. Agora que o DispatcherServlet sabe qual visualização renderizará o resultado, o trabalho da solicitação está quase no fim. Sua parada final está na implementação da vista (6), geralmente um JSP, em que ele fornece os dados do modelo. O trabalho da solicitação está finalmente concluído. A visualização usará os dados do modelo para renderizar a saída que será transportada de volta ao cliente pelo objeto de resposta (não muito trabalhoso) (7) .
@Controller
método chamado, @ResponseBody
indicando que a resposta retornada deve ser escrita diretamente no corpo da resposta HTTP, não para ser colocada em um Modelo ou ser resolvida conforme a vista. .
Podemos dizer como DispatcherServlet
cuidar de tudo no Spring MVC.
No contêiner da web, inicie:
DispatcherServlet
será carregado e inicializado chamando
init()
métodoinit()
O DispatcherServlet
tentará identificar o documento de configuração do Spring com convenções de nomenclatura, como
"servlet_name-servlet.xml"
todos os beans podem ser identificados.Exemplo:
public class DispatcherServlet extends HttpServlet {
ApplicationContext ctx = null;
public void init(ServletConfig cfg){
// 1. try to get the spring configuration document with default naming conventions
String xml = "servlet_name" + "-servlet.xml";
//if it was found then creates the ApplicationContext object
ctx = new XmlWebApplicationContext(xml);
}
...
}
Portanto, em geral DispatcherServlet
captura URI de solicitação e entrega para HandlerMapping
. HandlerMapping
procure o mapeamento de bean com o método do controlador, em que o controlador retorna o nome lógico (visualização). Então esse nome lógico é enviado para DispatcherServlet
por HandlerMapping
. Em seguida, DispatcherServlet
diga ViewResolver
para fornecer a localização completa da visão acrescentando prefixo e sufixo e, em seguida, DispatcherServlet
visualize o cliente.
O Dispatcher Controller é exibido na figura em que toda a solicitação recebida é interceptada pelo servlet do dispatcher que funciona como controlador frontal. O servlet do distribuidor obtém uma entrada para o mapeamento do manipulador do arquivo XML e define a solicitação para o Controlador.
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<context:component-scan base-package="com.demo" />
<context:annotation-config />
<mvc:annotation-driven />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="datasource" />
</bean>
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/employee" />
<property name="username" value="username" />
<property name="password" value="password" />
</bean>
</beans>