從.Net到Java學習第六篇——SpringBoot+mongodb&Thymeleaf&模型驗證
SpringBoot整合mongodb
MongoDB 是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。
如果你沒用過MongoDB,可以先去看下我的文章:https://www.cnblogs.com/jiekzou/category/851166.html
接上一篇,修改pom.xml,新增mongodb的依賴
<!--mongodb--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
新增mongodb資料庫連線,修改application.yml
spring:
profiles:
active: dev
# mongodb
data:
mongodb:
database: test
port: 27017
host: 192.168.1.18
修改原來的Person實體類
public class Person { @Id private Long id; public Long getId() { returnid; } public void setId(Long id) { this.id = id; } private String name; private String sex; public Person() { } public Person(Long id,String name, String sex) { this.id=id; this.name = name; this.sex = sex; }public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }
新建包repository,然後在包下建立一個數據操作層介面PersonRepository,繼承MongoRepository,程式碼如下:
public interface PersonRepository extends MongoRepository<Person,Long> { }
建立一個controller類PersonController進行增刪改查測試
@RestController public class PersonController { @Autowired private PersonRepository userRepository; @GetMapping("save") public String save() { Person userInfo = new Person(System.currentTimeMillis(),"李尋歡","男"); userRepository.save(userInfo); return "success"; } @GetMapping("getUserList") public List<Person> getUserList() { List<Person> userInfoList = userRepository.findAll(); return userInfoList; } @GetMapping("delete") public String delete(Long id) { userRepository.delete(id); return "success"; } @GetMapping("update") public String update(Long id, String username, String password) { Person userInfo = new Person(id, username, password); userRepository.save(userInfo); return "success"; } }
訪問http://localhost:8083/boot/save,刷幾遍,新增幾條資料
然後再訪問http://localhost:8083/boot/getUserList檢視資料
當然,我們也可以使用視覺化的mongodb管理工具去檢視,這裡我使用的是robo3t
在配置了mysql、mongodb等資料庫連線之後我們發現,基本上我們都離不開如下幾個步驟:
- 加入對應依賴
- 配置檔案配置對應資料庫資訊
- 資料操作層繼承想要的repository
SpringBoot引用Thymeleaf
Thymeleaf就是一個模板引擎和.net的razor一樣。Spring boot 推薦用來代替jsp。
Thymeleaf的優點
- Thymeleaf 在有網路和無網路的環境下皆可執行,即它可以讓美工在瀏覽器檢視頁面的靜態效果,也可以讓程式設計師在伺服器檢視帶資料的動態頁面效果。(當有資料返回到頁面時,Thymeleaf 標籤會動態地替換掉靜態內容,使頁面動態顯示。)
- Thymeleaf 開箱即用的特性。(它提供標準和spring標準兩種方言,可以直接套用模板實現JSTL、 OGNL表示式效果。)
- Thymeleaf 提供spring標準方言和一個與 SpringMVC 完美整合的可選模組,可以快速的實現表單繫結、屬性編輯器、國際化等功能。
另外,Thymeleaf是一個XML/XHTML/HTML5模板引擎,可用於Web與非Web環境中的應用開發。它是一個開源的Java庫,基於Apache License 2.0許可,由Daniel Fernández建立,該作者還是Java加密庫Jasypt的作者。
由於Thymeleaf使用了XML DOM解析器,因此它並不適合於處理大規模的XML檔案。也就是說它的效能是有一定問題的,如果檔案較大的情況下。
SpringBoot引用Thymeleaf依賴
修改pom.xml,新增如下依賴
<!--thymeleaf--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
這裡有個坑,預設情況下hymeleaf中所有的標籤都必須成對出現,否則IDEA執行時就會報錯:" 必須由匹配的結束標記終止..“。
據說spring boot 2.0已結修復了這個標籤的問題,但是我這裡目前用的版本是低於2.0的,所以需要額外處理。
繼續新增依賴
<dependency> <groupId>net.sourceforge.nekohtml</groupId> <artifactId>nekohtml</artifactId> <version>1.9.22</version> </dependency>
然後修改application.yml中的配置,
spring:
profiles:
active: dev
thymeleaf:
mode: LEGACYHTML5
新建一個控制器類來做測試,AreaPageController,
@Controller public class AreaPageController{ @Autowired private AreaService areaService; @GetMapping("/addArea") public String addArea(Model model) { model.addAttribute("area", new Area()); return "addArea"; } @RequestMapping(value = "/addArea",method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"}) public String addArea(@Valid @ModelAttribute Area area, BindingResult bindingResult){ if (bindingResult.hasErrors()) { return "addArea"; }else{ Map<String,Object> modelMap= new HashMap<String,Object>() ; modelMap.put("success",areaService.addArea(area)); return "result"; } } }
修改之前的Area實體類,這東西就跟.net mvc 裡面的模型驗證一樣
package com.yujie.model; import org.hibernate.validator.constraints.NotEmpty; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import java.util.Date; public class Area { private Integer areaId; @NotEmpty @Size(min=2, max=30) private String areaName; @NotNull @Min(1) @Max(200) private Integer priority; private Date createTime; private Date lastEditTime;
...... }
templates目錄是存放html檔案的,在templates目錄下面新建一個html檔案addArea.html,這個就相當於.net mvc中的razor檢視。
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"><!--引入thymeleaf--> <head> <meta charset="UTF-8" /> <title>新增區域</title></head> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> <body> <h2 style="color:green;text-align: center;">新增區域</h2> <form class="form-horizontal" role="form" action="#" th:action="@{/addArea}" th:object="${area}" method="post"> <div class="form-group"><label for="name" class="col-sm-2 control-label">區域名稱:</label> <div class="col-sm-8"><input type="text" th:field="*{areaName}" class="form-control" id="areaName" placeholder="輸入區域名稱"></div> <label class="col-sm-2" style="color:red" th:if="${#fields.hasErrors('areaName')}" th:errors="*{areaName}">區域名稱錯誤</label></div> <div class="form-group"><label for="priority" class="col-sm-2 control-label">優先順序</label> <div class="col-sm-8"><input type="text" th:field="*{priority}" class="form-control" id="priority" placeholder="輸入優先順序"></div> <label class="col-sm-2" style="color:red" th:if="${#fields.hasErrors('priority')}" th:errors="*{priority}">優先順序錯誤</label></div> <div class="form-group"> <div class="col-sm-12" style="text-align: center"> <button type="submit" class="btn btn-primary" id="btn">Submit</button> <input type="reset" class="btn btn-warning" value="Reset"/></div> </div> </form> </body> </html>
執行結果如下: