Servlet3.0整合SpringMvc(注解版)


在創建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("/*"); //添加一個攔截器   也可以從容器中獲取
    }
    
}

運行:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM