1. 程式人生 > >Spring Boot2 系列教程(一)純 Java 搭建 SSM 專案

Spring Boot2 系列教程(一)純 Java 搭建 SSM 專案

在 Spring Boot 專案中,正常來說是不存在 XML 配置,這是因為 Spring Boot 不推薦使用 XML ,注意,並非不支援,Spring Boot 推薦開發者使用 Java 配置來搭建框架,Spring Boot 中,大量的自動化配置都是通過 Java 配置來實現的,這一套實現方案,我們也可以自己做,即自己也可以使用純 Java 來搭建一個 SSM 環境,即在專案中,不存在任何 XML 配置,包括 web.xml 。

環境要求:

  • 使用純 Java 來搭建 SSM 環境,要求 Tomcat 的版本必須在 7 以上。

快速體驗

1 建立工程

建立一個普通的 Maven 工程(注意,這裡可以不必建立 Web 工程),並新增 SpringMVC 的依賴,同時,這裡環境的搭建需要用到 Servlet ,所以我們還需要引入 Servlet 的依賴(一定不能使用低版本的 Servlet),最終的 pom.xml 檔案如下:

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

2 新增 Spring 配置

工程建立成功之後,首先新增 Spring 的配置檔案,如下:

@Configuration
@ComponentScan(basePackages = "org.javaboy", useDefaultFilters = true, excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)})
public class SpringConfig {
}

關於這個配置,我說如下幾點:

  • @Configuration 註解表示這是一個配置類,在我們這裡,這個配置的作用類似於 applicationContext.xml
  • @ComponentScan 註解表示配置包掃描,裡邊的屬性和 xml 配置中的屬性都是一一對應的,useDefaultFilters 表示使用預設的過濾器,然後又除去 Controller 註解,即在 Spring 容器中掃描除了 Controller 之外的其他所有 Bean 。

3 新增 SpringMVC 配置

接下來再來建立 springmvc 的配置檔案:

@Configuration
@ComponentScan(basePackages = "org.javaboy",useDefaultFilters = false,includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)})
public class SpringMVCConfig {
}

注意,如果不需要在 SpringMVC 中新增其他的額外配置,這樣就可以了。即 檢視解析器、JSON 解析、檔案上傳......等等,如果都不需要配置的話,這樣就可以了。

4 配置 web.xml

此時,我們並沒有 web.xml 檔案,這時,我們可以使用 Java 程式碼去代替 web.xml 檔案,這裡會用到 WebApplicationInitializer ,具體定義如下:

public class WebInit implements WebApplicationInitializer {
    public void onStartup(ServletContext servletContext) throws ServletException {
        //首先來載入 SpringMVC 的配置檔案
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMVCConfig.class);
        // 新增 DispatcherServlet
        ServletRegistration.Dynamic springmvc = servletContext.addServlet("springmvc", new DispatcherServlet(ctx));
        // 給 DispatcherServlet 新增路徑對映
        springmvc.addMapping("/");
        // 給 DispatcherServlet 新增啟動時機
        springmvc.setLoadOnStartup(1);
    }
}

WebInit 的作用類似於 web.xml,這個類需要實現 WebApplicationInitializer 介面,並實現介面中的方法,當專案啟動時,onStartup 方法會被自動執行,我們可以在這個方法中做一些專案初始化操作,例如載入 SpringMVC 容器,新增過濾器,新增 Listener、新增 Servlet 等。

注意:

由於我們在 WebInit 中只是添加了 SpringMVC 的配置,這樣專案在啟動時只會去載入 SpringMVC 容器,而不會去載入 Spring 容器,如果一定要載入 Spring 容器,需要我們修改 SpringMVC 的配置,在 SpringMVC 配置的包掃描中也去掃描 @Configuration 註解,進而載入 Spring 容器,還有一種方案可以解決這個問題,就是直接在專案中捨棄 Spring 配置,直接將所有配置放到 SpringMVC 的配置中來完成,這個在 SSM 整合時是沒有問題的,在實際開發中,較多采用第二種方案,第二種方案,SpringMVC 的配置如下:

@Configuration
@ComponentScan(basePackages = "org.javaboy")
public class SpringMVCConfig {
}

這種方案中,所有的註解都在 SpringMVC 中掃描,採用這種方案的話,則 Spring 的配置檔案就可以刪除了。

