1. 程式人生 > >springboot與springMVC對比學習

springboot與springMVC對比學習

開發模式比較

1.springmvc會在web.xml檔案中配置DispatcherServlet,負責截獲,處理所有請求,如下的配置:

<!-- 前端控制器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 預設找 /WEB-INF/[servlet的名稱]-servlet.xml -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <init-param>
        <param-name>dispatchOptionsRequest</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

2. 在 Spring MVC 配置檔案中,宣告預定義的控制器和檢視解析器等

3. 編寫預定義的處理請求控制器

4. 編寫預定義的檢視物件,比如 JSP、Freemarker 等

 

springboot mvc會省略前兩步,

1. 編寫預定義的處理請求控制器

2. 編寫預設 ThymeLeaf 檢視物件

@Controller
@RequestMapping(value = "/users") 
public class UserController
{
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/user/index")
    public String index(){
        return "user/index";
    }

    @RequestMapping(value = "/user/show",method = RequestMethod.GET)
    @ResponseBody
    public String show(@RequestParam(value = "name")String name){
        User user = userService.findUserByName(name);
        if(null != user)
            return user.getId()+"/"+user.getName();
        else return "null";
    }


}

@Controller 註解在 UserController 類上,標識其為一個可接收 HTTP 請求的控制器

@RequestMapping(value = "/users") 註解 ,標識 UserController 類下所有接收的請求路由都是 /users 開頭的。注意:類上的 @RequestMapping 註解是不必需的

@RequestMapping(method = RequestMethod.GET) 註解,標識該 getUserList(ModelMap map) 方法會接收並處理 /users 請求,且請求方法是 GET

getUserList(ModelMap map) 方法返回的字串 userList ,代表著是檢視,會有檢視解析器解析成為一個具體的檢視物件,然後經過檢視渲染展示到瀏覽器

 

 

springboot自定義屬性

首先專案結構如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

├── pom.xml

└── src

    ├── main

    │   ├── java

    │   │   └── org

    │   │       └── spring

    │   │           └── springboot

    │   │               ├── Application.java

    │   │               └── property

    │   │                   ├── HomeProperties.java

    │   │                   └── UserProperties.java

    │   └── resources

    │       ├── application-dev.properties

    │       ├── application-prod.properties

    │       └── application.properties

    └── test

        ├── java

        │   └── org

        │       └── spring

        │           └── springboot

        │               └── property

        │                   ├── HomeProperties1.java

        │                   └── PropertiesTest.java

        └── resouorces

            └── application.yml

 

在 application.properties 中對應 HomeProperties 物件欄位編寫屬性的 KV 值:

1

2

3

4

## 家鄉屬性 Dev

home.province=ZheJiang

home.city=WenLing

home.desc=dev: I'm living in ${home.province} ${home.city}.

這裡也可以通過佔位符,進行屬性之間的引用。

 

然後,編寫對應的 HomeProperties Java 物件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

/**

 * 家鄉屬性

 *

 * Created by bysocket on 17/04/2017.

 */

@Component

@ConfigurationProperties(prefix = "home")

public class HomeProperties {

 

    /**

     * 省份

     */

    private String province;

 

    /**

     * 城市

     */

    private String city;

 

    /**

     * 描述

     */

    private String desc;

 

    public String getProvince() {

        return province;

    }

 

    public void setProvince(String province) {

        this.province = province;

    }

 

    public String getCity() {

        return city;

    }

 

    public void setCity(String city) {

        this.city = city;

    }

 

    public String getDesc() {

        return desc;

    }

 

    public void setDesc(String desc) {

        this.desc = desc;

    }

 

    @Override

    public String toString() {

        return "HomeProperties{" +

                "province='" + province + '\'' +

                ", city='" + city + '\'' +

                ", desc='" + desc + '\'' +

                '}';

    }

}

 

