您当前的位置: 首页 > 

【精品】Thymeleaf 语法基础

梁云亮 发布时间:2020-05-28 02:52:04 ,浏览量:2

简介

Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎,类似JSP,Velocity,FreeMaker等,它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。

Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用,但是总是看到说其效率有点低。

Thymeleaf 在有网络和无网络的环境下皆都可以运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。

浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。

Thymeleaf 开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、改jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。

引入 Thymeleaf

修改 html 标签用于引入 thymeleaf 引擎,这样才可以在各html标签里使用 th:* 语法。


常用th属性 属性功能th:text普通字符串th:utext转义文本th:href链接th:attr设置元素属性,多个属性可以用逗号分隔 th:with定义常量th:attrappend追加属性th:classappend追加类样式th:styleappend追加样式th:value:属性赋值th:each:遍历循环元素th:if:判断条件,类似的还有th:unless,th:switch,th:caseth:insert:代码块引入,类似的还有th:replace,th:include,常用于公共代码块提取的场景th:fragment:定义代码块,方便被th:insert引用th:object:声明变量,一般和*{}一起配合使用,达到偷懒的效果。th:attr:设置标签属性,多个属性可以用逗号分隔 条件 if

标签只有在 th:if 中条件成立时才显示:

view

示例:

DOCTYPE html>

    
        
        修改用户
    
    
        修改用户
        
            
            账户:
            昵称:
            
            性别:男
                女
            
            
        
    

unless

th:unlessth:if 恰好相反,只有表达式中的条件不成立,才会显示其内容。

view
switch

Thymeleaf 同样支持多路选择 Switch 结构:


    User is an administrator 
    User is a manager


默认属性 default 可以用 \* 表示:

    User is an administrator 
    User is a manager 
    User is some other thing

循环

渲染列表数据是一种非常常见的场景,例如现在有 n 条记录需要渲染成一个表格,该数据集合必须是可以遍历的,使用 th:each 标签。

  • 示例一

    Onions
    2.41
    yes


 
    
        NAME
        PRICE
        IN STOCK
    
    
    Onions
    2.41
    yes
  

迭代器的状态:

  • index:当前的索引,从0开始

  • count:当前的索引,从1开始

  • size:总数

  • current:当前迭代变量

  • even/odd:布尔值,当前循环是否是偶数/奇数(从0开始计算)

  • first:布尔值,当前循环是否是第一个

  • last:布尔值,当前循环是否是最后一个

  • 示例二

  
    
      NAME
      PRICE
      IN STOCK
    
    
      Onions
      2.41
      yes
    
  
  
    Return to home
  

可以看到,需要在被循环渲染的元素(这里是)中加入 th:each 标签,其中 th:each="prod : ${prods}" 意味着对集合变量 prods 进行遍历,循环变量是 prod 在循环体中可以通过表达式访问。

综合示例
  • 后台代码
@GetMapping("fun3")
public ModelAndView fun3(ModelAndView mav){
    mav.addObject("thText", "th:text 设置文本内容 加粗");
    mav.addObject("thUText", "th:utext 设置文本内容 加粗");
    mav.addObject("thValue", "thValue 设置当前元素的value值");
    mav.addObject("thEach", Arrays.asList("张三", "李四","王二","麻子"));
    mav.addObject("thIf", "msg is not null");
    mav.addObject("thObject", new Dept(10,"sales","CHICAGO"));

    mav.setViewName("index");
    return mav;
}
  • 前端代码


    
    Thymeleaf 语法










 
    

 
     







     -
     -
    



  • 效果 在这里插入图片描述
标准表达式语法: 表达式功能${…}变量表达式,Variable Expressions@{…}链接表达式,Link URL Expressions#{…}消息表达式,Message Expressions~{…}代码块表达式,Fragment Expressions*{…}选择变量表达式,Selection Variable Expressions ${…} 变量表达式

变量表达式功能:

  • 可以获取对象的属性和方法
  • 可以使用ctx,vars,locale,request,response,session,servletContext内置对象
  • 可以使用dates,numbers,strings,objects,arrays,lists,sets,maps等内置方法

示例:

name

获取变量值用 $ 符号,对于javaBean的话使用 变量名.属性名 方式获取,这点和 EL 表达式一样。 $ 表达式只能写在th标签内部,不然不会生效。上面例子就是使用 th:text 标签的值替换 p 标签里面的值,至于 p 里面的原有的值只是为了给前端开发时做展示用的,这样的话很好的做到了前后端分离.

@{…} 链接表达式

链接表达式好处:不管是静态资源的引用,form表单的请求,凡是链接都可以用@{…} 。这样可以动态获取项目路径,即便项目名变了,链接表达式会自动修改路径,依然可以正常访问

链接表达式结构:

  • 无参:@{/xxx}
  • 有参:@{/xxx(k1=v1,k2=v2)} 对应url结构:xxx?k1=v1&k2=v2

引入资源:

  • 引入本地资源:@{/项目本地的资源路径}
  • 引入外部资源:@{/webjars/资源在jar包中的路径}