5 測試

最後,新增一個 HelloController ,然後啟動專案進行測試:

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

啟動專案,訪問介面,結果如下:

6 其他配置

6.1 靜態資源過濾

靜態資源過濾在 SpringMVC 的 XML 中的配置如下:

<mvc:resources mapping="/**" location="/"/>

在 Java 配置的 SSM 環境中,如果要配置靜態資源過濾,需要讓 SpringMVC 的配置繼承 WebMvcConfigurationSupport ,進而重寫 WebMvcConfigurationSupport 中的方法,如下:

@Configuration
@ComponentScan(basePackages = "org.javaboy")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/js/**").addResourceLocations("classpath:/");
    }
}

重寫 addResourceHandlers 方法,在這個方法中配置靜態資源過濾,這裡我將靜態資源放在 resources 目錄下,所以資源位置是 classpath:/ ,當然,資源也可以放在 webapp 目錄下,此時只需要修改配置中的資源位置即可。如果採用 Java 來配置 SSM 環境,一般來說,可以不必使用 webapp 目錄,除非要使用 JSP 做頁面模板,否則可以忽略 webapp 目錄。

6.2 檢視解析器

在 XML 檔案中,通過如下方式配置檢視解析器:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

如果通過 Java 類,一樣也可以實現類似功能。

首先為我們的專案新增 webapp 目錄,webapp 目錄中新增一個 jsp 目錄,jsp 目錄中新增 jsp 檔案:

然後引入 JSP 的依賴:

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.1</version>
</dependency>

然後,在配置類中,繼續重寫方法:

@Configuration
@ComponentScan(basePackages = "org.javaboy")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/jsp/", ".jsp");
    }
}

接下來,在 Controller 中新增控制器即可訪問 JSP 頁面:

@Controller
public class HelloController2 {
    @GetMapping("/hello2")
    public String hello() {
        return "hello";
    }
}

6.3 路徑對映

有的時候,我們的控制器的作用僅僅只是一個跳轉,就像上面小節中的控制器,裡邊沒有任何業務邏輯,像這種情況,可以不用定義方法,可以直接通過路徑對映來實現頁面訪問。如果在 XML 中配置路徑對映,如下:

<mvc:view-controller path="/hello" view-name="hello" status-code="200"/>

這行配置,表示如果使用者訪問 /hello 這個路徑,則直接將名為 hello 的檢視返回給使用者,並且響應碼為 200,這個配置就可以替代 Controller 中的方法。

相同的需求,如果在 Java 程式碼中,寫法如下:

@Configuration
@ComponentScan(basePackages = "org.javaboy")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/hello3").setViewName("hello");
    }
}

此時,使用者訪問 /hello3 介面,就能看到名為 hello 的檢視檔案。

6.4 JSON 配置

SpringMVC 可以接收JSON 引數,也可以返回 JSON 引數,這一切依賴於 HttpMessageConverter。

HttpMessageConverter 可以將一個 JSON 字串轉為 物件,也可以將一個物件轉為 JSON 字串,實際上它的底層還是依賴於具體的 JSON 庫。

所有的 JSON 庫要在 SpringMVC 中自動返回或者接收 JSON,都必須提供和自己相關的 HttpMessageConverter 。

SpringMVC 中,預設提供了 Jackson 和 gson 的 HttpMessageConverter ,分別是:MappingJackson2HttpMessageConverter 和 GsonHttpMessageConverter 。

正因為如此,我們在 SpringMVC 中,如果要使用 JSON ,對於 jackson 和 gson 我們只需要新增依賴,加完依賴就可以直接使用了。具體的配置是在 AllEncompassingFormHttpMessageConverter 類中完成的。

如果開發者使用了 fastjson,那麼預設情況下,SpringMVC 並沒有提供 fastjson 的 HttpMessageConverter ,這個需要我們自己提供,如果是在 XML 配置中,fastjson 除了加依賴,還要顯式配置 HttpMessageConverter,如下:

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

在 Java 配置的 SSM 中,我們一樣也可以新增這樣的配置:

@Configuration
@ComponentScan(basePackages = "org.javaboy")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setCharset(Charset.forName("UTF-8"));
        converter.setFastJsonConfig(fastJsonConfig);
        converters.add(converter);
    }
}

然後,就可以在介面中直接返回 JSON 了,此時的 JSON 資料將通過 fastjson 生成。

總結

好了,本文通過一個簡單的例子向讀者展示了使用 Java 來配置 Spring+SpringMVC 環境,事實上,只要這兩個配置 OK ,再加入 MyBatis 就是非常容易的事了,本文相關的案例鬆哥已經上傳到 GitHub 上了:https://github.com/lenve/javaboy-code-samples。

關於本文,有問題歡迎留言討論。

相關推薦

Spring Boot2 系列教程() Java 搭建 SSM 專案

在 Spring Boot 專案中,正常來說是不存在 XML 配置,這是因為 Spring Boot 不推薦使用 XML ,注意,並非不支援,Spring Boot 推薦開發者使用 Java 配置來搭建框架,Spring Boot 中,大量的自動化配置都是通過 Java 配置來實現的,這一套實現方案,我們也可

Spring Boot2 系列教程(十)Spring Boot 中的靜態資源配置

當我們使用 SpringMVC 框架時,靜態資源會被攔截,需要新增額外配置,之前老有小夥伴在微信上問鬆哥 Spring Boot 中的靜態資源載入問題:“鬆哥,我的 HTML 頁面好像沒有樣式?”,今天我就通過一篇文章,來和大夥仔細聊一聊這個問題。 1. SSM 中的配置 要講 Spring Boot 中的問

Spring Boot2 系列教程(二十)整合 MyBatis

前面兩篇文章和讀者聊了 Spring Boot 中最簡單的資料持久化方案 JdbcTemplate,JdbcTemplate 雖然簡單,但是用的並不多,因為它沒有 MyBatis 方便,在 Spring+SpringMVC 中整合 MyBatis 步驟還是有點複雜的,要配置多個 Bean,Spring Boo

Spring Boot2 系列教程(三十)Spring Boot 構建 RESTful 風格應用

RESTful ,到現在相信已經沒人不知道這個東西了吧!關於 RESTful 的概念,我這裡就不做過多介紹了,傳統的 Struts 對 RESTful 支援不夠友好 ,但是 SpringMVC 對於 RESTful 提供了很好的支援,常見的相關注解有: @RestController @GetMapping

【Python3.6+Django2.0+Xadmin2.0系列教程】環境搭建及項目創建

添加 tran div 先來 ans 好的項目 tty 文件 mac 由於工作需要,接觸了大半年時間的Django+xadmin框架,一直沒空對這塊對進行相關的梳理。最近在同事的慫恿下,就在這分享下筆者的學習及工作經驗吧。 好了,話不多說,下面開始進入正題: 環境

spring boot系列教程

1.spring boot簡介 Spring Boot 的優點快速開發,特別適合構建微服務系統,另外給我們封裝了各種經常使用的套件,比如mybatis、hibernate、redis、mongodb等。 2.spring Hello World(maven方式) <parent>

次,我連 web.xml 都不要了, Java 搭建 SSM 環境!

在 Spring Boot 專案中,正常來說是不存在 XML 配置,這是因為 Spring Boot 不推薦使用 XML ,注意,並非不支援,Spring Boot 推薦開發者使用 Java 配置來搭建框架,Spring Boot 中,大量的自動化配置都是通過 Java 配置來實現的,這一套實現方案,我們也可

次,我連 web.xml 都不要了, Java 搭建 SSM 環境

在 Spring Boot 專案中,正常來說是不存在 XML 配置,這是因為 Spring Boot 不推薦使用 XML ,注意,

Spring Boot2 系列教程(二)建立 Spring Boot 專案的三種方式

我最早是 2016 年底開始寫 Spring Boot 相關的部落格,當時使用的版本還是 1.4.x ,文章發表在 CSDN 上,閱讀量最大的一篇有 43W+,如下圖: 2017 年由於種種原因,就沒有再繼續更新 Spring Boot 相關的部落格了,2018年又去寫書了,也沒更新,現在 Spring

Spring Boot2 系列教程(三)理解 Spring Boot 專案中的 parent

前面和大夥聊了 Spring Boot 專案的三種建立方式,這三種建立方式,無論是哪一種,建立成功後,pom.xml 座標檔案中都有如下一段引用: <parent> <groupId>org.springframework.boot</groupId> &l

Spring Boot2 系列教程(四)理解Spring Boot 配置檔案 application.properties

在 Spring Boot 中,配置檔案有兩種不同的格式,一個是 properties ,另一個是 yaml 。 雖然 properties 檔案比較常見,但是相對於 properties 而言,yaml 更加簡潔明瞭,而且使用的場景也更多,很多開源專案都是使用 yaml 進行配置(例如 Hexo)。除了簡潔

Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置

搞 Spring Boot 的小夥伴都知道,Spring Boot 中的配置檔案有兩種格式,properties 或者 yaml,一般情況下,兩者可以隨意使用,選擇自己順手的就行了,那麼這兩者完全一樣嗎?肯定不是啦!本文就來和大夥重點介紹下 yaml 配置,最後再來看看 yaml 和 properties 配

Spring Boot2 系列教程(六)自定義 Spring Boot 中的 starter

我們使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中。Starter 為我們帶來了眾多的自動化配置,有了這些自動化配置,我們可以不費吹灰之力就能搭建一個生產級開發環境,有的小夥伴會覺得這個 Starter 好神奇呀!其實 Starter 也都是 Spring + SpringMVC

Spring Boot2 系列教程(七)理解自動化配置的原理

Spring Boot 中的自動化配置確實夠吸引人,甚至有人說 Spring Boot 讓 Java 又一次煥發了生機,這話雖然聽著有點誇張,但是不可否認的是,曾經臃腫繁瑣的 Spring 配置確實讓人感到頭大,而 Spring Boot 帶來的全新自動化配置,又確實緩解了這個問題。 你要是問這個自動化配置是

Spring Boot2 系列教程(八)Spring Boot 中配置 Https

https 現在已經越來越普及了,特別是做一些小程式或者公眾號開發的時候,https 基本上都是剛需了。 不過一個 https 證書還是挺費錢的,個人開發者可以在各個雲服務提供商那裡申請一個免費的證書。我印象中有效期一年,可以申請 20 個。 今天要和大家聊的是在 Spring Boot 專案中,如何開啟 h

Spring Boot2 系列教程(九)Spring Boot 整合 Thymeleaf

雖然現在慢慢在流行前後端分離開發,但是據鬆哥所瞭解到的,還是有一些公司在做前後端不分的開發,而在前後端不分的開發中,我們就會需要後端頁面模板(實際上,即使前後端分離,也會在一些場景下需要使用頁面模板,例如郵件傳送模板)。 早期的 Spring Boot 中還支援使用 Velocity 作為頁面模板,現在的

Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

今天來聊聊 Spring Boot 整合 Freemarker。 Freemarker 簡介 這是一個相當老牌的開源的免費的模版引擎。通過 Freemarker 模版,我們可以將資料渲染成 HTML 網頁、電子郵件、配置檔案以及原始碼等。Freemarker 不是面向終端使用者的,而是一個 Java 類庫,我

Spring Boot2 系列教程(十二)@ControllerAdvice 的三種使用場景

嚴格來說,本文並不算是 Spring Boot 中的知識點,但是很多學過 SpringMVC 的小夥伴,對於 @ControllerAdvice 卻並不熟悉,Spring Boot 和 SpringMVC 一脈相承,@ControllerAdvice 在 Spring Boot 中也有廣泛的使用場景,因此本文

Spring Boot2 系列教程(十四)CORS 解決跨域問題

今天和小夥伴們來聊一聊通過CORS解決跨域問題。 同源策略 很多人對跨域有一種誤解,以為這是前端的事,和後端沒關係,其實不是這樣的,說到跨域,就不得不說說瀏覽器的同源策略。 同源策略是由 Netscape 提出的一個著名的安全策略,它是瀏覽器最核心也最基本的安全功能,現在所有支援 JavaScript 的瀏覽

Spring Boot2 系列教程(十五)定義系統啟動任務的兩種方式

在 Servlet/Jsp 專案中,如果涉及到系統任務,例如在專案啟動階段要做一些資料初始化操作,這些操作有一個共同的特點,只在專案啟動時進行,以後都不再執行,這裡,容易想到web基礎中的三大元件( Servlet、Filter、Listener )之一 Listener ,這種情況下,一般定義一個 Serv