SpringMVC快速入門詳解

image.png

簡介

SpringMVC是一種基于Java實現(xiàn)MVC模型的輕量級Web框架。
具有如下優(yōu)點:

  1. 使用簡單,開發(fā)便捷(相比于Servlet)。
  2. 靈活性強。

SpringMVC是一種標簽層框架技術。
SpringMVC是用于進行表現(xiàn)層功能開發(fā)。

快速入門

1. 快速實現(xiàn)

1.1 導入SpringMVC坐標與Servlet坐標

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.2.20.RELEASE</version>
</dependency>

需要注意的是spring-webmvc版本5.2.20.RELEASE對應的jdk不能太高,1.8版本的jdk即可,我試了16是不匹配的,會出問題。

1.2 創(chuàng)建SpringMVC控制器類(等同于Servlet功能)

@Controller
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save() {
        System.out.println("springmvc save ...");
        return "{'module':'springmvc save'}";
    }
}

1.3 初始化SpringMVC環(huán)境(同Spring環(huán)境),設定SpringMVC加載對應的bean

@Configuration
@ComponentScan({"com.hao.controller"})
public class SpringMVCConfig {
}

1.4 初始化SpringMVC容器,加載SpringMVC環(huán)境,并設置SpringMVC技術處理的請求

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    // 加載springmvc容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMVCConfig.class);
        return ctx;
    }
    // 設置哪些請求歸屬springmvc處理
    @Override
    protected String[] getServletMappings() {
        // 所有請求
        return new String[]{"/"};
    }
    // 加載spring容器配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

2. 注解分析

2.1 @Controller

類型:類注解。
位置:SpringMVC控制器類定義上方。
作用:設定SpringMVC的核心控制器bean
例如:

@Controller
public class UserController {
}

2.2 @RequestMapping

類型:方法注解。
位置:SpringMVC控制器方法定義上方。
作用:設置當前控制器方法請求訪問路徑。
例如:

@RequestMapping("/save")
public void save() {
    System.out.println("springmvc save ...");
}

相關屬性:
value(默認):請求訪問路徑。

2.3 @ResponseBody

類型:方法注解。
位置:SpringMVC控制器方法定義上方。
作用:設置當前控制器方法響應內容為當前返回值,無需解析。
例如:

@RequestMapping("/save")
@ResponseBody
public String save() {
    System.out.println("springmvc save ...");
    return "{'module':'springmvc save'}";
}

3. 1+N 特點

3.1 一次性工作

  1. 創(chuàng)建工程,設置服務器,加載工程。
  2. 導入坐標。
  3. 創(chuàng)建web容器啟動類,加載SpringMVC配置,并設置SpringMVC請求攔截路徑。
  4. SpringMVC核心配置類(設置配置類,掃描controller包,加載Controller控制器bean)。

3.2 多次工作

  1. 定義處理請求的控制器類。
  2. 定義處理請求的控制器方法,并配置映射路徑(@RequestMapping)與返回json數(shù)據(jù)(@ResponseBody)。

4. Servlet容器啟動的配置類解析

AbstractDispatcherServletInitializer類是SpringMVC提供的快速初始化Web3.0容器的抽象類。
AbstractDispatcherServletInitializer提供了三個接口方法供用戶實現(xiàn)。

4.1 createServletApplicationContext()方法

該方法是創(chuàng)建Servlet容器時,加載SpringMVC對應的bean并放入WebApplicationContext對象范圍中,而WebApplicationContext的作用范圍為ServletContext范圍,即整個web容器范圍。

protected WebApplicationContext createServletApplicationContext() {
    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    ctx.register(SpringMVCConfig.class);
    return ctx;
}

4.2 getServletMappings()方法

該方法是設定SpringMVC對應的請求映射路徑,設置為/表示攔截所有請求,任意請求都將轉入到SpringMVC進行處理。

protected String[] getServletMappings() {
    return new String[]{"/"};
}

4.3 createRootApplicationContext()方法

該方法是創(chuàng)建Servlet容器時需要加載Spring對應的bean,使用當前方法進行,使用方式同createServletApplicationContext()

protected WebApplicationContext createRootApplicationContext() {
    return null;
}

5. 工作流程分析

5.1 啟動服務器初始化過程

  1. 服務器啟動,執(zhí)行ServletContainerInitConfig類(自己創(chuàng)建繼承AbstractDispatcherServletInitializer),初始化web容器。
  2. 執(zhí)行createServletApplicationContext()方法,創(chuàng)建了WebApplicationContext對象。
  3. 加載SpringMVCConfig
  4. 執(zhí)行@ComponentScan加載對應的bean
  5. 加載UserController,每個@RequestMapping的名稱對應一個具體的方法。
  6. 執(zhí)行getServletMappings()方法,定義所有的請求都通過SpringMVC

5.2 單次請求過程

  1. 發(fā)送請求localhost/save
  2. web容器發(fā)現(xiàn)所有請求都經(jīng)過SpringMVC,將請求交給SpringMVC處理。
  3. 解析請求路徑/save
  4. /save匹配執(zhí)行對象的方法save()
  5. 執(zhí)行save()
  6. 檢測到有@ResponseBody直接將save()方法的返回值作為響應體返回給請求方。

6. Spring和SpringMVC相關bean加載控制

SpringMVC相關bean主要是表現(xiàn)層bean
Spring控制的bean主要是業(yè)務bean(Service)和功能bean(DataSource等)

為了開發(fā)中減少相互之間的影響,所以在相應的配置文件掃描路徑中,盡量區(qū)分開來。

SpringMVC加載的bean對應的包均在controller包內,例如com.hao.controller
Spring加載的bean設定掃描范圍為精準范圍例如com.hao.service包和com.hao.dao包,還可以設置大范圍com.hao,然后排除掉controller包內的bean,如下:

@Configuration
@ComponentScan(value = "com.hao",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = Controller.class
        )
)
public class SpringConfig {
}

這里使用到了注解@ComponentScan的屬性excludeFilters來實現(xiàn)加載bean的過濾,同時還有與之對應的屬性includeFilters指定bean的包含,這兩者的含義如下:
excludeFilters:排除掃描路徑中加載的bean,需要指定類別(type)與具體項(classes)。
includeFilters:加載指定的bean,需要指定類別(type)與具體項(classes)。

7. Servlet容器啟動的配置類簡化

上邊創(chuàng)建的Servlet容器啟動的配置類ServletContainersInitConfig是繼承自AbstractDispatcherServletInitializer,需要實現(xiàn)三個方法來配置相應的配置,其中關于SpringSpringMVC的配置還需要創(chuàng)建AnnotationConfigWebApplicationContext對象并且注冊相關配置類,稍微有些繁瑣。SpringMVC框架對此進行了簡化,只需要繼承自AbstractAnnotationConfigDispatcherServletInitializer同樣實現(xiàn)三個對應方法來配置,如下:

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMVCConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

總結

以上就是關于SpringMVC快速入門詳解的全部內容。

綜上可以很直觀的看到SpringMVC相比于Servlet,簡化了很多的代碼量,使用起來也非常的簡單便捷,并且靈活性更強。

如果有什么問題,我們可以一起交流討論解決。

最后,希望可以幫助到有需要的碼友。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容