thymeleaf可以完全替代jsp(为什么要用thymeleaf)

http://www.itjxue.com  2023-01-30 09:13  来源:未知  点击次数: 

现在什么技术取代了jsp

Spring Boot一部分取代了jsp:

以前老的方式是:

1.客户端请求

2.服务端的servlet或controller接收请求(路由规则由后端制定,整个项目开发的权重大部分在后端)

3.调用service,dao代码完成业务逻辑

4.返回jsp

5.jsp展现一些动态的代码

新的方式是:

1.浏览器发送请求

2.直接到达html页面(路由规则由前端制定,整个项目开发的权重前移)

3.html页面负责调用服务端接口产生数据(通过ajax等等)

4.填充html,展现动态效果。

(有兴趣的童鞋可以访问一下阿里巴巴等大型网站,然后按一下F12,监控一下你刷新一次页面,他的http是怎么玩的,大多数都是单独请求后台数据,使用json传输数据,而不是一个大而全的http请求把整个页面包括动+静全部返回过来)

这样做的好处是:

1.可以实现真正的前后端解耦,前端服务器使用nginx。

前端服务器放的是css,js,图片等等一系列静态资源(甚至你还可以css,js,图片等资源放到特定的文件服务器,例如阿里云的oss,并使用cdn加速),前端服务器负责控制页面引用,跳转,调用后端的接口,后端服务器使用tomcat。

(这里需要使用一些前端工程化的框架比如nodejs,react,router,react,redux,webpack)

2.发现bug,可以快速定位是谁的问题,不会出现互相踢皮球的现象。

页面逻辑,跳转错误,浏览器兼容性问题,脚本错误,页面样式等问题,全部由前端工程师来负责。

接口数据出错,数据没有提交成功,应答超时等问题,全部由后端工程师来解决。

双方互不干扰,前端与后端是相亲相爱的一家人。

3.在大并发情况下,我可以同时水平扩展前后端服务器,比如淘宝的一个首页就需要2000台前端服务器做集群来抗住日均多少亿+的日均pv。

(去参加阿里的技术峰会,听他们说他们的web容器都是自己写的,就算他单实例抗10万http并发,2000台是2亿http并发,并且他们还可以根据预知洪峰来无限拓展,很恐怖,就一个首页。。。)

4.减少后端服务器的并发压力,除了接口以外的其他所有http请求全部转移到前端nginx上。

5.即使后端服务暂时超时或者宕机了,前端页面也会正常访问,只不过数据刷不出来而已。

6.也许你也需要有微信相关的轻应用,那样你的接口完全可以共用,如果也有app相关的服务,那么只要通过一些代码重构,也可以大量复用接口,提升效率。

7.页面显示的东西再多也不怕,因为是异步加载。

vue和thymeleaf区别

Thymeleaf和vue不是一类事务。

模板引擎:Thymeleaf、freemarker、JSP。

前端框架:vue、angularjs、react。

Thymeleaf是一个替代JSP的模板引擎。

使用Thymeleaf或其他模板的时候也可以使用前端框架。

spring-boot 适合开发web应用吗

spring-boot 适合开发web应用的

静态资源访问

在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。

默认配置

Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:

/static

/public

/resources

/META-INF/resources

举例:我们可以在src/main/resources/目录下创建static,在该位置放置一个图片文件。启动程序后,尝试访问。如能显示图片,配置成功。

渲染Web页面

在之前的示例中,我们都是通过@RestController来处理请求,所以返回的内容为json对象。那么如果需要渲染html页面的时候,要如何实现呢?

模板引擎

在动态HTML实现上Spring Boot依然可以完美胜任,并且提供了多种模板引擎的默认配置支持,所以在推荐的模板引擎下,我们可以很快的上手开发动态网站。

Spring Boot提供了默认配置的模板引擎主要有以下几种:

Thymeleaf

FreeMarker

Velocity

Groovy

Mustache

Spring Boot建议使用这些模板引擎,避免使用JSP,若一定要使用JSP将无法实现Spring Boot的多种特性,具体可见后文:支持JSP的配置

当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在后续各模板引擎的配置属性中查询并修改。

Thymeleaf

Thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于Apache License 2.0许可,由Daniel Fernández创建,该作者还是Java加密库Jasypt的作者。

Thymeleaf提供了一个用于整合Spring MVC的可选模块,在应用开发中,你可以使用Thymeleaf来完全代替JSP或其他模板引擎,如Velocity、FreeMarker等。Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型)上执行预先制定好的逻辑。

