• SpringBoot-thymeleaf模板集成


    https://saas.51cto.com/learner.html#/topic/detail?id=1348233985432469504

    https://saas.51cto.com/learner.html#/   手机企业yw-syw51saascto.com/

    https://www.cnblogs.com/xinxihua/p/14552132.html 前端05vscode+Vue 引入 ECharts

    https://www.cnblogs.com/xinxihua/p/14552105.html 前端04测试一个的项目

    https://www.cnblogs.com/xinxihua/p/14551901.html 前端3vue+mysql连接实例

    https://www.cnblogs.com/xinxihua/p/14551802.html 前端01前端模块化IIFE,commonjs,AMD,UMD,ES6 Module规范超详细讲解

    https://www.cnblogs.com/xinxihua/p/14551691.html 前端02vue+vscode+nodejs webpack开发环境搭建

    https://www.cnblogs.com/xiayizhan/p/8707127.html    SpringBoot-thymeleaf模板集成

    https://git-scm.com/download/gui/windows
    https://desktop.github.com/
    VSCode-SpringBoot与ECharts前后端分离图表绘制+Vue.js图片懒加载路径二次刷新过程演示
    https://www.bilibili.com/video/av458169809/
    VSCode-SpringBoot与ECharts前后端分离图表绘制+Vue.js图片懒加载路径二次刷新过程演示

    SpringBoot-thymeleaf模板集成

    https://github.com/BraveWangDev/SpringBoot
    https://github.com/BraveWangDev/SpringBoot

    SpringBoot,SpringData 接下来要写SpringSecurity安全控制(权限管理)了.
    SpringSecurity要涉及登陆页面,首页等页面跳转,故先说一下SpringBoot推荐模板thymeleaf的集成
    这部分简单的说一下集成,和语法,以免SpringSecurityDemo中出现thymeleaf不好理解
    本节代码根据SpringBoot初始化项目 : Maven构建SpringBoot项目 为基础
    1,pom.xml添加thymeleaf依赖
    <dependencies>
       <!-- 核心模块,包括自动配置支持、日志和YAML -->
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter</artifactId>
       </dependency>
       <!-- 测试模块,包括JUnit、Hamcrest、Mockito -->
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
       </dependency>

       <!-- 引入Web模块 -->
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
       </dependency>

       <!-- thymeleaf模板引擎 -->
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-thymeleaf</artifactId>
       </dependency>

    </dependencies>

    2,工程目录结构
    resources/templates为thymeleaf模板默认路径,当然也可以自定义路径
    java/com.example/web/HelloController.java为Controller类,控制地址跳转到hello.html
    application.properties-thymeleaf模板配置项
    ########################################################
    ###THYMELEAF (ThymeleafAutoConfiguration)
    ########################################################
    ## 前缀prefix
    #spring.thymeleaf.prefix=classpath:templates/
    ## 后缀suffix
    #spring.thymeleaf.suffix=.html
    ## 类型mode
    #spring.thymeleaf.mode=HTML5
    ## charset=<encoding> is added
    #spring.thymeleaf.encoding=UTF-8
    ##content-type
    #spring.thymeleaf.content-type=text/html
    # set to false for hot refresh
    #spring.thymeleaf.cache=false

    一般情况下,不需要进行配置,使用SpringBoot默认配置即可

    主要说一下spring.thymeleaf.cache这个配置项
    由于浏览器会有页面缓存,在开发过程中,建议开发者不启用cache

    4,Controller
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    //import org.springframework.web.bind.annotation.RestController;

    /**
     * Created by Brave on 16/10/9. *
     * 注意:
     *      这里要使用@Controller注解
     *      而不要使用@RestController
     *      否则return "hello";不能跳转到hello.html
     */
    @Controller
    public class HelloController {

        @ResponseBody
        @RequestMapping("/hello")
        public String hello() {
            return "Hello World";
        }

        @RequestMapping("/")
        public String index(ModelMap map) {
            map.addAttribute("hello", "hello Thymeleaf!");
            return "hello";
        }

    }
    这里需要注意一个问题,可能会影响到页面的正常跳转

    如果遇到后边不能正常跳转到hello.html页面,请查看 : @Controller和@RestController的区别

    5,hello.html
    在thymeleaf模板目录下创建hello.html

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
        <head>
            <title>Hello World!</title>
        </head>
        <body>
            <h1 th:inline="text">thymeleaf Test</h1>
            <p th:text="${hello}"></p>
        </body>
    </html>
    关于模板中的

    等语法,我们会在下节简单列出作为开发中的参考
    目前只要理解这是一个传值操作就可以了 ^_^
    6,测试项目
    启动服务,浏览器访问http://localhost:8080/

    如图,可以看到正常跳转hello.html并携带参数显示

    至此SpringBoot-thymeleaf模板集成完成

    7,代码下载
      CSDN下载
      
      GitHub下载
    ————————————————
    版权声明:本文为CSDN博主「BraveWangDev」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ABAP_Brave/article/details/53005794


    thymeleaf模板语法 SpringSecurity用到的语法
    关于SpringBoot-thymeleaf模板集成,请跳转 : SpringBoot-thymeleaf模板集成
    ________________________________________
    先说句有用的废话:
    thymeleaf模板语法,都以th属性开头,如:
    <span th:text="...">
    ________________________________________
    一,thymeleaf-简单表达式
    1.变量表达式
    2.选择或星号表达式
    3.文字国际化表达式
    4.URL表达式
    1,变量表达式
    Thymeleaf模板引擎在进行模板渲染时,还会附带一个Context存放进行模板渲染的变量,在模板中定义的表达式本质上就是从Context中获取对应的变量的值
    <p>Today is: <span th:text="${day}">2 November 2016</span>.</p>
    假设day的值为2016年11月2日,那么渲染结果为:<p>Today is: 2016年11月2日.</p>。
    注意 : 渲染后,模板中span值2 November 2016将被覆盖
    2,选择(星号)表达式
    可以简单理解为内层是对外层对象的引用
    <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>
    等同于以下方式:
    <div>
      <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>
    也可以混用,如下:
    <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>
    如何没有与th:object结合使用,*{}与${}效果一样,因为其范围自动扩展到context。
    3,URL表达式
    URL表达式指的是把一个有用的上下文或会话信息添加到URL,这个过程经常被叫做URL重写。
    Thymeleaf对于URL的处理是通过语法@{…}来处理的
    <!— 绝对路径 —>
    <!-- Will produce 'http://localhost:8080/gtvg/order/details?orderId=3' (plus rewriting) -->
    <a href="details.html" th:href="@{http://localhost:8080/gtvg/order/details(orderId=${o.id})}">view</a>

    <!— 相对路径 带参数—>
    <!-- Will produce '/gtvg/order/details?orderId=3' (plus rewriting) -->
    <a href="details.html" th:href="@{/order/details(orderId=${o.id})}">view</a>

    <!-- Will produce '/gtvg/order/3/details' (plus rewriting) -->
    <a href="details.html" th:href="@{/order/{orderId}/details(orderId=${o.id})}">view</a>
    Thymeleaf支持相对路径和绝对路径
    (orderId=${o.id})表示将括号内的内容作为URL参数处理
    @{...}表达式中可以通过{orderId}访问Context中的orderId变量
    @{/order}是Context相关的相对路径,在渲染时会自动添加上当前Web应用的Context名字,假设context名字为app,那么结果应该是/app/order
    4,文字国际化表达式
    文字国际化表达式允许我们从一个外部文件获取区域文字信息(.properties)
    使用Key-Value方式,还可以提供一组参数(可选).
    .properties
    #{main.title}
    #{message.entrycreated(${entryId})}
    模板引用:
    <table>
        <th th:text="#{header.address.city}">...</th>
        <th th:text="#{header.address.country}">...</th>
    </table>
    ________________________________________
    二.thymeleaf-字面值
      1.文本文字:’one text’, ‘Another one!’,…
      2.文字数量:0, 34, 3.0, 12.3,…
      3.布尔型常量:true, false
      4.空的文字:null
      5.文字标记:one, sometext, main,…
      
    ________________________________________
    三:thymeleaf-文本处理
    1.字符串拼接:+
    <span th:text="'Welcome to our application, ' + ${user.name} + '!'">
    2.文字替换:|The name is ${name}|
    <span th:text="|Welcome to our application, ${user.name}!|">
    相比以上两种方式都可以实现字符串合并,但是,|…|中只能包含变量表达式${…},不能包含其他常量、条件表达式等。
    ________________________________________
    四.表达基本对象
      1.#ctx:上下文对象
      2.#vars:上下文变量
      3.#locale:上下文语言环境
      4.#httpServletRequest:(只有在Web上下文)HttpServletRequest对象
      5.#httpSession:(只有在Web上下文)HttpSession对象。
    例如:
    <span th:text="${#locale.country}">US</span>.

    th:text="${#calendars.format(today,'dd MMMM yyyy')}"
    ________________________________________
    五,表达式预处理
    表达式预处理,它被定义在_之间:
    #{selection.__${sel.code}__}
    ${sel.code}将先被执行,结果(假如是AAA)将被看做表达式的一部分被执行
    结果#{为selection.AAA}。
    ________________________________________
    六,thymeleaf运算符
    在表达式中可以使用各类算术运算符,例如+, -, *, /, %
    th:with="isEven=(${prodStat.count} % 2 == 0)"
    逻辑运算符>, <, <=,>=,==,!=都可以使用
    需要注意的是使用 > ,<, >=, <=时需要用它的HTML转义符(> gt; < lt; >= ge; gte; <= le; lte; == eq; != ne; neq;)
    th:if="${prodStat.count} &gt; 1"
    th:text="'Execution mode is ' + ( (${execMode} == 'dev')? 'Development' : 'Production')"
    布尔运算符 and,or
    ________________________________________
    七,thymeleaf循环
    数据集合必须是可以遍历的,使用th:each标签:
    <body>
      <h1>Product list</h1>

      <table>
        <tr>
          <th>NAME</th>
          <th>PRICE</th>
          <th>IN STOCK</th>
        </tr>
        <tr th:each="prod : ${prods}">
          <td th:text="${prod.name}">Onions</td>
          <td th:text="${prod.price}">2.41</td>
          <td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
        </tr>
      </table>

      <p>
        <a href="../home.html" th:href="@{/}">Return to home</a>
      </p>
    </body>
    被循环渲染的元素<tr>中加入th:each标签
    th:each="prod : ${prods}"对集合变量prods进行遍历,对象prod在循环体中可通过表达式访问
    ________________________________________
    八,thymeleaf条件求值
    1,If/Unless
    Thymeleaf中使用th:if和th:unless属性进行条件判断
    设置标签只有在th:if中条件成立时才显示:
    <a th:href="@{/login}" th:unless=${session.user != null}>Login</a>
    th:unless与th:if相反,表达式条件不成立时显示内容。
    2,Switch
    多路选择Switch结构,默认属性default,用*表示
    <div th:switch="${user.role}">
      <p th:case="'admin'">User is an administrator</p>
      <p th:case="#{roles.manager}">User is a manager</p>
      <p th:case="*">User is some other thing</p>
    </div>
    3.If-then-else: (if)?(then):else 三元运算符
    三元运算控制class属性选择
     <tr th:class="${row.even}? 'even' : 'odd'">
    三元运算嵌套
    <tr th:class="${row.even}? (${row.first}? 'first' : 'even') : 'odd'">
    还可以省略else部分,当表达式结果为false,返回null,否则返回’alt’
    <tr th:class="${row.even}? 'alt'">
        ...
    </tr>
    4.If-then: (if) ? (then) ,省略了else部分,如果条件不成立,返回null
    如果第一个表达式的计算结果为null,则取第二个表达式的结果
    <div th:object="${session.user}">
        <p>Age: <span th:text="*{age}?: '(no age specified)'">27</span>.</p>
    </div>
    等效于:
    <p>Age: <span th:text="*{age != null}? *{age} : '(no age specified)'">27</span>.</p>
    条件表达式嵌套:
    <p>Name: <span th:text="*{firstName} ?: (*{admin} ? 'Admin' : #{default.username})">Sebastian</span>.</p>
    ________________________________________
    九,Thymeleaf-Utilities
    Thymeleaf提供了套Utility对象,内置于Context中,可通过#直接访问:
    - #dates: java.util的实用方法。对象:日期格式、组件提取等.
    - #calendars: 类似于#日期,但对于java.util。日历对象
    - #numbers: 格式化数字对象的实用方法。
    - #strings:字符串对象的实用方法:包含startsWith,将/附加等。
    - #objects: 实用方法的对象。
    - #bools: 布尔评价的实用方法。
    - #arrays: 数组的实用方法。
    - #lists: list集合。
    - #sets:set集合。
    - #maps: map集合。
    - #aggregates: 实用程序方法用于创建聚集在数组或集合.
    - #messages: 实用程序方法获取外部信息内部变量表达式,以同样的方式,因为他们将获得使用# {…}语法
    - #ids: 实用程序方法来处理可能重复的id属性(例如,由于迭代)。
    Dates
    #dates : utility methods for java.util.Date objects:
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Dates
     * ======================================================================
     */

    /*
     * Null-safe toString()
     */
    ${#strings.toString(obj)}                           // also array*, list* and set*

    /*
     * Format date with the standard locale format
     * Also works with arrays, lists or sets
     */
    ${#dates.format(date)}
    ${#dates.arrayFormat(datesArray)}
    ${#dates.listFormat(datesList)}
    ${#dates.setFormat(datesSet)}

    /*
     * Format date with the specified pattern
     * Also works with arrays, lists or sets
     */
    ${#dates.format(date, 'dd/MMM/yyyy HH:mm')}
    ${#dates.arrayFormat(datesArray, 'dd/MMM/yyyy HH:mm')}
    ${#dates.listFormat(datesList, 'dd/MMM/yyyy HH:mm')}
    ${#dates.setFormat(datesSet, 'dd/MMM/yyyy HH:mm')}

    /*
     * Obtain date properties
     * Also works with arrays, lists or sets
     */
    ${#dates.day(date)}                    // also arrayDay(...), listDay(...), etc.
    ${#dates.month(date)}                  // also arrayMonth(...), listMonth(...), etc.
    ${#dates.monthName(date)}              // also arrayMonthName(...), listMonthName(...), etc.
    ${#dates.monthNameShort(date)}         // also arrayMonthNameShort(...), listMonthNameShort(...), etc.
    ${#dates.year(date)}                   // also arrayYear(...), listYear(...), etc.
    ${#dates.dayOfWeek(date)}              // also arrayDayOfWeek(...), listDayOfWeek(...), etc.
    ${#dates.dayOfWeekName(date)}          // also arrayDayOfWeekName(...), listDayOfWeekName(...), etc.
    ${#dates.dayOfWeekNameShort(date)}     // also arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), etc.
    ${#dates.hour(date)}                   // also arrayHour(...), listHour(...), etc.
    ${#dates.minute(date)}                 // also arrayMinute(...), listMinute(...), etc.
    ${#dates.second(date)}                 // also arraySecond(...), listSecond(...), etc.
    ${#dates.millisecond(date)}            // also arrayMillisecond(...), listMillisecond(...), etc.

    /*
     * Create date (java.util.Date) objects from its components
     */
    ${#dates.create(year,month,day)}
    ${#dates.create(year,month,day,hour,minute)}
    ${#dates.create(year,month,day,hour,minute,second)}
    ${#dates.create(year,month,day,hour,minute,second,millisecond)}

    /*
     * Create a date (java.util.Date) object for the current date and time
     */
    ${#dates.createNow()}

    /*
     * Create a date (java.util.Date) object for the current date (time set to 00:00)
     */
    ${#dates.createToday()}
    Calendars
    #calendars : analogous to #dates, but for java.util.Calendar objects:
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Calendars
     * ======================================================================
     */

    /*
     * Format calendar with the standard locale format
     * Also works with arrays, lists or sets
     */
    ${#calendars.format(cal)}
    ${#calendars.arrayFormat(calArray)}
    ${#calendars.listFormat(calList)}
    ${#calendars.setFormat(calSet)}

    /*
     * Format calendar with the specified pattern
     * Also works with arrays, lists or sets
     */
    ${#calendars.format(cal, 'dd/MMM/yyyy HH:mm')}
    ${#calendars.arrayFormat(calArray, 'dd/MMM/yyyy HH:mm')}
    ${#calendars.listFormat(calList, 'dd/MMM/yyyy HH:mm')}
    ${#calendars.setFormat(calSet, 'dd/MMM/yyyy HH:mm')}

    /*
     * Obtain calendar properties
     * Also works with arrays, lists or sets
     */
    ${#calendars.day(date)}                // also arrayDay(...), listDay(...), etc.
    ${#calendars.month(date)}              // also arrayMonth(...), listMonth(...), etc.
    ${#calendars.monthName(date)}          // also arrayMonthName(...), listMonthName(...), etc.
    ${#calendars.monthNameShort(date)}     // also arrayMonthNameShort(...), listMonthNameShort(...), etc.
    ${#calendars.year(date)}               // also arrayYear(...), listYear(...), etc.
    ${#calendars.dayOfWeek(date)}          // also arrayDayOfWeek(...), listDayOfWeek(...), etc.
    ${#calendars.dayOfWeekName(date)}      // also arrayDayOfWeekName(...), listDayOfWeekName(...), etc.
    ${#calendars.dayOfWeekNameShort(date)} // also arrayDayOfWeekNameShort(...), listDayOfWeekNameShort(...), etc.
    ${#calendars.hour(date)}               // also arrayHour(...), listHour(...), etc.
    ${#calendars.minute(date)}             // also arrayMinute(...), listMinute(...), etc.
    ${#calendars.second(date)}             // also arraySecond(...), listSecond(...), etc.
    ${#calendars.millisecond(date)}        // also arrayMillisecond(...), listMillisecond(...), etc.

    /*
     * Create calendar (java.util.Calendar) objects from its components
     */
    ${#calendars.create(year,month,day)}
    ${#calendars.create(year,month,day,hour,minute)}
    ${#calendars.create(year,month,day,hour,minute,second)}
    ${#calendars.create(year,month,day,hour,minute,second,millisecond)}

    /*
     * Create a calendar (java.util.Calendar) object for the current date and time
     */
    ${#calendars.createNow()}

    /*
     * Create a calendar (java.util.Calendar) object for the current date (time set to 00:00)
     */
    ${#calendars.createToday()}
    Numbers
    #numbers : utility methods for number objects:
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Numbers
     * ======================================================================
     */

    /*
     * ==========================
     * Formatting integer numbers
     * ==========================
     */

    /*
     * Set minimum integer digits.
     * Also works with arrays, lists or sets
     */
    ${#numbers.formatInteger(num,3)}
    ${#numbers.arrayFormatInteger(numArray,3)}
    ${#numbers.listFormatInteger(numList,3)}
    ${#numbers.setFormatInteger(numSet,3)}

    /*
     * Set minimum integer digits and thousands separator:
     * 'POINT', 'COMMA', 'NONE' or 'DEFAULT' (by locale).
     * Also works with arrays, lists or sets
     */
    ${#numbers.formatInteger(num,3,'POINT')}
    ${#numbers.arrayFormatInteger(numArray,3,'POINT')}
    ${#numbers.listFormatInteger(numList,3,'POINT')}
    ${#numbers.setFormatInteger(numSet,3,'POINT')}

    /*
     * ==========================
     * Formatting decimal numbers
     * ==========================
     */

    /*
     * Set minimum integer digits and (exact) decimal digits.
     * Also works with arrays, lists or sets
     */
    ${#numbers.formatDecimal(num,3,2)}
    ${#numbers.arrayFormatDecimal(numArray,3,2)}
    ${#numbers.listFormatDecimal(numList,3,2)}
    ${#numbers.setFormatDecimal(numSet,3,2)}

    /*
     * Set minimum integer digits and (exact) decimal digits, and also decimal separator.
     * Also works with arrays, lists or sets
     */
    ${#numbers.formatDecimal(num,3,2,'COMMA')}
    ${#numbers.arrayFormatDecimal(numArray,3,2,'COMMA')}
    ${#numbers.listFormatDecimal(numList,3,2,'COMMA')}
    ${#numbers.setFormatDecimal(numSet,3,2,'COMMA')}

    /*
     * Set minimum integer digits and (exact) decimal digits, and also thousands and
     * decimal separator.
     * Also works with arrays, lists or sets
     */
    ${#numbers.formatDecimal(num,3,'POINT',2,'COMMA')}
    ${#numbers.arrayFormatDecimal(numArray,3,'POINT',2,'COMMA')}
    ${#numbers.listFormatDecimal(numList,3,'POINT',2,'COMMA')}
    ${#numbers.setFormatDecimal(numSet,3,'POINT',2,'COMMA')}
    /*
     * ==========================
     * Utility methods
     * ==========================
     */

    /*
     * Create a sequence (array) of integer numbers going
     * from x to y
     */
    ${#numbers.sequence(from,to)}
    ${#numbers.sequence(from,to,step)}
    Strings
    #strings : utility methods for String objects:
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Strings
     * ======================================================================
     */

    /*
     * Check whether a String is empty (or null). Performs a trim() operation before check
     * Also works with arrays, lists or sets
     */
    ${#strings.isEmpty(name)}
    ${#strings.arrayIsEmpty(nameArr)}
    ${#strings.listIsEmpty(nameList)}
    ${#strings.setIsEmpty(nameSet)}

    /*
     * Perform an 'isEmpty()' check on a string and return it if false, defaulting to
     * another specified string if true.
     * Also works with arrays, lists or sets
     */
    ${#strings.defaultString(text,default)}
    ${#strings.arrayDefaultString(textArr,default)}
    ${#strings.listDefaultString(textList,default)}
    ${#strings.setDefaultString(textSet,default)}

    /*
     * Check whether a fragment is contained in a String
     * Also works with arrays, lists or sets
     */
    ${#strings.contains(name,'ez')}                     // also array*, list* and set*
    ${#strings.containsIgnoreCase(name,'ez')}           // also array*, list* and set*

    /*
     * Check whether a String starts or ends with a fragment
     * Also works with arrays, lists or sets
     */
    ${#strings.startsWith(name,'Don')}                  // also array*, list* and set*
    ${#strings.endsWith(name,endingFragment)}           // also array*, list* and set*

    /*
     * Substring-related operations
     * Also works with arrays, lists or sets
     */
    ${#strings.indexOf(name,frag)}                      // also array*, list* and set*
    ${#strings.substring(name,3,5)}                     // also array*, list* and set*
    ${#strings.substringAfter(name,prefix)}             // also array*, list* and set*
    ${#strings.substringBefore(name,suffix)}            // also array*, list* and set*
    ${#strings.replace(name,'las','ler')}               // also array*, list* and set*

    /*
     * Append and prepend
     * Also works with arrays, lists or sets
     */
    ${#strings.prepend(str,prefix)}                     // also array*, list* and set*
    ${#strings.append(str,suffix)}                      // also array*, list* and set*

    /*
     * Change case
     * Also works with arrays, lists or sets
     */
    ${#strings.toUpperCase(name)}                       // also array*, list* and set*
    ${#strings.toLowerCase(name)}                       // also array*, list* and set*

    /*
     * Split and join
     */
    ${#strings.arrayJoin(namesArray,',')}
    ${#strings.listJoin(namesList,',')}
    ${#strings.setJoin(namesSet,',')}
    ${#strings.arraySplit(namesStr,',')}                // returns String[]
    ${#strings.listSplit(namesStr,',')}                 // returns List<String>
    ${#strings.setSplit(namesStr,',')}                  // returns Set<String>

    /*
     * Trim
     * Also works with arrays, lists or sets
     */
    ${#strings.trim(str)}                               // also array*, list* and set*

    /*
     * Compute length
     * Also works with arrays, lists or sets
     */
    ${#strings.length(str)}                             // also array*, list* and set*

    /*
     * Abbreviate text making it have a maximum size of n. If text is bigger, it
     * will be clipped and finished in "..."
     * Also works with arrays, lists or sets
     */
    ${#strings.abbreviate(str,10)}                      // also array*, list* and set*

    /*
     * Convert the first character to upper-case (and vice-versa)
     */
    ${#strings.capitalize(str)}                         // also array*, list* and set*
    ${#strings.unCapitalize(str)}                       // also array*, list* and set*

    /*
     * Convert the first character of every word to upper-case
     */
    ${#strings.capitalizeWords(str)}                    // also array*, list* and set*
    ${#strings.capitalizeWords(str,delimiters)}         // also array*, list* and set*

    /*
     * Escape the string
     */
    ${#strings.escapeXml(str)}                          // also array*, list* and set*
    ${#strings.escapeJava(str)}                         // also array*, list* and set*
    ${#strings.escapeJavaScript(str)}                   // also array*, list* and set*
    ${#strings.unescapeJava(str)}                       // also array*, list* and set*
    ${#strings.unescapeJavaScript(str)}                 // also array*, list* and set*

    /*
     * Null-safe comparison and concatenation
     */
    ${#strings.equals(str)}
    ${#strings.equalsIgnoreCase(str)}
    ${#strings.concat(str)}
    ${#strings.concatReplaceNulls(str)}

    /*
     * Random
     */
    ${#strings.randomAlphanumeric(count)}
    Objects
    #objects : utility methods for objects in general
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Objects
     * ======================================================================
     */

    /*
     * Return obj if it is not null, and default otherwise
     * Also works with arrays, lists or sets
     */
    ${#objects.nullSafe(obj,default)}
    ${#objects.arrayNullSafe(objArray,default)}
    ${#objects.listNullSafe(objList,default)}
    ${#objects.setNullSafe(objSet,default)}
    Booleans
    #bools : utility methods for boolean evaluation
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Bools
     * ======================================================================
     */

    /*
     * Evaluate a condition in the same way that it would be evaluated in a th:if tag
     * (see conditional evaluation chapter afterwards).
     * Also works with arrays, lists or sets
     */
    ${#bools.isTrue(obj)}
    ${#bools.arrayIsTrue(objArray)}
    ${#bools.listIsTrue(objList)}
    ${#bools.setIsTrue(objSet)}

    /*
     * Evaluate with negation
     * Also works with arrays, lists or sets
     */
    ${#bools.isFalse(cond)}
    ${#bools.arrayIsFalse(condArray)}
    ${#bools.listIsFalse(condList)}
    ${#bools.setIsFalse(condSet)}

    /*
     * Evaluate and apply AND operator
     * Receive an array, a list or a set as parameter
     */
    ${#bools.arrayAnd(condArray)}
    ${#bools.listAnd(condList)}
    ${#bools.setAnd(condSet)}

    /*
     * Evaluate and apply OR operator
     * Receive an array, a list or a set as parameter
     */
    ${#bools.arrayOr(condArray)}
    ${#bools.listOr(condList)}
    ${#bools.setOr(condSet)}
    Arrays
    #arrays : utility methods for arrays
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Arrays
     * ======================================================================
     */

    /*
     * Converts to array, trying to infer array component class.
     * Note that if resulting array is empty, or if the elements
     * of the target object are not all of the same class,
     * this method will return Object[].
     */
    ${#arrays.toArray(object)}

    /*
     * Convert to arrays of the specified component class.
     */
    ${#arrays.toStringArray(object)}
    ${#arrays.toIntegerArray(object)}
    ${#arrays.toLongArray(object)}
    ${#arrays.toDoubleArray(object)}
    ${#arrays.toFloatArray(object)}
    ${#arrays.toBooleanArray(object)}

    /*
     * Compute length
     */
    ${#arrays.length(array)}

    /*
     * Check whether array is empty
     */
    ${#arrays.isEmpty(array)}

    /*
     * Check if element or elements are contained in array
     */
    ${#arrays.contains(array, element)}
    ${#arrays.containsAll(array, elements)}
    Lists
    #lists : utility methods for lists
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Lists
     * ======================================================================
     */

    /*
     * Converts to list
     */
    ${#lists.toList(object)}

    /*
     * Compute size
     */
    ${#lists.size(list)}

    /*
     * Check whether list is empty
     */
    ${#lists.isEmpty(list)}

    /*
     * Check if element or elements are contained in list
     */
    ${#lists.contains(list, element)}
    ${#lists.containsAll(list, elements)}

    /*
     * Sort a copy of the given list. The members of the list must implement
     * comparable or you must define a comparator.
     */
    ${#lists.sort(list)}
    ${#lists.sort(list, comparator)}
    Sets
    #sets : utility methods for sets
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Sets
     * ======================================================================
     */

    /*
     * Converts to set
     */
    ${#sets.toSet(object)}

    /*
     * Compute size
     */
    ${#sets.size(set)}

    /*
     * Check whether set is empty
     */
    ${#sets.isEmpty(set)}

    /*
     * Check if element or elements are contained in set
     */
    ${#sets.contains(set, element)}
    ${#sets.containsAll(set, elements)}
    Maps
    #maps : utility methods for maps
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Maps
     * ======================================================================
     */

    /*
     * Compute size
     */
    ${#maps.size(map)}

    /*
     * Check whether map is empty
     */
    ${#maps.isEmpty(map)}

    /*
     * Check if key/s or value/s are contained in maps
     */
    ${#maps.containsKey(map, key)}
    ${#maps.containsAllKeys(map, keys)}
    ${#maps.containsValue(map, value)}
    ${#maps.containsAllValues(map, value)}
    Aggregates
    #aggregates : utility methods for creating aggregates on arrays or collections
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Aggregates
     * ======================================================================
     */

    /*
     * Compute sum. Returns null if array or collection is empty
     */
    ${#aggregates.sum(array)}
    ${#aggregates.sum(collection)}

    /*
     * Compute average. Returns null if array or collection is empty
     */
    ${#aggregates.avg(array)}
    ${#aggregates.avg(collection)}
    Messages
    #messages : utility methods for obtaining externalized messages inside variables expressions, in the same way as they would be obtained using #{...} syntax.
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Messages
     * ======================================================================
     */

    /*
     * Obtain externalized messages. Can receive a single key, a key plus arguments,
     * or an array/list/set of keys (in which case it will return an array/list/set of
     * externalized messages).
     * If a message is not found, a default message (like '??msgKey??') is returned.
     */
    ${#messages.msg('msgKey')}
    ${#messages.msg('msgKey', param1)}
    ${#messages.msg('msgKey', param1, param2)}
    ${#messages.msg('msgKey', param1, param2, param3)}
    ${#messages.msgWithParams('msgKey', new Object[] {param1, param2, param3, param4})}
    ${#messages.arrayMsg(messageKeyArray)}
    ${#messages.listMsg(messageKeyList)}
    ${#messages.setMsg(messageKeySet)}

    /*
     * Obtain externalized messages or null. Null is returned instead of a default
     * message if a message for the specified key is not found.
     */
    ${#messages.msgOrNull('msgKey')}
    ${#messages.msgOrNull('msgKey', param1)}
    ${#messages.msgOrNull('msgKey', param1, param2)}
    ${#messages.msgOrNull('msgKey', param1, param2, param3)}
    ${#messages.msgOrNullWithParams('msgKey', new Object[] {param1, param2, param3, param4})}
    ${#messages.arrayMsgOrNull(messageKeyArray)}
    ${#messages.listMsgOrNull(messageKeyList)}
    ${#messages.setMsgOrNull(messageKeySet)}
    IDs
    #ids : utility methods for dealing with id attributes that might be repeated (for example, as a result of an iteration).
    /*
     * ======================================================================
     * See javadoc API for class org.thymeleaf.expression.Ids
     * ======================================================================
     */

    /*
     * Normally used in th:id attributes, for appending a counter to the id attribute value
     * so that it remains unique even when involved in an iteration process.
     */
    ${#ids.seq('someId')}

    /*
     * Normally used in th:for attributes in <label> tags, so that these labels can refer to Ids
     * generated by means if the #ids.seq(...) function.
     *
     * Depending on whether the <label> goes before or after the element with the #ids.seq(...)
     * function, the "next" (label goes before "seq") or the "prev" function (label goes after
     * "seq") function should be called.
     */
    ${#ids.next('someId')}
    ${#ids.prev('someId')}
    好文要顶 关注我 收藏该文   
     
    下一站_jn
    关注 - 0
    粉丝 - 1
    +加关注
    0
    0
    « 上一篇: div弹窗页面onClick方法未定义原因分析
    » 下一篇: 文件下载

  • 相关阅读:
    Excel导出失败的提示
    C#中将一个引用赋值null的作用
    POJ2112Optimal Milking(二分法+floyd最短+网络流量)
    三年流水账
    OpenCV(C++接口)学习笔记1-图像读取、显示、保存
    thinkphp3.2 代码生成并点击验证码
    8.19! 今天我有18生日,点击阅读或顶部 尾随幸运的一天!生日知识!↓——【Badboy】
    如何系统地学习JavaScript
    HDU 3065 病毒在继续 (AC自己主动机)
    使用Canvas和Paint自己绘制折线图
  • 原文地址:https://www.cnblogs.com/xinxihua/p/14552438.html
Copyright © 2020-2023  润新知