参考来源:Thymeleaf官方文档
文章目录
消息
变量
表达式基本Expression Utility对象
选择表达式(星号语法)
链接URL
文字
字面替换
属性赋值,通用方案(较少使用)
为特定属性设置值(推荐使用)
迭代
迭代:保持迭代状态
简单条件:“if”和“非”
switch语句
模板布局、模板片段
`th:insert`和`th:replace`(和`th:include`)之间的区别
片段传参
局部变量 **th:with**
注释的使用
容器标签 **th:block**
内联表达式
附录:
消息
#{...}
消息表达式允许我们链接:
< p th: utext= " #{home.welcome}" > Welcome to our grocery store! p>
对此xxx.properties属性文件:
home.welcome=Bienvenido a nuestra tienda de comestibles!
如果消息文本不是完全静态会发生什么?例如,如果我们的应用程序知道谁是随时访问该网站的用户并且我们想要通过名字问候他们怎么办?
这意味着我们需要在消息中添加一个参数。像这样:
home.welcome=Bienvenido a nuestra tienda de comestibles, {0}!
< p th: utext= " #{home.welcome(${session.user.name})}" >
Welcome to our grocery store, Sebastian Pepper!
p>
请注意,使用th:utext
此处意味着格式化的消息不会被转义。
可以指定几个参数,以逗号分隔。
最终输出:
< p> Bienvenido a nuestra tienda de comestibles, John Apricot! p>
变量
${...}
表达式实际上是在上下文中包含的变量映射上执行的OGNL(对象 - 图形导航语言)表达式。
使用示例:
< p> Today is: < span th: text= " ${today}" > 13 february 2011 span> . p>
在spring boot Controller通过设置Model 的键值对赋值${today}
但是OGNL允许我们创建更强大的表达式,这就是:
< p th: utext= " #{home.welcome(${session.user.name})}" >
Welcome to our grocery store, Sebastian Pepper!
p>
模板引擎将通过执行以下命令获取用户名:
( ( User) ctx. getVariable ( "session" ) . get ( "user" ) ) . getName ( ) ;
但是getter方法导航只是OGNL的一个特性。让我们看看更多其他的特性:
${ person. father. name}
${ person[ 'father' ] [ 'name' ] }
${ countriesByCode. ES}
${ personsByName[ 'Stephen Zucchini' ] . age}
${ personsArray[ 0 ] . name}
${ person. createCompleteName ( ) }
${ person. createCompleteNameWithSeparator ( '-' ) }
表达式基本Expression Utility对象
在上下文变量中评估OGNL表达式时,某些对象可用于表达式以获得更高的灵活性。将以#
符号开头引用这些对象(按照OGNL标准):
#ctx
:上下文对象。
#vars:
上下文变量。
#locale
:上下文区域设置。
#request
:(仅限Web Contexts)HttpServletRequest
对象。
#response
:(仅限Web Contexts)HttpServletResponse
对象。
#session
:(仅限Web Contexts)HttpSession
对象。
#servletContext
:(仅限Web Contexts)ServletContext
对象。
#execInfo
:有关正在处理的模板的信息。
#messages
:在变量表达式中获取外部化消息的方法,与使用#{…}语法获取的方法相同。
#uris
:转义部分URL / URI的方法
#conversions
:用于执行已配置的转换服务的方法 (如果有)。
#dates
:java.util.Date
对象的方法:格式化,组件提取等。
#calendars
:类似于#dates
,但java.util.Calendar
对象。
#numbers
:格式化数字对象的方法。
#strings
:String
对象的方法:contains,startsWith,prepending / appending等。
#objects
:一般的对象方法。
#bools
:布尔评估的方法。
#arrays
:数组的方法。
#lists
:列表的方法。
#sets
:集合的方法。
#maps
:地图的方法。
#aggregates
:在数组或集合上创建聚合的方法。
#ids
:处理可能重复的id属性的方法(例如,作为迭代的结果)。
所以我们可以这样做:
Established locale country: < span th: text= " ${#locale.country}" > US span> .
选择表达式(星号语法)
变量表达式不仅可以写成${...}
,也可以作为*{...}
。
选定对象使用th:object
属性。
< 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>
链接URL
@
语法:@{...}
参看以下例子:
< a href = " details.html"
th: href= " @{http://localhost:8080/gtvg/order/details(orderId=${o.id})}" > view a>
< a href = " details.html" th: href= " @{/order/details(orderId=${o.id})}" > view a>
< a href = " details.html" th: href= " @{/order/{orderId}/details(orderId=${o.id})}" > view a>
注意:
如果需要几个参数,这些参数将用逗号分隔: @{/order/process(execId=${execId},execType='FAST')}
URL路径中也允许使用变量: @{/order/{orderId}/details(orderId=${orderId})}
以/
(例如:)开头的相对URL /order/details
将自动以应用程序上下文名称为前缀。
文字
< span th: text= " ' working web application' " > template file span> .
< p> The year is < span th: text= " 2013" > 1492 span> . p>
< p> In two years, it will be < span th: text= " 2013 + 2" > 1494 span> . p>
< div th: if= " ${user.isAdmin()} == false" > ...
< div th: if= " ${user.isAdmin() == false}" > ...
在这个例子中,它== false被写在大括号外面,因此Thymeleaf会照顾它。如果它是在大括号内写的,那么它将由OGNL / SpringEL引擎负责:
< div th: if= " ${variable.something} == null" > ...
< span th: text= " ' The name of the user is ' + ${user.name}" >
< div th: with= " isEven=(${prodStat.count} % 2 == 0)" >
请注意,这些运算符也可以应用于OGNL变量表达式本身(在这种情况下,将由OGNL而不是Thymeleaf标准表达式引擎执行):
< div th: with= " isEven=${prodStat.count % 2 == 0}" >
请注意,其中一些运算符存在文本别名:div(/),mod(%)。
字面替换
文字替换允许轻松格式化包含变量值的字符串,而无需附加文字'...' + '...'
。
这些替换必须用竖线(|
)包围,如:
< span th: text= " |Welcome to our application, ${user.name}!|" >
这相当于:
< span th: text= " ' Welcome to our application, ' + ${user.name} + ' !' " >
文字替换可以与其他类型的表达相结合:
< span th: text= " ${onevar} + ' ' + |${twovar}, ${threevar}|" >
属性赋值,通用方案(较少使用)
< form action = " subscribe.html" th: attr= " action=@{/subscribe}" >
< fieldset>
< input type = " text" name = " email" />
< input type = " submit" value = " Subscribe!" th: attr= " value=#{subscribe.submit}" />
fieldset>
form>
th:attr="action=@{/subscribe}"
将设置action的属性值
th:attr="value=#{subscribe.submit}
将设置input 标签的value值
处理后的文件将是:
< form action = " /gtvg/subscribe" >
< fieldset>
< input type = " text" name = " email" />
< input type = " submit" value = " ¡Suscríbe!" />
fieldset>
form>
多个属性同时赋值,使用逗号分隔:
< img src = " ../../images/gtvglogo.png"
th: attr= " src=@{/images/gtvglogo.png},title=#{logo},alt=#{logo}" />
为特定属性设置值(推荐使用)
例如,要设置value
属性,请使用th:value
:
< input type = " submit" value = " Subscribe!" th: value= " #{subscribe.submit}" />
这看起来好多了!让我们尝试action
对form
标记中的属性执行相同的操作:
< form action = " subscribe.html" th: action= " @{/subscribe}" >
你还记得th:href
我们home.html
以前放过的东西吗?它们正是同样的属性:
< li> < a href = " product/list.html" th: href= " @{/product/list}" > Product List a> li>
更多特定属性,请参考:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#setting-attribute-values
迭代
控制器:
List< Product> allProducts = productService. findAll ( ) ;
WebContext ctx = new WebContext ( request, response, servletContext, request. getLocale ( ) ) ;
ctx. setVariable ( "prods" , allProducts) ;
模板:
< table>
< 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>
迭代:保持迭代状态
使用时th:each
,Thymeleaf提供了一种机制,可用于跟踪迭代的状态 :状态变量 。
状态变量在th:each
属性中定义,包含以下数据:
当前迭代索引 ,从0开始。这是index
属性。
当前迭代索引 ,从1开始。这是count
属性。
迭代变量中元素的总量。这是size
酒店。
每次迭代的iter变量 。这是current
酒店。
当前迭代是偶数还是奇数。这些是even/odd
布尔属性。
当前迭代是否是第一个。这是first
布尔属性。
当前迭代是否是最后一次。这是last
布尔属性。
< table>
< tr>
< th> NAME th>
< th> PRICE th>
< th> IN STOCK th>
tr>
< tr th: each= " prod,stat : ${prods}" th: class= " ${stat.odd}? ' odd' " >
< 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>
如果您没有显式设置状态变量,Thymeleaf将始终通过后缀Stat
为迭代变量的名称为您创建一个:
< table>
< tr>
< th> NAME th>
< th> PRICE th>
< th> IN STOCK th>
tr>
< tr th: each= " prod : ${prods}" th: class= " ${prodStat.odd}? ' odd' " >
< 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>
简单条件:“if”和“非”
有时,如果满足某个条件,您将需要模板的片段才会出现在结果中。
< a href = " comments.html"
th: href= " @{/product/comments(prodId=${prod.id})}"
th: if= " ${not #lists.isEmpty(prod.comments)}" >
view
a>
switch语句
< div th: switch= " ${user.role}" >
< p th: case= " ' admin' " > User is an administrator p>
< p th: case= " #{roles.manager}" > User is a manager p>
div>
请注意,只要一个th:case
为true
上下文中的每个其他属性为false
。
默认选项指定为th:case="*"
:
< 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>
模板布局、模板片段
在我们的模板中,我们经常需要包含其他模板中的部分,页脚,标题,菜单等部分…为了做到这一点,Thymeleaf需要我们定义这些部分,“片段”,以便包含,这可以使用th:fragment
属性来完成。
定义片段:
< html xmlns: th= " http://www.thymeleaf.org" >
< body>
< div th: fragment= " copy" >
© 2011 The Good Thymes Virtual Grocery
div>
body>
html>
使用片段:
上面的代码定义了一个名为的片段copy
,我们可以使用其中一个th:insert
或th:replace
属性轻松地在我们的主页中包含这些片段(或者使用th:include
,尽管自Thymeleaf 3.0以来不再推荐使用它):
< body>
...
< div th: insert= " ~{footer :: copy}" > div>
body>
请注意,th:insert
(~{
,}
)封闭是完全可选的,所以上面的代码相当于:
< body>
...
< div th: insert= " footer :: copy" > div>
body>
片段规范语法
"~{templatename::selector}"
引入指定模板文件中的某个片段
"~{templatename}"
引入一个完整的模板文件
~{::selector}"
或"~{this::selector}"
插入来自同一模板的片段
th:insert
和th:replace
(和th:include
)之间的区别
HTML片段:
< footer th: fragment= " copy" >
© 2011 The Good Thymes Virtual Grocery
footer>
在主机标签中包含三次,如下所示:
< body>
...
< div th: insert= " footer :: copy" > div>
< div th: replace= " footer :: copy" > div>
< div th: include= " footer :: copy" > div>
body>
…将导致:
< body>
...
< div>
< footer>
© 2011 The Good Thymes Virtual Grocery
footer>
div>
< footer>
© 2011 The Good Thymes Virtual Grocery
footer>
< div>
© 2011 The Good Thymes Virtual Grocery
div>
body>
片段传参
片段参数化
< div th: fragment= " frag (onevar,twovar)" >
< p th: text= " ${onevar} + ' - ' + ${twovar}" > ... p>
div>
调用片段,可通过th:insert
或th:replace
调用片段:
< div th: replace= " ::frag (${value1},${value2})" > ... div>
< div th: replace= " ::frag (onevar=${value1},twovar=${value2})" > ... div>
局部变量 th:with
声明赋值局部变量:
< div th: with= " firstPer=${persons[0]}" >
< p>
The name of the first person is < span th: text= " ${firstPer.name}" > Julius Caesar span> .
p>
div>
该firstPer 的变量作用范围只在
标记包含的范围内。
多重赋值:
< div th: with= " firstPer=${persons[0]},secondPer=${persons[1]}" >
< p>
The name of the first person is < span th: text= " ${firstPer.name}" > Julius Caesar span> .
p>
< p>
But the name of the second person is
< span th: text= " ${secondPer.name}" > Marcus Antonius span> .
p>
div>
注释的使用
普通注释正常使用:
< div th: text= " ${...}" >
...
div>
Thymeleaf将删除一切在
之间的内容
< div>
你只能在thymeleaf解析前看到我!
div>
容器标签 th:block
th:block
是一个纯粹的属性容器,允许模板开发人员指定他们想要的任何属性,然后简单地使块,不会解析成上下文,是消失的标签。
因此,在创建每个元素需要多个迭代表时,它可能很有用:
< table>
< th: block th: each= " user : ${users}" >
< tr>
< td th: text= " ${user.login}" > ... td>
< td th: text= " ${user.name}" > ... td>
tr>
< tr>
< td colspan = " 2" th: text= " ${user.address}" > ... td>
tr>
th: block>
table>
内联表达式
虽然标准方言允许我们使用标记属性来完成几乎所有操作,但在某些情况下我们可能更喜欢将表达式直接编写到HTML文本中。例如,我们可能更喜欢这样写:
msg = 'This is great! '
使用[(...)]
< p> The message is "[(${msg})]" p>
结果是
标签不转义,因此:
< p> The message is "This is < b> great! b> " p>
使用[[...]]
:
< p> The message is "[[${msg}]]" p>
结果将被HTML转义:
< p> The message is "This is < b> great!< /b> " p>
注意:
[[...]]
对应于th:text
即结果将被HTML转义 ,
[(...)]
对应于th:utext
并且不会执行任何HTML转义。
内联 对比 自然模板
你可能会问:为什么我们从一开始就不这样做?它的代码少于所有这些 th:text
属性!
好吧,小心那里,因为尽管你可能会发现内联非常有趣,但是你应该永远记住,当你静态打开它们时,内联表达式将逐字显示在你的HTML文件中,所以你可能无法将它们用作设计原型了!
所以自然模板是比较适合于查看原型设计原型的时候
附录:
获取url的参数值: 如http://localhost/test?foo=123 ${#request.getParameter('foo')}
详情参考:
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#appendix-a-expression-basic-objects
你可能感兴趣的:(模板引擎,thymeleaf)
asp.net core的入门教学
21软件外包1班-庞兴南
asp.net 后端
什么是ASP.NETCoreasp.netcore是一个基于HTML和ASP的动态Web开发框架,主要用于web应用程序的开发。它是一个轻量级框架,使用HTML、ASP、CSS、JavaScript等技术。它易于使用和部署,可以快速构建web应用程序。asp.netcore提供了丰富的功能,包括模板引擎、文件解析、数据处理和用户管理等。本文将介绍asp.netcore的主要功能和特点,并提供使用方
Python Flask配置
大灰太狼Zz
python flask 后端
Flask技术文档什么是Flask?Flask是一个使用Python编写的轻量级Web应用框架。其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2。Flask使用BSD授权。Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具BSD:是Unix的衍生系统,“BSD”并不特指任何一个BS
Springboot2 thymeleaf 静态资源加版本号控制缓存更新
VIAE
最近写了一个前后端不分离的项目了,用的Springboot2thymeleaf用的js原生,没有用到webpack,所以不能在每次js变更以后打包自动给静态文件加上hash后缀关于静态资源缓存不更新的问题,用了以下几种解决方案方法一在静态资源引用的时候加上版本号,最开始我就是这么做的,因为当时确实没几个文件index.htmlbug:文件多了以后,这种方法就不太适合了方法二动态添加静态资源,加时间
SpringBoot:Thymeleaf集成
dingcho
前端 SpringCloud spring boot Thymeleaf集成
org.springframework.bootspring-boot-starter-thymeleaf配置ClassLoaderTemplateResolver:/***Function:todo**@program:TemplateConfig*@Package:com.kingbal.tohtml.tst*@author:dingcho*@date:2024/09/06*@version:
毕设/私活/bigold必备项目,一个挣钱的免费的全开源标准前后端分离后台管理权限系统【springboot+vue+redis+Spring Security】脚手架搭建:若依Ruo框架具体使用教程
南北极之间
前端开发 springboot vue springboot+vue 免费后台管理系统 毕业私活后台权限系统
【建议收藏】毕设/私活/大佬必备,一个挣钱的标准开源前后端分离【springboot+vue+redis+SpringSecurity】脚手架一个免费的开源后台管理系统:若依框架(具体使用教程:具体怎样下载?怎样使用?怎样配置后台接口地址?超详细)简介RuoYi是一个JavaEE企业级快速开发平台,基于经典技术组合(SpringBoot、ApacheShiro、MyBatis、Thymeleaf、
基于spring boot的旅游管理系统
鹿屿二向箔
spring boot 旅游 后端
一个简单的SpringBoot应用的基础结构示例,以及如何设置一个基本的旅游管理系统。这个例子将包含用户注册和登录的基本功能。首先,你需要设置一个新的SpringBoot项目。可以通过SpringInitializr网站(https://start.spring.io/)来快速生成一个基础项目结构,选择必要的依赖项,比如Web、Thymeleaf、SpringDataJPA和MySQLDriver
SpringMVC的架构有什么优势?——视图与模型(二)
不会编程的小孩子
架构
#SpringMVC的架构有什么优势?——视图与模型(二)前言关键字:机器学习人工智能AIchatGPT学习实现使用搭建深度python事件远程dockermysql安全技术部署技术自动化代码视图(View)视图是展示结果的组件,它们负责渲染模型数据并生成HTML输出。SpringMVC支持多种视图技术,包括JSP、Thymeleaf等。视图(View)是SpringMVC中渲染并呈现结果的组件,
前端MVVM框架设计及实现(一)
baoaoba9317
前端 设计模式 数据结构与算法 ViewUI
最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了借鉴的自然还是从正美的avalon开始了,我记得还是去年6月写过一个系列的avalon源码分析的,不过那时候0.7版本,不够健全,现在已经好太多了框架是面向一个领域,提供一套解决方案,那么我们用前端的MVVM能为我们带来什么便利?关注点分离操作数据即操作DOM动态模板关注点分离是
Python 常用web框架
TigerZ*
python 用法相关 python
全功能框架Django应该是最流行的PythonWeb框架了,没有之一。而且其包含了创建应用需要的几乎全部功能,给人的感觉是这个框架希望框架本身实现各种功能,而不是依靠其他的库来完成。比如Django集成了安全认证,URLRouting,模板引擎,ORM以及数据库Scheme映射。这使得Django非常强大,有很好的可扩展性,性能也非常好。Django支持PostgreSQL,MySQL,SQLi
springboot使用thymeleaf
汤飞
springboot
1.引入依赖 org.springframework.boot spring‐boot‐starter‐thymeleaf 3.0.9.RELEASE 2.2.2thymeleaf会自动渲染resource/templates下的html文件,静态资源存放在resource/static中2.新建测试htmlTitle这是显示欢迎信息id:n
Golang深入浅出之-Go语言模板(text/template):动态生成HTML
Jimaks
后端 golang html 开发语言
在现代Web开发中,动态生成HTML页面是一项基本需求,而Go语言通过其标准库text/template和html/template提供了强大的模板处理功能。本文将深入浅出地介绍Go语言模板的基础、常见问题、易错点及避免策略,并辅以代码示例,帮助开发者高效、安全地生成动态HTML。一、Go模板基础Go的模板引擎允许你定义一个模板结构,然后将数据填充到这个结构中生成最终的输出文本。其中,text/t
golang 模板引擎常用语法
nbplus_007
golang golang python 前端 开发语言 go配置文件 个人开发
golang模板常用语法1、变量赋值Action里可以初始化一个变量来捕获管道的执行结果。初始化语法如下:其中$variable是变量的名字。声明变量的action不会产生任何输出。{{$variable:=pipeline}}福利彩蛋:没有好玩的API接口?上百款免费接口等你来,免费API,免费API大全2、range循环切片数组等如果"range"action初始化了1个变量,该变量设置为迭代
Springboot+Mybatis+jpa+thymeleaf实现增删改查
柒麒
java spring boot mybatis
Springboot+Mybatis+jpa+thymeleaf项目结构pom文件Application配置文件实体类controller层实现类service层接口service层实现类dao层接口启动类index.html首页add.html添加页面update.html更新页面创建user表添加表数据首页展示添加修改删除总结项目结构pom文件配置相关依赖:UTF-8UTF-81.8org.s
项目在idea中运行正常,打包jar后运行就报错Template might not exist or might not be accessible的解决方法
技术菜鸟—淡定万
Springboot Java java spring maven html
报错情况[http-nio-80-exec-15]ERRORo.t.TemplateEngine-[process,1136]-[THYMELEAF][http-nio-80-exec
释放Laravel Blade的威力:掌握Laravel的模板引擎
2401_85812026
laravel php
释放LaravelBlade的威力:掌握Laravel的模板引擎Laravel框架以其优雅和简洁的代码而闻名,其中Blade模板引擎是其核心组件之一。Blade不仅提供了强大的模板功能,还允许开发者以一种简单直观的方式编写视图。本文将带你深入了解如何在Laravel中使用Blade模板引擎,让你的应用开发更加高效。一、Blade模板引擎概述Blade是Laravel的内置模板引擎,它让你的前端代码
Flask中session失效时间设置
忘了呼吸的那只猫
最近需要使用Python开发web系统,主要用到的框架就是Flask,前端使用Jinja2模板引擎和Bootstrap,web容器使用Cherrypy,其中关于Login管理的使用了Flask-Login插件。基本上也是从零学起,前前后后花了有好几个月的时间,还是在借鉴了已有的一些项目基础上。在开发的过程中有很多的想法和体会,记录下来,有不对的地方欢迎大家指正。在处理登录管理的部分,在Flask-
一周学会Django5 Python Web开发-Django5内置模板引擎-模板上下文变量
java1234_小锋
Python python django5 django python web开发 python web 模板引擎
锋哥原创的PythonWeb开发Django5视频教程:2024版Django5Pythonweb开发视频教程(无废话版)玩命更新中~_哔哩哔哩_bilibili2024版Django5Pythonweb开发视频教程(无废话版)玩命更新中~共计32条视频,包括:2024版Django5Pythonweb开发视频教程(无废话版)玩命更新中~、第2讲Django5安装、第3讲Django5创建项目(用
【Python--Web应用框架大比较】
码上有前
Python python flask django
作者:“码上有前”文章简介:Python欢迎小伙伴们点赞、收藏⭐、留言DjangoDjango太重了,除了web框架,自带ORM和模板引擎,灵活和自由度不够高Django能开发小应用,但总会有“杀鸡焉用牛刀”的感觉Django的自带ORM非常优秀,综合评价略高于SQLAlchemyDjango自带的模板引擎简单好用,但其强大程度和综合评价略低于JinjaDjango自带ORM也使Django与关系
SpringBoot常见问题
一朝风月S
面试宝典 spring boot java
1引言SpringBoot是一个基于Spring框架的快速开发脚手架,它简化了Spring应用的初始化和搭建过程,提供了众多便利的功能和特性,比如自动配置、嵌入式Tomcat等,让开发人员可以更加专注于业务逻辑的实现。 SpringBoot还提供了强大的插件体系和广泛的集成,可以轻松地与其他技术栈集成,比如Thymeleaf模板、JPA、MyBatis、Redis、MongoDB等,同时也支持对
2.18日学习打卡----初学Dubbo(三)
中北萌新程序员
每日学习 学习 dubbo
2.18日学习打卡目录:2.18日学习打卡Dubbo实战项目介绍创建dubbo_parent父项目创建子项目user_api项目创建子项目user_consumer项目创建子项目user_provider项目模块用户实体类构建创建添加用户接口查询用户业务接口更新用户业务接口删除用户业务接口集成Thymeleaf用户添加业务消费者实现用户查询业务消费者实现在Consumer中调用更新用户业务用户删除
【Java】电子凭证-Java生成PDF
hkk666123
Java HTML 转 PDF htmlTOPDF
文章目录背景实现思路技术方案图TemplateEngines(模板引擎)`Thymeleaf``ApacheFreemarker``GroovyTemplates``velocity``HTMLTOPDF`技术各实现对比表WKhtmlTOpdfiTextPhantomJS技术核心:HTML生成PDF背景在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等。方
JAVA后端主流开发框架
理查德.克莱德曼
JavaWeb SpringBoot java 后端 开发语言
项目介绍一款Java语言基于SpringBoot2.x、Layui、Thymeleaf、MybatisPlus、Shiro、MySQL等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建后台管理系统,本着简化开发、提升开发效率的初衷,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪、富文
详解Springboot整合Shiro加盐加散列实现登陆注册小案例
鱼小洲
技术杂谈 shiro mybatis hash springboot boot-shiro
前言Springboot和Shiro的基本介绍我就不多说了,能看到这篇文章的相信也都会用。这篇文章主要是分享一下我在学习Shiro和Springboot的整合的小阶段。目前是复习,很感谢B站的up主——编程不良人的视频让我有了一个学习Shiro的基本方向。目前是实现了用户认证的功能。依赖整合的时候使用的是jsp,其实和thymeleaf一个道理,而且不涉及到作用域传值。我们需要导入的依赖有:mys
SSTI模板注入漏洞(vulhub 复现)
bK_Rose
ssti flask 网络安全
首先了解模板引擎:模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前。模板引擎也会提供沙箱机制来进行漏洞防范,但是可以用沙箱逃逸技术
【Django开发】0到1开发美多shop项目:图形和短信验证码。全md文档笔记(附代码,已分享)
djangopython
本系列文章md笔记(已分享)主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目(4.0版本)含代码和文档。功能包括前后端不分离,方便SEO。采用Django+Jinja2模板引擎+Vue.js实现前后端逻辑,Nginx服务器(反向代理)Nginx服务器(静态首页、商品详情页、uwsgi服务器(美多商场业务场景),后端服务:MySQL、Redis、Celer
Node.js开发-express框架
中二Espresso
Node.js开发 node.js express
express框架1)介绍2)express路由3)express响应设置4)express其他响应5)express中间件6)静态资源中间件7)获取请求体数据body-parser8)Router路由模块化9)EJS模板引擎1)介绍express是一个基于Node.js平台的极简、灵活的WEB应用开发框架,官方网址:https://www.expressjs.com.cn/简单来说,expres
art-template模板引擎
爱吃炸鸡的Banana
如果按照服务器数据列表那样去渲染数据的话,碰到复杂功能编码就会变得很复杂,并且由于要修改字符串中的内容,没有编辑器提示后期维护,加新功能(例如咱们给上传、删除按钮注册click事件)也变得不方便,所以art-template模板引擎就能解决此问题art-template官网http://aui.github.io/art-template/zh-cn/docs/index.htmlart-temp
基于JAVA+Springboot+Thymeleaf前后端分离项目:在线婚纱租赁系统设计与实现
黄菊华老师
计算机系统成品 java spring boot 开发语言 在线婚纱租赁系统
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在CSD
新手入门------SpringBoot文件上传实现
布吉岛-
入门SpringBoot spring boot java idea
本次的内容是实现文件上传,小案例要达到的效果是在浏览器选择好文件,然后上传,最后返回结果(失败或成功),分为单文件和多文件上传。一.案例准备首先还是进行springboot项目的创建,这个就不进行演示了。本次需要添加的依赖是springweb和thymeleaf。如果已经有项目但是没有选择这两个依赖,可以点击pom.xml,在中手动添加如下依赖:org.springframework.bootsp
java入门-springboot整合mybatis+layui
wwwzhouzy
java入门 java进阶-框架篇 spring boot ssm layui mybatis springboot
源码地址:https://codechina.csdn.net/wwwzhouzy/springboot-ssm先看看项目启动,访问页面的效果图:需要注意的地方:1、引入layui相关资源文件时注意路径,尤其是引用Thymeleaf标签时静态资源默认从static目录下查找2、注意json传送数据的编码问题,不然会有乱码继承WebMvcConfigurationSupport类,重写方法:@Bea
Hadoop(一)
朱辉辉33
hadoop linux
今天在诺基亚第一天开始培训大数据,因为之前没接触过Linux,所以这次一起学了,任务量还是蛮大的。
首先下载安装了Xshell软件,然后公司给了账号密码连接上了河南郑州那边的服务器,接下来开始按照给的资料学习,全英文的,头也不讲解,说锻炼我们的学习能力,然后就开始跌跌撞撞的自学。这里写部分已经运行成功的代码吧.
在hdfs下,运行hadoop fs -mkdir /u
maven An error occurred while filtering resources
blackproof
maven 报错
转:http://stackoverflow.com/questions/18145774/eclipse-an-error-occurred-while-filtering-resources
maven报错:
maven An error occurred while filtering resources
Maven -> Update Proje
jdk常用故障排查命令
daysinsun
jvm
linux下常见定位命令:
1、jps 输出Java进程
-q 只输出进程ID的名称,省略主类的名称;
-m 输出进程启动时传递给main函数的参数;
&nb
java 位移运算与乘法运算
周凡杨
java 位移 运算 乘法
对于 JAVA 编程中,适当的采用位移运算,会减少代码的运行时间,提高项目的运行效率。这个可以从一道面试题说起:
问题:
用最有效率的方法算出2 乘以8 等於几?”
答案:2 << 3
由此就引发了我的思考,为什么位移运算会比乘法运算更快呢?其实简单的想想,计算机的内存是用由 0 和 1 组成的二
java中的枚举(enmu)
g21121
java
从jdk1.5开始,java增加了enum(枚举)这个类型,但是大家在平时运用中还是比较少用到枚举的,而且很多人和我一样对枚举一知半解,下面就跟大家一起学习下enmu枚举。先看一个最简单的枚举类型,一个返回类型的枚举:
public enum ResultType {
/**
* 成功
*/
SUCCESS,
/**
* 失败
*/
FAIL,
MQ初级学习
510888780
activemq
1.下载ActiveMQ
去官方网站下载:http://activemq.apache.org/
2.运行ActiveMQ
解压缩apache-activemq-5.9.0-bin.zip到C盘,然后双击apache-activemq-5.9.0-\bin\activemq-admin.bat运行ActiveMQ程序。
启动ActiveMQ以后,登陆:http://localhos
Spring_Transactional_Propagation
布衣凌宇
spring transactional
//事务传播属性
@Transactional(propagation=Propagation.REQUIRED)//如果有事务,那么加入事务,没有的话新创建一个
@Transactional(propagation=Propagation.NOT_SUPPORTED)//这个方法不开启事务
@Transactional(propagation=Propagation.REQUIREDS_N
我的spring学习笔记12-idref与ref的区别
aijuans
spring
idref用来将容器内其他bean的id传给<constructor-arg>/<property>元素,同时提供错误验证功能。例如:
<bean id ="theTargetBean" class="..." />
<bean id ="theClientBean" class=&quo
Jqplot之折线图
antlove
js jquery Web timeseries jqplot
timeseriesChart.html
<script type="text/javascript" src="jslib/jquery.min.js"></script>
<script type="text/javascript" src="jslib/excanvas.min.js&
JDBC中事务处理应用
百合不是茶
java JDBC编程 事务控制语句
解释事务的概念; 事务控制是sql语句中的核心之一;事务控制的作用就是保证数据的正常执行与异常之后可以恢复
事务常用命令:
Commit提交
[转]ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
bijian1013
java 多线程 线程安全 HashMap
在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK1.0的一部分。 Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的――Hashtable的所有方法都是同步的。此时,无竞争的同步会导致可观的性能代价。Hashtable的后继者HashMap是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的
ng-if与ng-show、ng-hide指令的区别和注意事项
bijian1013
JavaScript AngularJS
angularJS中的ng-show、ng-hide、ng-if指令都可以用来控制dom元素的显示或隐藏。ng-show和ng-hide根据所给表达式的值来显示或隐藏HTML元素。当赋值给ng-show指令的值为false时元素会被隐藏,值为true时元素会显示。ng-hide功能类似,使用方式相反。元素的显示或
【持久化框架MyBatis3七】MyBatis3定义typeHandler
bit1129
TypeHandler
什么是typeHandler?
typeHandler用于将某个类型的数据映射到表的某一列上,以完成MyBatis列跟某个属性的映射
内置typeHandler
MyBatis内置了很多typeHandler,这写typeHandler通过org.apache.ibatis.type.TypeHandlerRegistry进行注册,比如对于日期型数据的typeHandler,
上传下载文件rz,sz命令
bitcarter
linux命令rz
刚开始使用rz上传和sz下载命令:
因为我们是通过secureCRT终端工具进行使用的所以会有上传下载这样的需求:
我遇到的问题:
sz下载A文件10M左右,没有问题
但是将这个文件A再传到另一天服务器上时就出现传不上去,甚至出现乱码,死掉现象,具体问题
解决方法:
上传命令改为;rz -ybe
下载命令改为:sz -be filename
如果还是有问题:
那就是文
通过ngx-lua来统计nginx上的虚拟主机性能数据
ronin47
ngx-lua 统计 解禁ip
介绍
以前我们为nginx做统计,都是通过对日志的分析来完成.比较麻烦,现在基于ngx_lua插件,开发了实时统计站点状态的脚本,解放生产力.项目主页: https://github.com/skyeydemon/ngx-lua-stats 功能
支持分不同虚拟主机统计, 同一个虚拟主机下可以分不同的location统计.
可以统计与query-times request-time
java-68-把数组排成最小的数。一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的。例如输入数组{32, 321},则输出32132
bylijinnan
java
import java.util.Arrays;
import java.util.Comparator;
public class MinNumFromIntArray {
/**
* Q68输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
* 例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题
Oracle基本操作
ccii
Oracle SQL总结 Oracle SQL语法 Oracle基本操作 Oracle SQL
一、表操作
1. 常用数据类型
NUMBER(p,s):可变长度的数字。p表示整数加小数的最大位数,s为最大小数位数。支持最大精度为38位
NVARCHAR2(size):变长字符串,最大长度为4000字节(以字符数为单位)
VARCHAR2(size):变长字符串,最大长度为4000字节(以字节数为单位)
CHAR(size):定长字符串,最大长度为2000字节,最小为1字节,默认
[强人工智能]实现强人工智能的路线图
comsci
人工智能
1:创建一个用于记录拓扑网络连接的矩阵数据表
2:自动构造或者人工复制一个包含10万个连接(1000*1000)的流程图
3:将这个流程图导入到矩阵数据表中
4:在矩阵的每个有意义的节点中嵌入一段简单的
给Tomcat,Apache配置gzip压缩(HTTP压缩)功能
cwqcwqmax9
apache
背景:
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,
SpringMVC and Struts2
dashuaifu
struts2 springMVC
SpringMVC VS Struts2
1:
spring3开发效率高于struts
2:
spring3 mvc可以认为已经100%零配置
3:
struts2是类级别的拦截, 一个类对应一个request上下文,
springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
所以说从架构本身上 spring3 mvc就容易实现r
windows常用命令行命令
dcj3sjt126com
windows cmd command
在windows系统中,点击开始-运行,可以直接输入命令行,快速打开一些原本需要多次点击图标才能打开的界面,如常用的输入cmd打开dos命令行,输入taskmgr打开任务管理器。此处列出了网上搜集到的一些常用命令。winver 检查windows版本 wmimgmt.msc 打开windows管理体系结构(wmi) wupdmgr windows更新程序 wscrip
再看知名应用背后的第三方开源项目
dcj3sjt126com
ios
知名应用程序的设计和技术一直都是开发者需要学习的,同样这些应用所使用的开源框架也是不可忽视的一部分。此前《
iOS第三方开源库的吐槽和备忘》中作者ibireme列举了国内多款知名应用所使用的开源框架,并对其中一些框架进行了分析,同样国外开发者
@iOSCowboy也在博客中给我们列出了国外多款知名应用使用的开源框架。另外txx's blog中详细介绍了
Facebook Paper使用的第三
Objective-c单例模式的正确写法
jsntghf
单例 ios iPhone
一般情况下,可能我们写的单例模式是这样的:
#import <Foundation/Foundation.h>
@interface Downloader : NSObject
+ (instancetype)sharedDownloader;
@end
#import "Downloader.h"
@implementation
jquery easyui datagrid 加载成功,选中某一行
hae
jquery easyui datagrid 数据加载
1.首先你需要设置datagrid的onLoadSuccess
$(
'#dg'
).datagrid({onLoadSuccess :
function
(data){
$(
'#dg'
).datagrid(
'selectRow'
,3);
}});
2.onL
jQuery用户数字打分评价效果
ini
JavaScript html jquery Web css
效果体验:http://hovertree.com/texiao/jquery/5.htmHTML文件代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>jQuery用户数字打分评分代码 - HoverTree</
mybatis的paramType
kerryg
DAO sql
MyBatis传多个参数:
1、采用#{0},#{1}获得参数:
Dao层函数方法:
public User selectUser(String name,String area);
对应的Mapper.xml
<select id="selectUser" result
centos 7安装mysql5.5
MrLee23
centos
首先centos7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb,以下为卸载mariadb,安装mysql的步骤。
#列出所有被安装的rpm package rpm -qa | grep mariadb
#卸载
rpm -e mariadb-libs-5.
利用thrift来实现消息群发
qifeifei
thrift
Thrift项目一般用来做内部项目接偶用的,还有能跨不同语言的功能,非常方便,一般前端系统和后台server线上都是3个节点,然后前端通过获取client来访问后台server,那么如果是多太server,就是有一个负载均衡的方法,然后最后访问其中一个节点。那么换个思路,能不能发送给所有节点的server呢,如果能就
实现一个sizeof获取Java对象大小
teasp
java HotSpot 内存 对象大小 sizeof
由于Java的设计者不想让程序员管理和了解内存的使用,我们想要知道一个对象在内存中的大小变得比较困难了。本文提供了可以获取对象的大小的方法,但是由于各个虚拟机在内存使用上可能存在不同,因此该方法不能在各虚拟机上都适用,而是仅在hotspot 32位虚拟机上,或者其它内存管理方式与hotspot 32位虚拟机相同的虚拟机上 适用。
SVN错误及处理
xiangqian0505
SVN提交文件时服务器强行关闭
在SVN服务控制台打开资源库“SVN无法读取current” ---摘自网络 写道 SVN无法读取current修复方法 Can't read file : End of file found
文件:repository/db/txn_current、repository/db/current
其中current记录当前最新版本号,txn_current记录版本库中版本