在創建maven的web工程時候,如果報錯缺少web.xml
則在pom添加如下配置 :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
web容器在啟動的時候 會掃描每個jar包下的META-INF/services/javax.servlet.ServletContainerInitializer
加載這個文件指定的啟動類
Spring的應用一啟動會加載感興趣的WebApplicationInitializer接口下的所有組件
並且為WebApplicationInitializer 組件創建對象(組件不是接口,不是抽象類)
總結:
以注解方式來啟動Spring MVC 繼承 AbstractAnnotationConfigDispatcherServletInitializer
實現抽象方法指定 DispatchServlet的配置信息
將Spring mvc 通過注解形式整合
配置:
//web容器啟動的時候就會創建對象 調用方法 初始化容器 以及前端控制器 public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { //獲取跟容器的配置類 (Spring配置文件) 父容器 @Override protected Class<?>[] getRootConfigClasses() { // TODO Auto-generated method stub return new Class<?>[] {RootConfig.class}; } // 獲取web容器的配置類 (Spring mvc配置文件) 創建子容器 @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] {AppConfig.class}; } //獲取DispatcherServlet的映射信息 @Override protected String[] getServletMappings() { // /* 攔截所有親求; 連*.jsp頁面都攔截; jsp頁面是Tomcat的jsp引擎解析的 return new String[] {"/"}; //攔截所有請求 包括靜態資源 } }
AppConfig:
//Spring mvc 只掃描controller 子容器 @ComponentScan(value="com.toov5", includeFilters= { @Filter(type=FilterType.ANNOTATION,classes= {Controller.class})}, useDefaultFilters = false) //禁用默認的過慮規則 public class AppConfig { }
RootConfig:
//Spring的容器不掃描controller 父容器 @ComponentScan(value="com.toov5", excludeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})}) public class RootConfig { }
Controller:
@Controller public class HelloController { @Autowired HelloService HelloService; @ResponseBody @RequestMapping("/hello") public String hello() { String sayHello = HelloService.sayHello("toov5"); return sayHello; } }
Service:
@Service public class HelloService { public String sayHello(String name) { return "Hello:"+name; } }
訪問:
在xml配置的spring mvc開發中
<mvc: default-servlet-handler/> 將springmvc處理不了的請求交給tomcat 靜態資源就可以訪問
<mvc:annotation-driven /> springmvc高級功能開啟
<mvc:interceptors> </mvc:interceptors>
<mvc:view-controller path="" />
下面我們定制 Spring mvc
1 @EnableWebMvc 開始Spring mvc 定制配置功能
<mvc:annotation-driven />
2 配置組件(視圖解析器 視圖映射 靜態資源映射 攔截器)
//Spring mvc 只掃描controller 子容器 @SuppressWarnings("deprecation") @ComponentScan(value="com.toov5", includeFilters= { @Filter(type=FilterType.ANNOTATION,classes= {Controller.class})}, useDefaultFilters = false) //禁用默認的過慮規則 @EnableWebMvc public class AppConfig extends WebMvcConfigurerAdapter { //定制視圖解析器 @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/views/",".jsp"); } //靜態資源訪問等等都可配置 }
Controller
@Controller public class HelloController { @Autowired HelloService HelloService; @ResponseBody @RequestMapping("/hello") public String hello() { String sayHello = HelloService.sayHello("toov5"); return sayHello; } @RequestMapping("/su") public String success() { //配置了解析器 return "success"; } }
訪問結果:
放入圖片,加入jsp:
Jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<img alt="" src="aa.jpg">
</body>
</html>
此時:
沒有找到 這個映射 這個請求是被spring mvc處理了 實際上這個是個靜態資源 交給tomcat。
下面進行自定義配置 配置靜態資源訪問
//Spring mvc 只掃描controller 子容器 @SuppressWarnings("deprecation") @ComponentScan(value="com.toov5", includeFilters= { @Filter(type=FilterType.ANNOTATION,classes= {Controller.class})}, useDefaultFilters = false) //禁用默認的過慮規則 @EnableWebMvc public class AppConfig extends WebMvcConfigurerAdapter { //定制視圖解析器 @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/views/",".jsp"); } //靜態資源訪問等等都可配置 @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); //xml:<mvc: default-servlet-handler/> 將springmvc處理不了的請求交給tomcat 靜態資源就可以訪問 } }
成功!
下面配置一個復雜一點的攔截器:
攔截器:
//需要實現spring mvc 的接口 之前: <mvc:interceptors> </mvc:interceptors> public class MyFirstInterceptor implements HandlerInterceptor{ //目標方法運行之前執行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("目標方法之前....執行了preHandle"); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("目標方之后....執行了postHandle"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("響應到頁面之后....執行了afterCompletion"); } }
配置:
//Spring mvc 只掃描controller 子容器 @SuppressWarnings("deprecation") @ComponentScan(value="com.toov5", includeFilters= { @Filter(type=FilterType.ANNOTATION,classes= {Controller.class})}, useDefaultFilters = false) //禁用默認的過慮規則 @EnableWebMvc public class AppConfig extends WebMvcConfigurerAdapter { //定制視圖解析器 @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/views/",".jsp"); } //靜態資源訪問等等都可配置 @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); //xml:<mvc: default-servlet-handler/> 將springmvc處理不了的請求交給tomcat 靜態資源就可以訪問 } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyFirstInterceptor()).addPathPatterns("/*"); //添加一個攔截器 也可以從容器中獲取 } }
運行: