官术网_书友最值得收藏!

在傳統(tǒng)的Spring MVC項(xiàng)目開發(fā)中,開發(fā)一個(gè)簡易的Spring MVC項(xiàng)目,需要配置DispatcherServlet,也需要配置Spring IoC的容器。你可以選擇使用web.xml的配置來實(shí)現(xiàn),當(dāng)然,如果你使用的是Servlet 3.1規(guī)范,也可以繼承由Spring MVC提供的AbstractAnnotationConfigDispatcherServletInitializer來配置Spring MVC項(xiàng)目。這里先給出可以運(yùn)行的代碼示例,即使你還不熟悉Spring MVC也沒有關(guān)系,這里只是為了說明開發(fā)比較煩瑣而已,后面將詳談Spring MVC的開發(fā)原理。

假設(shè)你已經(jīng)導(dǎo)入需要的Spring和Spring MVC相關(guān)的依賴包到工程中,那么就可以開始配置DispatcherServlet了。例如,代碼清單1-1就是通過繼承AbstractAnnotationConfigDispatcherServletInitializer的方式來配置Spring MVC的DispatcherServlet的。

代碼清單1-1 配置Spring MVC

package com.springboot.springmvc.conf;

import
org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class MyWebAppInitializer  
       extends AbstractAnnotationConfigDispatcherServletInitializer {  

    // Spring IoC容器配置  
    @Override  
    protected Class<?>[] getRootConfigClasses() {  
        // 可以返回Spring的Java配置文件數(shù)組  
        return new Class<?>[] {};  
    }  

    // DispatcherServlet的URI映射關(guān)系配置  
    @Override  
    protected Class<?>[] getServletConfigClasses() {  
        // 可以返回Spring的Java配置文件數(shù)組  
        return new Class<?>[] { WebConfig.class };  
    }  

    // DispatcherServlet攔截請(qǐng)求匹配  
    @Override  
    protected String[] getServletMappings() {  
        return new String[] { "*.do" };  
    }  
}  

注意代碼中加粗的地方。這里引入了一個(gè)Java配置文件—— WebConfig.java,它的主要作用是配置Spring MVC的核心類DispatcherServlet的上下文,如代碼清單1-2所示。

代碼清單1-2 配置DispatcherServlet的上下文

package com.springboot.springmvc.conf;

import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
// 定義Spring MVC掃描的包
@ComponentScan(value="com.*", 
includeFilters = {@Filter(type = FilterType.ANNOTATION,
       value = Controller.class)})
// 啟動(dòng)Spring MVC配置
@EnableWebMvc
public class WebConfig {

    /***
     * 通過注解@Bean初始化視圖解析器
     * 
     * @return ViewResolver視圖解析器
     */
    @Bean(name = "internalResourceViewResolver")
    public ViewResolver initViewResolver() {
        InternalResourceViewResolver viewResolver 
          = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    /**
     * 初始化RequestMappingHandlerAdapter,并加載HTTP的JSON轉(zhuǎn)換器
     * 
     * @return RequestMappingHandlerAdapter 對(duì)象
     */
    @Bean(name = "requestMappingHandlerAdapter")
    public HandlerAdapter initRequestMappingHandlerAdapter() {
        // 創(chuàng)建RequestMappingHandlerAdapter適配器
        RequestMappingHandlerAdapter rmhd = new RequestMappingHandlerAdapter();
        // HTTP JSON轉(zhuǎn)換器
        MappingJackson2HttpMessageConverter jsonConverter 
          = new MappingJackson2HttpMessageConverter();
        // MappingJackson2HttpMessageConverter接收J(rèn)SON類型消息的轉(zhuǎn)換
        mediaType = MediaType.APPLICATION_JSON_UTF8;
        List<MediaType> mediaTypes = new ArrayList<MediaType>();
        mediaTypes.add(mediaType);
        // 加入轉(zhuǎn)換器的支持類型
        jsonConverter.setSupportedMediaTypes(mediaTypes);
        // 給適配器加入JSON轉(zhuǎn)換器
        rmhd.getMessageConverters().add(jsonConverter);
        return rmhd;
    }
}

通過上面的代碼,配置完成Spring MVC的開發(fā)環(huán)境后,才可以開發(fā)Spring MVC控制器Controller,這樣就可以開發(fā)一個(gè)簡單的控制器(Controller),如代碼清單1-3所示。

代碼清單1-3 開發(fā)Spring MVC控制器

package com.springboot.springmvc.controller;

import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {

    @RequestMapping("/test")
    @ResponseBody
    public Map<String, String> test() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("key", "value");
        return map;
    }
}

