介绍
dispatchServlet 俗称前端控制器
,springmvc处理一切前端请求的入口所在,包括两个部分 Servlet WebApplicationContext和Root WebApplicationContext
官方图片如下:
DispatchServlet注解式配置
在servlet2.5 时,原有的配置是在web.xml中定义的,定义如下:
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>app1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app1-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app1</servlet-name>
<url-pattern>/app1/*</url-pattern>
</servlet-mapping>
</web-app>
注解式配置
我们知道了是DispatcherServlet是两部分组成的,
- RootConfig:加载除了Controller 的所有bean 配置
- AppConfig : 在家所有的Controller配置
注:两者正好好所有的bean 都加载了ServletConfig,就是用于加载Controller 处理请求的,还有它的一些附有属性:处理器适配器(待补充)、处理器映射器(HandlerMapper)、试图解析器(viewResover)。
AppConfig:必须继承WebMvcConfigurerAdapter 或者实现WebMvcConfigurer接口
MyWebAppInitializer
/**
* web容器启动的时候创建对象;调用方法来初始化容器以前 前端控制器
*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 获取根容器的配置类;(Spring的配置文件) 父容器;
*
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
/**
* 获取web容器的配置类(SpringMVC配置文件) 子容器;
*
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{AppConfig.class};
}
/**
* 获取DispatcherServlet的映射信息
* 拦截所有请求(包括静态资源(xx.js,xx.png)),但是不包括*.jsp;
* 拦截所有请求;连*.jsp页面都拦截;jsp页面是tomcat的jsp引擎解析的;
*
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
RootConfig
//Spring的容器不扫描controller;父容器
@ComponentScan(value="com.atguigu",excludeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Controller.class})
})
public class RootConfig {
}
AppConfig
//SpringMVC只扫描Controller;子容器
//useDefaultFilters=false 禁用默认的过滤规则;
@ComponentScan(value = "com.atguigu", includeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
/**
* 视图解析器
* @param registry
*/
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
//默认所有的页面都从 /WEB-INF/ xxx .jsp
// registry.jsp();
registry.jsp("/WEB-INF/views/", ".jsp");
}
/**
* 静态资源访问
*
* @param configurer
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* 拦截器
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// super.addInterceptors(registry);
registry.addInterceptor(new MyFirstInterceptor()).addPathPatterns("/**");
}
}
controller
@Controller
public class HelloController {
@Autowired
HelloService helloService;
@ResponseBody
@RequestMapping("/hello")
public String hello(){
String hello = helloService.sayHello("tomcat..");
return hello;
}
// /WEB-INF/views/success.jsp
@RequestMapping("/suc")
public String success(){
return "success";
}
}