課程Spring註解驅動學習筆記(十四)servlet3.0與SpringMVC整合

原理分析

1、web容器在啓動的時候,會掃描每個jar包下的META-INF/services/javax.servlet.ServletContainerInitializer
2、加載這個文件指定的類SpringServletContainerInitializer
3、spring的應用一啓動會加載感興趣的WebApplicationInitializer接口的下的所有組件;
4、並且爲WebApplicationInitializer組件創建對象(組件不是接口,不是抽象類)
    1)、AbstractContextLoaderInitializer:創建根容器;createRootApplicationContext();
    2)、AbstractDispatcherServletInitializer:
            創建一個web的ioc容器;createServletApplicationContext();
            創建了DispatcherServlet;createDispatcherServlet();
            將創建的DispatcherServlet添加到ServletContext中;
                getServletMappings();
    3)、AbstractAnnotationConfigDispatcherServletInitializer:註解方式配置的DispatcherServlet初始化器
            創建根容器:createRootApplicationContext()
                    getRootConfigClasses();傳入一個配置類
            創建web的ioc容器: createServletApplicationContext();
                    獲取配置類;getServletConfigClasses();

 

總結

以註解方式來啓動SpringMVC;繼承AbstractAnnotationConfigDispatcherServletInitializer;實現抽象方法指定DispatcherServlet的配置信息;

 

SpringMVC整合

1、首先創建一個maven項目,添加依賴

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.atguigu</groupId>
  <artifactId>springmvc-annotation</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <dependencies>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-webmvc</artifactId>
  		<version>4.3.11.RELEASE</version>
  	</dependency>
  	
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>servlet-api</artifactId>
  		<version>3.0-alpha-1</version>
  		<scope>provided</scope>
  	</dependency>
  </dependencies>

  <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>
</project>

2、創建MyWebAppInitializer繼承AbstractAnnotationConfigDispatcherServletInitializer

//web容器啓動的時候創建對象;調用方法來初始化容器以前前端控制器
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	//獲取根容器的配置類;(Spring的配置文件)   父容器;不掃描controller
	@Override
	protected Class<?>[] getRootConfigClasses() {
		// TODO Auto-generated method stub
		return new Class<?>[]{RootConfig.class};
	}

	//獲取web容器的配置類(SpringMVC配置文件)  子容器;業務邏輯有關,只掃描controller
	@Override
	protected Class<?>[] getServletConfigClasses() {
		// TODO Auto-generated method stub
		return new Class<?>[]{AppConfig.class};
	}

	//獲取DispatcherServlet的映射信息
	//  /:攔截所有請求(包括靜態資源(xx.js,xx.png)),但是不包括*.jsp;
	//  /*:攔截所有請求;連*.jsp頁面都攔截;jsp頁面是tomcat的jsp引擎解析的;
	@Override
	protected String[] getServletMappings() {
		// TODO Auto-generated method stub
		return new String[]{"/"};
	}

}

3、添加配置信息

AppConfig.java

//SpringMVC只掃描Controller;子容器
//useDefaultFilters=false 禁用默認的過濾規則;
@ComponentScan(value="com.atguigu",includeFilters={
		@Filter(type=FilterType.ANNOTATION,classes={Controller.class})
},useDefaultFilters=false)
@EnableWebMvc
public class AppConfig  implement WebMvcConfigurer {
}

RootConfig.java

//Spring的容器不掃描controller;父容器
@ComponentScan(value="com.atguigu",excludeFilters={
		@Filter(type=FilterType.ANNOTATION,classes={Controller.class})
})
public class RootConfig {

}

4、添加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";
	}

}

5、添加service

@Service
public class HelloService {
	public String sayHello(String name){	
		return "Hello "+name;
	}
}

6、啓動項目訪問

 

定製與接管SpringMVC

我們使用xml配置文件時可以進行很多配置,現在不用xml配置要怎麼做呢

<?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:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!--將SpringMVC處理不了的請求交給tomcat;靜態資源 就可以訪問 -->
	<mvc:default-servlet-handler/>
	<!-- SpringMVC的高級功能開啓 -->
	<mvc:annotation-driven />
	
	<!-- <mvc:interceptors>
	
	</mvc:interceptors>
	<mvc:view-controller path=""/> -->

</beans>

定製SpringMVC
1)@EnableWebMvc:開啓SpringMVC定製配置功能;
    <mvc:annotation-driven/>

2)配置組件(視圖解析器、視圖映射、靜態資源映射、攔截器。。。)
    extends WebMvcConfigurerAdapter

 

在AppConfig中添加配置,實現WebMvcConfigurer需要實現很多方法但是一般不需要那麼多。可以換用WebMvcConfigurerAdapter適配器進行適配,添加需要定製的方法。

//SpringMVC只掃描Controller;子容器
//useDefaultFilters=false 禁用默認的過濾規則;
@ComponentScan(value="com.atguigu",includeFilters={
		@Filter(type=FilterType.ANNOTATION,classes={Controller.class})
},useDefaultFilters=false)
@EnableWebMvc
public class AppConfig  extends WebMvcConfigurerAdapter  {

	//定製
	//視圖解析器
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		// TODO Auto-generated method stub
		//默認所有的頁面都從 /WEB-INF/ xxx .jsp
		//registry.jsp();
		registry.jsp("/WEB-INF/views/", ".jsp");
	}
	
	//靜態資源訪問
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		// TODO Auto-generated method stub
		configurer.enable();
	}
	
	//攔截器
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// TODO Auto-generated method stub
		//super.addInterceptors(registry);
		registry.addInterceptor(new MyFirstInterceptor()).addPathPatterns("/**");
	}

}

添加攔截器

public class MyFirstInterceptor implements HandlerInterceptor {

	//目標方法運行之前執行
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("preHandle..."+request.getRequestURI());
		return true;
	}

	//目標方法執行正確以後執行
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("postHandle...");

	}

	//頁面響應以後執行
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("afterCompletion...");
	}

}

視圖解析器

/WEB-INF/views/下添加index.jsp,訪問會進入jsp頁面

靜態資源訪問

在jsp頁面並引入圖片,運行jsp發現圖片可以訪問

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<img alt="" src="upload_3.jpg">
</body>
</html>

攔截器

啓動項目進行訪問的時候,發現攔截器生效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章