這樣就完成了一個(gè)傳統(tǒng)Spring MVC的開發(fā),但是你還需要第三方服務(wù)器,如Tomcat、WebLogic等服務(wù)器去部署你的工程。在啟動(dòng)服務(wù)器后,再打開瀏覽器,輸入對(duì)應(yīng)的URL,如項(xiàng)目名稱為SpringMVC則輸入http://localhost:8080/SpringMVC/test.do,就可以得到圖1-1所示的頁面。

圖1-1 測(cè)試傳統(tǒng)的Spring MVC項(xiàng)目

從上面來看,傳統(tǒng)的Spring MVC開發(fā)需要配置的內(nèi)容還是比較多的,而且對(duì)設(shè)計(jì)人員要求較高。開發(fā)完成后,開發(fā)者還需要找到對(duì)應(yīng)的服務(wù)器去運(yùn)行,如Tomcat或者Jetty等,這樣既要進(jìn)行開發(fā),又要進(jìn)行配置和部署,工作量還是不少的。

而使用Spring Boot開發(fā)后,你就會(huì)發(fā)現(xiàn)原來一切可以那么簡單。不過在入門階段暫時(shí)不需要討論太多的細(xì)節(jié)問題,這是未來需要討論的問題,所以這里只展示它是如何簡單而已。首先我們?cè)贗DE中創(chuàng)建一個(gè)Maven工程,并把其名稱定義為Chapter1,這樣就可以看到一個(gè)Maven配置文件pom.xml,將其內(nèi)容修改為如代碼清單1-4所示。

代碼清單1-4 配置Spring Boot依賴環(huán)境

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>springboot</groupId>
    <artifactId>chapter1</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>chapter1 Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- Spring Boot Starter依賴引入 -->
        <!-- AOP包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!-- Web開發(fā)包,將載入Spring MVC所需要的包,且內(nèi)嵌tomcat -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--加載測(cè)試依賴包 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <!-- 引入插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

從加粗的代碼中可以看到Maven的配置文件引入了多個(gè)Spring Boot的starter,Spring Boot會(huì)根據(jù)Maven配置的starter去尋找對(duì)應(yīng)的依賴,將對(duì)應(yīng)的jar包加載到工程中,而且它還會(huì)把綁定的服務(wù)器也加載到工程中,這些都不需要你再進(jìn)行處理。正如Spring Boot承諾的那樣,綁定服務(wù)器,并且實(shí)現(xiàn)Spring的盡可能的配置,采用約定優(yōu)于配置的原則。這里我們只需要開發(fā)一個(gè)類就可以運(yùn)行Spring Boot的應(yīng)用了,為此新建類——Chapter1Main,如代碼清單1-5所示。

代碼清單1-5 開發(fā)Spring Boot應(yīng)用

package com.springboot.chapter1;

import java.util.HashMap;
import java.util.Map;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
// 啟用Spring Boot自動(dòng)裝配
@EnableAutoConfiguration
public class Chapter1Main {
    @RequestMapping("/test")
    @ResponseBody
    public Map<String, String> test() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("key", "value");
        return map;
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Chapter1Main.class, args);
    }
}

