1. 程式人生 > >Spring Boot2.0之註解方式啟動Springmvc

Spring Boot2.0之註解方式啟動Springmvc

sch 一個tomcat user use embed spring serve XML java代碼

回顧下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.classgetServletConfigClasses負責獲取Spring MVC應用容器,這裏傳入預先定義好的WebConfig.classgetServletMappings()方法負責指定需要由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