thymeleaf 能执行java代码吗

简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下三个极吸引人的特点:

1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。

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

3.Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。

标准表达式语法

它们分为四类:

1.变量表达式

2.选择或星号表达式

3.文字国际化表达式

4.URL表达式

变量表达式

变量表达式即OGNL表达式或Spring EL表达式(在Spring术语中也叫model attributes)。如下所示:${session.user.name}

它们将以HTML标签的一个属性来表示:

span th:text="${book.author.name}" ?li th:each="book : ${books}"

选择(星号)表达式

选择表达式很像变量表达式,不过它们用一个预先选择的对象来代替上下文变量容器(map)来执行,如下:*{customer.name}

被指定的object由th:object属性定义:

div th:object="${book}"

...

span th:text="*{title}".../span

...

/div

文字国际化表达式

文字国际化表达式允许我们从一个外部文件获取区域文字信息(.properties),用Key索引Value,还可以提供一组参数(可选).

#{main.title}

#{message.entrycreated(${entryId})}

可以在模板文件中找到这样的表达式代码:

table

...

th th:text="#{header.address.city}".../th

th th:text="#{header.address.country}".../th

...

/table

URL表达式

URL表达式指的是把一个有用的上下文或回话信息添加到URL,这个过程经常被叫做URL重写。@{/order/list}URL还可以设置参数:@{/order/details(id=${orderId})}相对路径:@{../documents/report}

让我们看这些表达式:

form th:action="@{/createOrder}"

a href="main.html" th:href="@{/main}"

变量表达式和星号表达有什么区别吗?

如果不考虑上下文的情况下,两者没有区别;星号语法评估在选定对象上表达,而不是整个上下文什么是选定对象?就是父标签的值,如下:

div th:object="${session.user}"

pName: span th:text="*{firstName}"Sebastian/span./p

pSurname: span th:text="*{lastName}"Pepper/span./p

pNationality: span th:text="*{nationality}"Saturn/span./p

/div

这是完全等价于:

div th:object="${session.user}"

pName: span th:text="${session.user.firstName}"Sebastian/span./p

pSurname: span th:text="${session.user.lastName}"Pepper/span./p

pNationality: span th:text="${session.user.nationality}"Saturn/span./p

/div

当然,美元符号和星号语法可以混合使用:

div th:object="${session.user}"

pName: span th:text="*{firstName}"Sebastian/span./p

pSurname: span th:text="${session.user.lastName}"Pepper/span./p

pNationality: span th:text="*{nationality}"Saturn/span./p

/div

表达式支持的语法

字面(Literals)

文本文字(Text literals):?'one text', 'Another one!',…

数字文本(Number literals):?0, 34, 3.0, 12.3,…

布尔文本(Boolean literals):?true, false

空(Null literal):?null

文字标记(Literal tokens):?one, sometext, main,…

文本操作(Text operations)

字符串连接(String concatenation):?+

文本替换(Literal substitutions):?|The name is ${name}|

算术运算(Arithmetic operations)

二元运算符(Binary operators):?+, -, *, /, %

减号(单目运算符)Minus sign (unary operator):?-

布尔操作(Boolean operations)

二元运算符(Binary operators):and, or

布尔否定(一元运算符)Boolean negation (unary operator):!, not

比较和等价(Comparisons and equality)

比较(Comparators):?, , =, = (gt, lt, ge, le)

等值运算符(Equality operators):==, != (eq, ne)

条件运算符(Conditional operators)

If-then:?(if) ? (then)

If-then-else:?(if) ? (then) : (else)

Default: (value) ?:?(defaultvalue)

所有这些特征可以被组合并嵌套:

'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))

2022没必要学jsp了吗

答案是非也,

真正过时的是jsp的那些标签指令,JSP的应用场景还是以服务端渲染SSR偏多,对于有搜索引擎优化和首屏渲染速度有要求的项目JSP还是挺不错的,例如资讯类网站,宣传类网站,servlet/jsp是Oracle官方支持的模板引擎,自然是值得信赖的。虽然类似于Freemarker、thymeleaf等模板引擎可以完全替代jsp,但我想说的是为什么要增加自己的学习成本?同样可以用JSP做的事情总是变着花样来折磨自己不累么?

多花点时间陪陪家人,给自己娱乐不好么?对于我个人而言能用官方推荐的东西完成的一律用官方的,坚决不用第三方的,除非官方没有的

(责任编辑:IT教学网)

更多

推荐数据库文章