示例:







绝对路径
相对路径
Content路径,默认访问static下的css文件夹

中文
English

类似的标签有:th:hrefth:src

#{…} 消息表达式

消息表达式一般用于国际化的场景。

~{…} 代码块表达式

代码块表达式需要配合th属性(th:insert,th:replace,th:include)一起使用:

  • th:insert:将代码块片段整个插入到使用了th:insert的HTML标签中
  • th:replace:将代码块片段整个替换使用了th:replace的HTML标签中
  • th:include:将代码块片段包含的内容插入到使用了th:include的HTML标签中

代码块表达式支持两种语法结构:

  • 支持:~{templatename::#id}
  • 推荐:~{templatename::fragmentname} 其中:
  • templatename:模版名,Thymeleaf会根据模版名解析完整路径:/resources/templates/templatename.html,要注意文件的路径。
  • fragmentname:片段名,Thymeleaf通过th:fragment声明定义代码块,即:th:fragment=“fragmentname”
  • id:HTML的id选择器,使用时要在前面加上#号,不支持class选择器。
常用内置环境相关对象 内置对象说明ctx上下文对象。vars上下文变量。locale上下文的语言环境。request(仅在web上下文)的 HttpServletRequest 对象。response(仅在web上下文)的 HttpServletResponse 对象。session(仅在web上下文)的 HttpSession 对象。servletContext(仅在web上下文)的 ServletContext 对象param获取请求参数,比如 ${param.name}, http://localhost:8080?name=jeffapplication获取 application 的属性execInfo有两个属性 templateName 和 now (是 java 的 Calendar 对象) 常用内置全局对象 内置方法说明strings字符串格式化方法,常用的Java方法它都有。比如 equals,equalsIgnoreCase,length,trim,toUpperCase,toLowerCase,indexOf,substring,replace,startsWith,endsWith,contains,containsIgnoreCase等numbers数值格式化方法,常用的方法有 formatDecimal等bools布尔方法,常用的方法有 isTrue,isFalse等arrays数组方法,常用的方法有 toArray,length,isEmpty,contains,containsAll等lists/sets集合方法,用来处理List/sets集合的方法。常用的方法有 toList,size,isEmpty,contains,containsAll,sort等maps对象方法,用来处理map集合的方法。常用的方法有 size,isEmpty,containsKey,containsValue等calendars处理java.util.calendar的工具对象dates日期方法,处理java.util.date的工具对象。常用的方法有 format,year,month,hour,createNow等

示例

  • 后台代码
@RequestMapping("demo3")
public String demo3(ModelMap modelMap) {
    modelMap.put("itStr", "HelloWorld");
    modelMap.put("itNum", 888.888D);
    modelMap.put("itBool", true);
    modelMap.put("itArray", new Integer[]{1,2,3,4});
    modelMap.put("itList", Arrays.asList(1,3,2,4,0));
    Map itMap = new HashMap();
    itMap.put("thName", "${#...}");
    itMap.put("desc", "变量表达式内置方法");
    modelMap.put("itMap", itMap);
    modelMap.put("itDate", new Date());
    return "demo3";
}
  • 前面代码
DOCTYPE html>

    
        
        IT Thymeleaf 内置方法
    
    
        #strings 
        
            Old Str : 
            toUpperCase : 
            toLowerCase : 
            equals : 
            equalsIgnoreCase : 
            indexOf : 
            substring : 
            replace : 
            startsWith : 
            contains : 
        
        #numbers 
        
            formatDecimal 整数部分随意,小数点后保留两位,四舍五入: 
            formatDecimal 整数部分保留五位数,小数点后保留两位,四舍五入: 
        
        #bools 
        
            
        
        #arrays 
        
            length : 
            contains : 
            containsAll : 
        
        #lists 
        
            size : 
            contains : 
            sort : 
        
        #maps 
        
            size : 
            containsKey : 
            containsValue : 
        
        #dates 
        
            format : 
            custom format : 
            day : 
            month : 
            monthName : 
            year : 
            dayOfWeekName : 
            hour : 
            minute : 
            second : 
            createNow : 
        
    

  • 结果: 在这里插入图片描述 在这里插入图片描述
其他示例 字符串替换

很多时候可能我们只需要对一大段文字中的某一处地方进行替换,可以通过字符串拼接操作完成:


简洁方式:


当然这种形式限制比较多,|…|中只能包含变量表达式${…},不能包含其他常量、条件表达式等。

运算符

在表达式中可以使用各类算术运算符,例如+, -, *, /, %

th:with="isEven=(${prodStat.count} % 2 == 0)"

逻辑运算符>, ">> 1" th:text="'Execution mode is ' + ( (${execMode} == 'dev')? 'Development' : 'Production')" th:block


    
    
        ... 
        ...
    
    
        ... 
    
    

推荐下面写法(编译前看不见)


    
        ...
        ... 
        
        ...
    

关注
打赏
1688896170
查看更多评论

梁云亮

暂无认证

  • 2浏览

    0关注

    1121博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0531s