簡單說, Thymeleaf 是一個跟 Velocity、FreeMarker 類似的模板引擎,它可以完全替代 JSP 。相較與其他的模板引擎,它有如下三個極吸引人的特點:
1.Thymeleaf 在有網絡和無網絡的環境下皆可運行,即它可以讓美工在瀏覽器查看頁面的靜態效果,也可以讓程序員在服務器查看帶數據的動態頁面效果。這是由于它支持 html 原型,然后在 html 標簽里增加額外的屬性來達到模板+數據的展示方式。瀏覽器解釋 html 時會忽略未定義的標簽屬性,所以 thymeleaf 的模板可以靜態地運行;當有數據返回到頁面時,Thymeleaf 標簽會動態地替換掉靜態內容,使頁面動態顯示。
2.Thymeleaf 開箱即用的特性。它提供標準和spring標準兩種方言,可以直接套用模板實現JSTL、 OGNL表達式效果,避免每天套模板、該jstl、改標簽的困擾。同時開發人員也可以擴展和創建自定義的方言。
3.Thymeleaf 提供spring標準方言和一個與 SpringMVC 完美集成的可選模塊,可以快速的實現表單綁定、屬性編輯器、國際化等功能。
form方式上傳:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
//html: <form enctype= "multipart/form-data" method= "post" action= "/sell/imageUpload" > <div class = "modal-header" > <button type= "button" class = "close" data-dismiss= "modal" aria-hidden= "true" > </button> <h4 class = "modal-title" id= "myModalLabel" >Edit goods information</h4> </div> <div class = "modal-body" > <div class = "input-group" > <label class = "col-lg-4" >name:</label> <input class = "col-lg-8" id= "edit_name" value= "${goods.name}" name= "name" /> </div> <div class = "input-group" > <label class = "col-lg-4" >code:</label> <input class = "col-lg-8" id= "edit_sn" name= "sn" value= "${goods.sn}" /> </div> <div class = "input-group" > <label class = "col-lg-4" >weight:</label> <input class = "col-lg-8" id= "edit_weight" name= "weight" value= "${goods.weight}" /> </div> <div class = "input-group" > <label class = "col-lg-4" >marketPrice:</label> <input class = "col-lg-8" id= "edit_marketPrice" name= "marketPrice" value= "${goods.marketPrice}" /> </div> <div class = "input-group" > <label class = "col-lg-4" >shopPrice:</label> <input class = "col-lg-8" id= "edit_shopPrice" name= "shopPrice" value= "${goods.shopPrice}" /> </div> <div class = "input-group" > <label class = "col-lg-4" >unit:</label> <input class = "col-lg-8" id= "edit_unit" name= "unit" value= "${goods.unit}" /> </div> <div class = "input-group" > <label class = "col-lg-4" >number:</label> <input class = "col-lg-8" id= "edit_number" name= "number" value= "${goods.number}" /> </div> <div class = "input-group" > <label class = "col-lg-4" >detail:</label> <textarea class = "col-lg-8" id= "edit_detail" name= "detail" value= "${goods.detail}" /> </div> <div class = "input-group" > <!--<form enctype= "multipart/form-data" method= "post" action= "/sell/imageUpload" > <input ype= "hidden" id= "edit_goods_sn" name= "sn" value= "${goods.sn}" />--> image<input type= "file" id= "edit_image" name= "file" /> <input type= "submit" value= "upload" /> <!--</form>--> </div> </div> <div class = "modal-footer" > <button type= "button" class = "btn btn-default" data-dismiss= "modal" >close</button> <input type= "submit" class = "btn btn-primary" id= "edit_save" value= "submit" >提交更改</input> </div> </form> //controller @RequestMapping (value = "/save" ,method = RequestMethod.POST) public String saveGoodsPage( @RequestParam (value = "id" ,required= false ) String id, @RequestParam (value = "name" ,required= false ) String name, @RequestParam (value = "sn" ,required= false ) String sn, @RequestParam (value = "number" ,required= false ) String number, @RequestParam (value = "weight" ,required= false ) String weight, @RequestParam (value = "marketPrice" ,required= false ) String marketPrice, @RequestParam (value = "shopPrice" ,required= false ) String shopPrice, @RequestParam (value = "unit" ,required= false ) String unit, @RequestParam (value = "detail" ,required= false ) String detail, @RequestParam (value= "file" )MultipartFile file ) { if (!file.isEmpty()) { try { BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream( new File( "src/main/resources/static/images/product/" + sn + ".jpg" ))); //保存圖片到目錄下 out.write(file.getBytes()); out.flush(); out.close(); String filename = "\\/images\\/product\\/" + sn + ".jpg" ; /*user.setTupian(filename); //userRepository.save(user);//增加用戶*/ } catch (FileNotFoundException e) { e.printStackTrace(); return "upload error," + e.getMessage(); } catch (IOException e) { e.printStackTrace(); return "upload error" + e.getMessage(); } } //...其他操作 } |
補充:變量表達式和星號表達有什么區別嗎?
如果不考慮上下文的情況下,兩者沒有區別;星號語法評估在選定對象上表達,而不是整個上下文什么是選定對象?就是父標簽的值,如下:
1
2
3
4
5
|
<div th:object= "${session.user}" > <p>Name: <span th:text= "*{firstName}" >Sebastian</span>.</p> <p>Surname: <span th:text= "*{lastName}" >Pepper</span>.</p> <p>Nationality: <span th:text= "*{nationality}" >Saturn</span>.</p> </div> |
這是完全等價于:
1
2
3
4
5
|
<div th:object= "${session.user}" > <p>Name: <span th:text= "${session.user.firstName}" >Sebastian</span>.</p> <p>Surname: <span th:text= "${session.user.lastName}" >Pepper</span>.</p> <p>Nationality: <span th:text= "${session.user.nationality}" >Saturn</span>.</p> </div> |
當然,美元符號和星號語法可以混合使用:
1
2
3
4
5
|
<div th:object= "${session.user}" > <p>Name: <span th:text= "*{firstName}" >Sebastian</span>.</p> <p>Surname: <span th:text= "${session.user.lastName}" >Pepper</span>.</p> <p>Nationality: <span th:text= "*{nationality}" >Saturn</span>.</p> </div> |
總結
以上所述是小編給大家介紹的spring boot thymeleaf 圖片上傳web項目根目錄操作步驟,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:https://blog.csdn.net/fengcai0123/article/details/79693562