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

在 Spring Boot 項目中,正常來講是不存在 XML 配置,這是由於 Spring Boot 不推薦使用 XML ,注意,並不是不支持,Spring Boot 推薦開發者使用 Java 配置來搭建框架,Spring Boot 中,大量的自動化配置都是經過 Java 配置來實現的,這一套實現方案,咱們也能夠本身作,即本身也可使用純 Java 來搭建一個 SSM 環境,即在項目中,不存在任何 XML 配置,包括 web.xml 。java

環境要求:web

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

快速體驗

1 建立工程

建立一個普通的 Maven 工程(注意,這裏能夠沒必要建立 Web 工程),並添加 SpringMVC 的依賴,同時,這裏環境的搭建須要用到 Servlet ,因此咱們還須要引入 Servlet 的依賴(必定不能使用低版本的 Servlet),最終的 pom.xml 文件以下:json

<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 的配置文件,以下:​​​​​​​api

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

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

•@Configuration 註解表示這是一個配置類,在咱們這裏,這個配置的做用相似於 applicationContext.xml•@ComponentScan 註解表示配置包掃描,裏邊的屬性和 xml 配置中的屬性都是一一對應的,useDefaultFilters 表示使用默認的過濾器,而後又除去 Controller 註解,即在 Spring 容器中掃描除了 Controller 以外的其餘全部 Bean 。app

3 添加 SpringMVC 配置

接下來再來建立 springmvc 的配置文件:​​​​​​​框架

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

注意,若是不須要在 SpringMVC 中添加其餘的額外配置,這樣就能夠了。即 視圖解析器、JSON 解析、文件上傳......等等,若是都不須要配置的話,這樣就能夠了。webapp

4 配置 web.xml

此時,咱們並無 web.xml 文件,這時,咱們可使用 Java 代碼去代替 web.xml 文件,這裏會用到 WebApplicationInitializer ,具體定義以下:​​​​​​​jsp

public class WebInit implements WebApplicationInitializer {public void onStartup(ServletContext servletContext) throws ServletException {//首先來加載 SpringMVC 的配置文件AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMVCConfig.class);// 添加 DispatcherServletServletRegistration.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 ,而後啓動項目進行測試:​​​​​​​

@RestControllerpublic 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 {@Overrideprotected 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 {@Overrideprotected void configureViewResolvers(ViewResolverRegistry registry) {registry.jsp("/jsp/", ".jsp");}}

接下來,在 Controller 中添加控制器便可訪問 JSP 頁面:

​​​​​​​

@Controllerpublic 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 {@Overrideprotected 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 {@Overrideprotected 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 就是很是容易的事了。

 

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

相關文章
相關標籤/搜索