View 的設置


使用 Spring Boot,雖然可以享有許多便利,然而隨之而來的,就是得知道如何照它那套來進行設定,而另一方面,Spring 框架本身又有哪些該設定的,如果你能搞清楚,那會很開心,若沒搞清楚,那就很麻煩!

久了沒搞,記得回頭看看〈Reference Doc〉,整理出自己常用的設定,當然是更好!

無論如何,先從簡單的開始,在 toy 中有個專案,這是使用 Spring Tool Suite 建立,並相依了 Web 與 Thymeleaf 兩個 Starter,你也可以自行使用 Spring Tool Suite 建立,總之,我們從這個專案開始。

Spring Boot 預設使用 Thymeleaf 模版,而且預設會啟用模版快取,若開發時會修改模版,並希望能看到模版的即時變化,可以將快取關掉,這可以在 src/main/resources/application.properties 中設定:

spring.thymeleaf.cache=false

在 Spring 中有許多的預設值,都可以在 application.properties 中更改,可設定的項目有好幾百條,可在〈Reference Doc〉中查詢,附錄中有個〈Common application properties〉可略看一下。

Spring Boot 的 Thymeleaf 模版設定,都會有個 spring.thymeleaf 作為前置。

若有設定 Profile,無論哪一種 Profile,Spring 都會載入 application.properties 的設定,再來是 application-profileName.properties,profileName 是指定的 Profile 名稱,如果 application-profileName.properties 有同名屬性設定,會覆蓋 application.properties 的設定。

接下來會寫個簡單的控制器以及模型,它們會放在 cc.openhome.controllercc.openhome.model 套件中,為此,你可在 @SpringBootApplication 設定要掃描的套件:

package cc.openhome.toy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(
    scanBasePackages={
        "cc.openhome.controller",
        "cc.openhome.model"
    }
)
public class ToyApplication {

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

控制器很簡單:

package cc.openhome.controller;

...略

@Controller
public class DisplayController {
    @Autowired
    private UserService userService;

    @GetMapping("/user/{name}")
    public String user(
        @PathVariable("name") String name,
        Model model) {
            List<Message> messages = userService.messagesBy(name);
            model.addAttribute("username", name);
            model.addAttribute("messages", messages);
        return "user";
    }
}

user 方法傳回了 "user",因此你要有個 user.html,這是 Spring Boot 預設的副檔名(可以透過 spring.thymeleaf.suffix 修改),放在 src/main/resources/templates 之中,這是預設的模版存放資料夾(可以透過 spring.thymeleaf.prefix 修改)。

至於 user.html 檔案,就直接從〈套用 jdbcAuthentication〉的成果 gossip 借來用就可以了。

user.html 可以放在 src/main/resources/templates 之中,然而搭配的 css 與 images 目錄,不是放在 src/main/resources/templates 之中,這屬於靜態資源,Spring Boot 預設可以放靜態資源的位置之一是 src/main/resources/static 資料夾,你可以在〈Reference Doc〉搜尋 spring.resources.static-locations,看看還有哪些位置可以存放靜態資源。

接著只要寫兩個簡單的模型就可以了,Message 只是個簡單的值物件:

package cc.openhome.model;

import java.time.*;

public class Message {
    private String username;
    private Long millis;
    private String blabla;

    public Message(String username, Long millis, String blabla) {
        this.username = username;
        this.millis = millis;
        this.blabla = blabla;
    }

    ... Getters 與 Setters ... 略
}

UserService 目前也很簡單:

package cc.openhome.model;

import java.util.List;
import java.util.Arrays;
import org.springframework.stereotype.Component;

@Component
public class UserService {
    public List<Message> messagesBy(String name) {
        return Arrays.asList(
            new Message(name, 1516842964223L, "我是一隻弱小的毛毛蟲,想像有天可以成為強壯的挖土機,擁有挖掘夢想的神奇手套。。。XD"),
            new Message(name, 1516844514031L, "碁峰把《Java SE 9 技術手冊》電子書放上去囉!"), 
            new Message(name, 1516844548728L, "JavaScript 名稱空間管理 https://openhome.cc/Gossip/ECMAScript/NameSpace.html")
        ); 
    }
}

接著就可以啟動專案,使用瀏覽器請求一下 http://localhost:8080/user/caterpillar,看看成果,你可以在 toy 中找到以上的專案。

嗯?懷念 JSP 嗎?如果想在 Spring Boot 中使用 JSP 的話呢?這會需要能轉譯、編譯、載入 JSP 頁面的工具,因此必須在 build.gradle 中加入一些設定:

compile('org.apache.tomcat.embed:tomcat-embed-jasper:9.0.5')
compile('jstl:jstl:1.2') // 如果你需要 JSTL 的話

接著在 application.properties 中設定 JSP 頁面的前置、後置字串:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

然後必須在 src 資料夾底下建立 webapp/WEB-INF/jsp 資料夾,在當中寫你的 JSP 頁面。