通過 @ConfigurationProperties(prefix = "home”) 註解,將配置檔案中以 home 字首的屬性值自動繫結到對應的欄位中。同是用 @Component 作為 Bean 注入到 Spring 容器中。

 

如果不是用 application.properties 檔案,而是用 application.yml 的檔案,對應配置如下:

1

2

3

4

5

## 家鄉屬性

home:

  province: 浙江省

  city: 溫嶺鬆門

  desc: 我家住在${home.province}的${home.city}

鍵值對冒號後面,必須空一格。

 

注意這裡,就有一個坑了:

application.properties 配置中文值的時候,讀取出來的屬性值會出現亂碼問題。但是 application.yml 不會出現亂碼問題。原因是,Spring Boot 是以 iso-8859 的編碼方式讀取 application.properties 配置檔案。

 

注意這裡,還有一個坑:

如果定義一個鍵值對 user.name=xxx ,這裡會讀取不到對應寫的屬性值。為什麼呢?Spring Boot 的預設 StandardEnvironment 首先將會載入 “systemEnvironment" 作為首個PropertySource. 而 source 即為System.getProperties().當 getProperty時,按照讀取順序,返回 “systemEnvironment" 的值.即 System.getProperty("user.name")

(Mac 機子會讀自己的登入賬號,這裡感謝我的死黨 http://rapharino.com/

三、random.* 屬性

Spring Boot 通過 RandomValuePropertySource 提供了很多關於隨機數的工具類。概括可以生成隨機字串、隨機 int 、隨機 long、某範圍的隨機數。

執行 springboot-properties 工程 org.spring.springboot.property.PropertiesTest 測試類的 randomTestUser 方法。多次執行,可以發現每次輸出不同 User 屬性值:

三、random.* 屬性

Spring Boot 通過 RandomValuePropertySource 提供了很多關於隨機數的工具類。概括可以生成隨機字串、隨機 int 、隨機 long、某範圍的隨機數。

執行 springboot-properties 工程 org.spring.springboot.property.PropertiesTest 測試類的 randomTestUser 方法。多次執行,可以發現每次輸出不同 User 屬性值:

1

UserProperties{id=-3135706105861091890, age=41, desc='泥瓦匠叫做3cf8fb2507f64e361f62700bcbd17770', uuid='582bcc01-bb7f-41db-94d5-c22aae186cb4'}

 

application.yml 方式的配置如下( application.properties 形式這裡不寫了):

1

2

3

4

5

6

## 隨機屬性

user:

  id: ${random.long}

  age: ${random.int[1,200]}

  desc: 泥瓦匠叫做${random.value}

  uuid: ${random.uuid}

四、多環境配置

很多場景的配置,比如資料庫配置、Redis 配置、註冊中心和日誌配置等。在不同的環境,我們需要不同的包去執行專案。所以看專案結構,有兩個環境的配置:

1

2

application-dev.properties:開發環境

application-prod.properties:生產環境

 

Spring Boot 是通過 application.properties 檔案中,設定 spring.profiles.active 屬性,比如 ,配置了 dev ,則載入的是 application-dev.properties :

1

2

# Spring Profiles Active

spring.profiles.active=dev

 

那執行 springboot-properties 工程中 Application 應用啟動類,從控制檯中可以看出,是載入了 application-dev.properties 的屬性輸出:

1

HomeProperties{province='ZheJiang', city='WenLing', desc='dev: I'm living in ZheJiang WenLing.'}

 

將 spring.profiles.active 設定成 prod,重新執行,可得到 application-prod.properties的屬性輸出:

1

HomeProperties{province='ZheJiang', city='WenLing', desc='prod: I'm living in ZheJiang WenLing.'}

 

根據優先順序,順便介紹下 jar 執行的方式,通過設定 -Dspring.profiles.active=prod 去指定相應的配置:

1

2

mvn package

java -jar -Dspring.profiles.active=prod springboot-properties-0.0.1-SNAPSHOT.jar

五、小結

常用的樣板配置在 Spring Boot 官方文件給出,我們常在 application.properties(或 yml)去配置各種常用配置:

http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

 

 

application.yml 方式的配置如下( application.properties 形式這裡不寫了):

1

2

3

4

5

6

## 隨機屬性

user:

  id: ${random.long}

  age: ${random.int[1,200]}

  desc: 泥瓦匠叫做${random.value}

  uuid: ${random.uuid}

 

 

 

@ResponseBody 註解標識該方法的返回值。這樣被標註的方法返回值,會直接寫入 HTTP 響應體(而不會被檢視解析器認為是一個檢視物件)。