使用 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.controller
與 cc.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 頁面。