开发杂技 2021-03-23

by kevin 23. 三月 2021 19:23 >
1.java jdk1.8的版本问题 莫名奇妙的报了一个编译错误:对于collect(java.util.stream.Collector<java.lang.Object,capture#1, 共 ?,java.util.List<java.lang.Object>>), 找不到合适的方法 看了一下报错的代码,理论上这里不会错。查了一下,可能是jdk版本低引起的。 把jdk版本从jdk-8u20升级到jdk-8u181,这个问题就解决了。 2.thymeleaf小技巧 2.1 th:disabled等属性 要在页面上输出disabled=”disabled” 或者 readonly=”readonly”,设置th:disabled=true或者th:readonly=true就可以了。 类似的属性checked等也是这样设置。 2.2 th:block 如果需要在页面上输出一端文字,而不使用html标签,可以使用th:block,然后设置th:text=”value”。 如果需要在页面上占据一个位置,而不使用div或者其他标签,可以使用th:block,然后设置th:replace。 处理文字连接,可以使用th:text=”${a}+’b””或者th:text=|${a}b|两种语法 ,如果a值为空,则会输出nullb,处理这种情况,就可以使用th:block,<th:block th:text=”${a}”></th:block>b。

Thymeleaf:自定义布局

by kevin 3. 三月 2021 14:01 >
1.简介 页面需要共享常见的页面组件,例如页眉,页脚,菜单等。Thymeleaf使用自定义方言解决了这一问题,如创建布局,自定义标题或head元素合并。 2. Maven依赖 首先,看一下将Thymeleaf与Spring集成所需的必需配置。thymeleaf库需要依赖: <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.0.11.RELEASE</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.11.RELEASE</version> </dependency> 请注意,对于Spring 4项目, 必须使用thymeleaf-spring4库而不是thymeleaf-spring5。 还需要自定义布局方言的依赖项: <dependency> <groupId>nz.net.ultraq.thymeleaf</groupId> <artifactId>thymeleaf-layout-dialect</artifactId> <version>2.4.1</version> </dependency> springboot项目,添加以下依赖就可以启动。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>   3.命名空间和属性处理器的功能 配置完成后,就可以开始使用布局名称空间和五个新的属性处理器:decorate,title-pattern,insert,replace和fragment。 为了创建要用于HTML文件的布局模板,创建了以下文件,命名为template.html: <!DOCTYPE html> <html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> ... </html> 将名称空间从标准xmlns:th =“ http://www.thymeleaf.org”更改为xmlns:layout =“ http://www.ultraq.net.nz/thymeleaf/layout”。 在HTML文件中使用属性处理器。 3.1。布局:片段 为了在布局或可重复使用的模板中创建可被共享相同名称的部分替换的自定义部分,在template.html正文中使用fragment属性: <body> <header> <h1>New dialect example</h1> </header> <section layout:fragment="custom-content"> <p>Your page content goes here</p> </section> <footer> <p>My custom footer</p> <p layout:fragment="custom-footer">Your custom footer here</p> </footer> </body> 请注意,有两个部分将被自定义HTML取代-内容和页脚。 如果找不到任何片段,编写将要使用的默认HTML也很重要。 3.2。布局:装饰 需要做的下一步是创建一个HTML文件,该文件将通过布局进行装饰: <!DOCTYPE html> <html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{template.html}"> <head> <title>Layout Dialect Example</title> </head> <body> <section layout:fragment="custom-content"> <p>This is a custom content that you can provide</p> </section> <footer> <p layout:fragment="custom-footer">This is some footer content that you can change</p> </footer> </body> </html> 如第三行所示,使用layout:decorate并指定装饰器源。布局文件中与内容文件中的片段匹配的所有片段将被其自定义实现替换。 3.3。布局:标题模式 鉴于布局方言会自动使用内容模板中的布局标题覆盖布局标题,可以保留在布局中找到的部分标题。 例如,可以创建面包屑或在页面标题中保留网站名称。在这种情况下,layout:title-pattern处理器会提供帮助。需要在布局文件中指定的所有内容是: <title layout:title-pattern="$LAYOUT_TITLE - $CONTENT_TITLE">Baeldung</title> 因此,上一段中呈现的布局和内容文件的最终结果将如下所示: <title>Baeldung - Layout Dialect Example</title> 3.4。布局:插入/布局:替换 第一个处理器layout:insert类似于Thymeleaf的原始th:insert,但是允许将整个HTML片段传递给插入的模板。如果有一些要重用的HTML,但其内容过于复杂而无法单独使用上下文变量来确定或构造,则此功能非常有用。 第二个布局是layout:replace,与第一个类似,但是具有th:replace的行为,该行为实际上将使用定义的片段代码替换host标签。

Thymeleaf笔记-each循环种如何使用ifelse

by kevin 2. 十一月 2020 10:18 >
没有直接的方法,变通的方法是外层加一个th:block,内层写一个或者多个th:if和th:unless。 举个例子: 1: <th:block th:each="i:${#numbers.sequence(0,10)}" > 2: <a class="active" href="javascript:void(0);" th:if="${i==5" th:text="${i}"></a> 3: <a th:href="/${i}" th:unless="${i==5}" th:text="${i}"></a> 4: </th:block>

Thymeleaf介绍

by kevin 6. 九月 2020 14:34 >
定义 Thymeleaf是一个Java库。它是一个XML / XHTML / HTML5模板引擎,能够对模板文件应用一组转换,以显示应用程序生成的数据和文本。 它更适合在Web应用程序中提供XHTML / HTML5服务,但是它可以处理任何XML文件,无论是在Web中还是在独立应用程序中。 Thymeleaf的主要目标是提供一种优雅且格式正确的模板创建方法。为了实现这一点,它基于XML标签和属性,这些属性定义了DOM(文档对象模型)上预定义逻辑的执行,而不是将该逻辑作为模板中的代码显式编写。 它的体系结构允许依靠已解析文件的智能缓存来快速处理模板,以便在执行过程中使用尽可能少的I / O操作。 重要的一点是,Thymeleaf从一开始就设计了XML和Web标准,允许您在需要时创建完全验证的模板 特点 动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。 开箱即用:它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,同时开发人员也可以扩展和创建自定义的方言。 多方言支持:Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。 与SpringBoot完美整合:SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区别。 表达式 ${}:变量表达式,@{...}:链接URL表达式,#{...}:消息表达式 *{}:选择变量表达式 字符串拼接 我们经常会用到普通字符串与表达式拼接的情况: <span th:text="'欢迎您:' + ${user.name} + '!'"></span> 字符串字面值需要用'',拼接起来非常麻烦,Thymeleaf对此进行了简化,使用一对|即可: <span th:text="|欢迎您:${user.name}|"></span> 默认值 有的时候,我们取一个值可能为空,这个时候需要做非空判断,可以使用表达式 ?: 默认值简写: <span th:text="${user.name} ?: '二狗'"></span> 当前面的表达式值为null时,就会使用后面的默认值。 注意:?:之间没有空格。 循环 循环也是非常频繁使用的需求,我们使用th:each指令来完成: 假如有用户的集合:users在Context中。${users} 是要遍历的集合,可以是以下类型: Iterable,实现了Iterable接口的类;Enumeration,枚举;Interator,迭代器;Map,遍历得到的是Map.Entry;Array,数组及其它一切符合数组结果的对象 <tr th:each="user,stat : ${users}">     <td th:text="${user.name}">Onions</td> <td th:text="${user.age}">2.41</td> </tr> stat对象包含以下属性: index,从0开始的角标 count,元素的个数,从1开始 size,总元素个数 current,当前遍历到的元素 even/odd,返回是否为奇偶,boolean值 first/last,返回是否为第一或最后,boolean值 逻辑判断 Thymeleaf中使用th:if 或者 th:unless ,两者的意思恰好相反。 <span th:if="${user.age} > 24">老油条</span> 如果表达式的值为true,则标签会渲染到页面,否则不进行渲染。 以下情况被认定为true: 表达式值为true;表达式值为非0数值;表达式值为非0字符;表达式值为字符串,但不是"false","no","off";表达式不是布尔、字符串、数字、字符中的任何一种 其它情况包括null都被认定为false 分支控制 <div th:switch="${user.role}">   <p th:case="'admin'">用户是管理员</p>   <p th:case="'manager'">用户是经理</p>   <p th:case="*">用户是别的玩意</p> </div> th:case="*"表示默认,放最后 读取配置文件的值 ${@environment.getProperty('server.port')} 设置任何属性的值 <form action="subscribe.html">   <fieldset>     <input type="text" name="email" />     <input type="submit" value="Subscribe me!" />   </fieldset> </form> 使用th:attr标签就可以达到如下效果 <form action="subscribe.html" th:attr="action=@{/subscribe}">   <fieldset>     <input type="text" name="email" />     <input type="submit" value="Subscribe me!" th:attr="value=#{subscribe.submit}"/>   </fieldset> </form> 如果需要一次设置多个属性,采用逗号分隔就可以 <img src="../../images/gtvglogo.png"      th:attr="src=@{/images/gtvglogo.png},title=#{logo},alt=#{logo}" /> 样式追加和前置 运用的场景为我们往往可能因为某个值的取值来决定某个样式的变化 <input type="button" value="Do it!" class="btn" th:attrappend="class=${'  ' + cssStyle}" /> 我们设置cssStyle值为warning来使class属性后面添加这个值 <input type="button" value="Do it!" class="btn warning" /> 还有两个特定的附加属性:th:classappend和th:styleappend属性,用于在不覆盖现有属性的情况下向元素添加CSS类或样式片段。 <tr th:each="prod : ${prods}" class="row" th:classappend="${prodStat.odd}? 'odd'"> 模板布局 1.定义和引用 定义:th:fragment=".名称" 引用:th:insert="":简单地插入指定的片段作为正文的主标签 th:replace="":用来指定实际片段来替换其主标签 th:include="":类似于th:insert,但是不是插入片段,他只是插入此片段的内容 我们创建了一个foot.html的文件     <div th:fragment="copy">       &copy; 2011 The Good Thymes Virtual Grocery     </div> 在其他页面引用: <body>   <div th:include="footer :: copy"></div> </body> 2.引用片段不带th:fragment <div id="copy-section">   &copy; 2011 The Good Thymes Virtual Grocery </div> 我们可以使用上面的片段,简单地通过其id属性引用它,类似于CSS选择器: <div th:include="footer :: #copy-section"></div> 3.参数化的引用 使用定义的th:fragment可以指定一组参数 <div th:fragment="frag (onevar,twovar)"> <p th:text="${onevar} + ' - ' + ${twovar}"> </p> </div> 在如下代码进行引用 <div th:include="::frag (${value1},${value2})">...</div> <div th:include="::frag (onevar=${value1},twovar=${value2})">...</div> 父子组件的模板布局语法:layout 1.需要在pom文件引入依赖 <dependency> <groupId>nz.net.ultraq.thymeleaf</groupId> <artifactId>thymeleaf-layout-dialect</artifactId> <version>2.3.0</version> </dependency> 2.编写模板页面 3.模板页面的使用 4.简便的写法 5.数据传输到页面 6.配置标题 该layout:title-pattern处理器采用一个简单的字符串,有2个节点的标记:$LAYOUT_TITLE和$CONTENT_TITLE。在结果页面中,每个节点将被其各自的标题替换。 结果的页面是 7.可重复使用的模板 现在,可以使用layout:insert处理器插入此模板并实现modal-content片段,但是您需要通过在调用模板的insert元素内创建相同名称的片段来实现: 笔者感觉这种自定义的模板很适合css样式不同但是html布局相同的自定义页面 8.head元素合并 结果: 脚本内联 <script th:inline="javascript">     const user = /*[[${user}]]*/ {};     const age = /*[[${user.age}]]*/ 20; </script> 在script标签中通过th:inline="javascript"来声明这是要特殊处理的js脚本因为Thymeleaf被注释起来,因此即便是静态环境下, js代码也不会报错,而是采用表达式后面跟着的默认值。且User对象会被直接处理为json格式。 Thymeleaf内置对象 Thymeleaf中提供了一些内置对象,并且在这些对象中提供了一些方法,方便我们来调用。获取这些对象,需要使用#对象名来引用。 一些环境相关对象 对象 作用 #ctx 获取Thymeleaf自己的Context对象 #requset 如果是web程序,可以获取HttpServletRequest对象 #response 如果是web程序,可以获取HttpServletReponse对象 #session 如果是web程序,可以获取HttpSession对象 #servletContext 如果是web程序,可以获取HttpServletContext对象 Thymeleaf提供的全局对象: 对象 作用 #dates 处理java.util.date的工具对象 #calendars 处理java.util.calendar的工具对象 #numbers 用来对数字格式化的方法 #strings 用来处理字符串的方法 #bools 用来判断布尔值的方法 #arrays 用来处理数组的方法 #lists 用来处理List集合的方法 #sets 用来处理set集合的方法 #maps 用来处理map集合的方法 #aggregates 用于在数组或集合上创建聚合的实用程序方法 #messages 实用程序方法,用于获取变量表达式内的外部化消息,与使用#{…}语法获得消息的方法相同。 #ids 用于处理可能重复的id属性的实用方法(例如,由于迭代的结果) 举例:当后台传过来一个时间类型的对象可以用Thymeleaf全局对象来进行格式化 <span th:text="${#dates.format(today,'yyyy-MM-dd')}"></span> Springboot中使用Thymeleaf 1.引入pom依赖 2. 这里注意添加属性,设定版本,设定版本是为了不再日志中显示thymeleaf的日志,使用3.0的版本是为了提高效率,并且解决标签闭合问题 3. 在application.properties中进行thymeleaf的配置 4在resources下面建立templates文件夹,放置html文件,创建页面,切记要在页面中引入thymeleaf