好了,這個(gè)入門實(shí)例已經(jīng)完結(jié)了。如果你沒有接觸過Spring Boot那么你會(huì)十分驚訝,這樣就配置完成Spring MVC的內(nèi)容了嗎?我可以回答你:“是的,已經(jīng)完成了,現(xiàn)在完全可以使用Java Application的形式去運(yùn)行類Chapter1Main?!毕旅媸荢pring Boot的運(yùn)行日志:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.0.RELEASE)

2018-03-01 22:21:55.843  INFO 16324 --- [           main] 
com.springboot.chapter1.Chapter1Main     : 
Starting Chapter1Main on AFOIF-703271542 with PID 16324 
(G:\springboot\v2\chapter1\target\classes started by Administrator in 
G:\springboot\v2\chapter1)
......
2018-03-01 22:21:57.270  INFO 16324 --- [           main] 
s.w.s.m.m.a.RequestMappingHandlerMapping : 
Mapped "{[/test]}" onto public java.util.Map<java.lang.String, java.lang.String> 
com.springboot.chapter1.Chapter1Main.test()
......
2018-03-01 22:21:57.270  INFO 16324 --- [           main] 
com.springboot.chapter1.Chapter1Main : Started Chapter1Main in 1.845 seconds (JVM running for 2.143)

從日志中可以看到,Tomcat已經(jīng)啟動(dòng),并且將我們開發(fā)的Chapter1Main作為Spring MVC的控制器加載進(jìn)來了,也將對(duì)應(yīng)的路徑(/test)映射到開發(fā)的test方法上。因此,接下來就可以進(jìn)行測(cè)試了。打開瀏覽器,在地址欄輸入http://localhost:8080/test,可以看到如圖1-2所示的結(jié)果。

圖1-2 Spring Boot運(yùn)行結(jié)果

與傳統(tǒng)的Spring MVC是不是很不一樣呢?從上面的對(duì)比可以看出,Spring Boot 允許直接進(jìn)行開發(fā),這就是它的優(yōu)勢(shì)。在傳統(tǒng)所需要配置的地方,Spring Boot都進(jìn)行了約定,也就是你可以直接以Spring Boot約定的方式進(jìn)行開發(fā)和運(yùn)行你的項(xiàng)目。當(dāng)你需要修改配置的時(shí)候,它也提供了一些快速配置的約定,猶如它所承諾的那樣,盡可能地配置好Spring項(xiàng)目和綁定對(duì)應(yīng)的服務(wù)器,使得開發(fā)人員的配置更少,更加直接地開發(fā)項(xiàng)目。對(duì)于那些微服務(wù)而言,更喜歡的就是這樣能夠快速搭建環(huán)境的項(xiàng)目,而Spring Boot提供了這種可能性,同時(shí)Spring Boot還提供了監(jiān)控的功能,隨著云技術(shù)的到來,微服務(wù)成了市場的熱點(diǎn),于是代表Java微服務(wù)時(shí)代的Spring Boot微服務(wù)開發(fā)的時(shí)代已經(jīng)到來,結(jié)合Spring Cloud后它還能很方便地構(gòu)建分布式系統(tǒng)開發(fā),滿足大部分無能力單獨(dú)開發(fā)分布式架構(gòu)的企業(yè)所需,所以這無疑是激動(dòng)人心的技術(shù)。后面的章節(jié)讓我們走進(jìn)Spring Boot開發(fā)的森林中。

主站蜘蛛池模板: 上虞市| 昌乐县| 兰西县| 大悟县| 梁平县| 新乡县| 诸城市| 乌拉特中旗| 嫩江县| 康定县| 鄂伦春自治旗| 天津市| 曲水县| 临邑县| 山阳县| 瑞昌市| 景谷| 大竹县| 郯城县| 巴彦淖尔市| 邵阳市| 阿巴嘎旗| 晋宁县| 肃宁县| 宿松县| 留坝县| 全南县| 清流县| 邵武市| 韶山市| 宜春市| 江永县| 资中县| 施秉县| 安西县| 武冈市| 简阳市| 垣曲县| 资溪县| 鄂州市| 吴江市|