Spring Boot2.0之註解方式啟動Springmvc
回顧下springmvc原理圖:
DispatcherServlet是Spring MVC的核心,每當應用接受一個HTTP請求,由DispatcherServlet負責將請求分發給應用的其他組件。
在舊版本中,DispatcherServlet之類的servlet一般在web.xml文件中配置,該文件一般會打包進最後的war包種;但是Spring 3引入了註解,我將要介紹,如何基於註解配置Spring MVC。
1、Spring mvc無配置文件夾,采用註解方式啟動。
把配置的內容 轉換為 Java代碼
步驟:
1、加載Spring容器 加載dispatcherservlet
tomcat只要讀到這幾個類,就可以幫助初始化了
配置文件代碼和pom文件
<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.toov5.springbootmvc</groupId> <artifactId>springbootmvc</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <!--Java語言操作tomcat --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>8.5.16</version> </dependency> <!-- spring-web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.4.RELEASE</version> <scope>compile</scope> </dependency> <!-- spring-mvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.4.RELEASE</version> <scope>compile</scope> </dependency> <!-- tomcat對jsp支持 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>8.5.16</version> </dependency> </dependencies> </project>
加載SpringMVC容器
正如可以通過多種方式配置DispatcherServlet一樣,也可以通過多種方式啟動Spring MVC特性。原來我們一般在xml文件中使用<mvc:annotation-driven>元素啟動註解驅動的Spring MVC特性。
package com.toov5.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; /* * spring mvc的配置信息 * */ @Configuration //表示配置 @EnableWebMvc //開啟springmvc功能 掃包 視圖轉換 攔截器 @ComponentScan("com.toov5.controller") //掃controller包 類似與傳統的配置中 開啟掃包模式那段xml配置 public class WebConfig extends WebMvcConfigurerAdapter { //需要配置視圖器 // 創建SpringMVC視圖解析器 @Bean public ViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); //可以在JSP頁面中通過${}訪問beans viewResolver.setExposeContextBeansAsAttributes(true); return viewResolver; } }
package com.toov5.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /* * 加載非Springmvc 的配置 * */ @Configuration @ComponentScan(basePackages = "com.toov5") //掃整個項目的 public class RootConfig { }
加載SpringMVCDispatcherServlet
AbstractAnnotationConfigDispatcherServletInitializer這個類負責配置DispatcherServlet、初始化Spring MVC容器和Spring容器。getRootConfigClasses()方法用於獲取Spring應用容器的配置文件,這裏我們給定預先定義的RootConfig.class;getServletConfigClasses負責獲取Spring MVC應用容器,這裏傳入預先定義好的WebConfig.class;getServletMappings()方法負責指定需要由DispatcherServlet映射的路徑,這裏給定的是"/",意思是由DispatcherServlet處理所有向該應用發起的請求。
package com.toov5.config; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; /* * 加載springmvc--dispatcherservlet * 下面的這個接口 初始化dispatcherservlet */ public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // 加載根容器 加載跟配置信息 spring核心 protected Class<?>[] getRootConfigClasses() { // TODO Auto-generated method stub return new Class[] { RootConfig.class }; } // 加載SpringMVC容器 springmvc 加載配置信息 protected Class<?>[] getServletConfigClasses() { return new Class[] { WebConfig.class }; //相當於一個數組裏面放了一個Class } // SpringMVCDispatcherServlet 攔截的請求 / 攔截所有請求 protected String[] getServletMappings() { return new String[] { "/" }; } }
controller層
package com.toov5.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController //Spring mvc 提供的哈 public class IndexController { @RequestMapping("/index") public String index(){ return "successful"; } }
package com.toov5.controller; import org.springframework.stereotype.Controller; /* * 跳轉頁面 * */ import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @RequestMapping("/pageIndex") public String pageIndex(){ return "pageIndex"; } }
tomcat:
package com.toov5; import java.io.File; import javax.servlet.ServletException; import org.apache.catalina.LifecycleException; import org.apache.catalina.WebResourceRoot; import org.apache.catalina.core.StandardContext; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.webresources.DirResourceSet; import org.apache.catalina.webresources.StandardRoot; public class AppTomcat { public static void main(String[] args) { //使用Java內置tomcat運行spring mvc框架 原理:tomcat加載到spring mvc註解啟動方式,就會創建spring mvc容器 try { start(); } catch (ServletException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (LifecycleException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void start() throws ServletException, LifecycleException { // 創建Tomcat容器 Tomcat tomcatServer = new Tomcat(); // 端口號設置 tomcatServer.setPort(9090); // 讀取項目路徑 這樣可以加載到靜態資源 StandardContext ctx = (StandardContext) tomcatServer.addWebapp("/", new File("src/main").getAbsolutePath()); // 禁止重新載入 ctx.setReloadable(false); // class文件讀取地址 啟動後 在target生成編譯後的class文件 File additionWebInfClasses = new File("target/classes"); // 創建WebRoot WebResourceRoot resources = new StandardRoot(ctx); // tomcat內部讀取Class執行 resources.addPreResources( new DirResourceSet(resources, "/WEB-INF/classes", additionWebInfClasses.getAbsolutePath(), "/")); tomcatServer.start(); // 異步等待請求執行 tomcatServer.getServer().await(); } }
啟動後:
右鍵點擊項目刷新會出現:
這時候是虛擬創建一個tomcat目錄,
點進去裏面沒有class文件,它的class文件全部在內存裏面(也可以寫到硬盤上)
最後的目錄結構:
訪問請求
下面繼續完善service層
package com.toov5.service; import org.springframework.stereotype.Service; @Service public class UserService { public String index(){ return "successful again"; } }
controller的修改
package com.toov5.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.toov5.service.UserService; @RestController //Spring mvc 提供的哈 public class IndexController { @Autowired private UserService userService; @RequestMapping("/index") public String index(){ // return "successful"; return userService.index(); } }
SpittrWebAppInitializer需要修改:
、
要不掃描不到service的!
啟動訪問:
是不是很有趣呀~~~~
Spring Boot2.0之註解方式啟動Springmvc