JavaWeb相关知识点整理

一、Thymeleaf服务器端Java模板引擎

​ 模板引擎:jsp、Velocity、Freemarker、Thymeleaf(Spring Boot推荐)

​ 思想:模板引擎作用是写一个页面模板,比如一些值是动态的,写一些表达式,这些值从哪里来?是组装一些数据,找到,然后把模板和数据交给模板引擎,模板引擎按照数据解析表达式填充到指定位置,最终生成想要的内容,写出去。

在这里插入图片描述

什么是模板引擎?

​ 相对html+js的传统设计,现在很多网站都采用div&css+标签化+ 模块化 的设计 。模板引擎根据一定的语义,将数据填充到模板中,产生最终的HTML页面 模板引擎。主要分两种,客户端引擎和服务端引擎。

​ 客户端渲染: 模板和数据分别传送到客户端,在客户端由JavaScript模板引擎渲染出最终的HTML视图。将模板渲染放置在客户端做,可以降低服务端的压力,并且如果前端内容分别来自多个后台系统,而这些后台的架构各不相同(Java、.NET、Ruby等),则服务器端渲染需要采用不同的技术,模板资源无法共享。

​ 服务端渲染:引擎在服务器端将模板和数据合成,返回最终的html页面,相对于客户端渲染,数据存储更加安全。主要有freemarker、velocity、thymeleaf等。

img

什么是Thymeleaf?

​ Thymeleaf是一个现代服务器端Java模板引擎,适用于Web和独立环境,能够处理HTML,XML,JavaScript,CSS甚至纯文本。Thymeleaf利用最少的IO操作来获得更快的速度,使用thymeleaf模板引擎加快了前后端开发工作的并行运作。Thymeleaf还提供了国际化。Thymeleaf提供了最基础的两个编程API:ServletContextTemplateResolverTemplateEngineServletcontexttemplateresolver负责解析模板、Templateengine使用templateengine process()方法处理模板数据。模板引擎表达式可以从properties文件和WebContext获取属性值从而展示到页面。

​ Thymeleaf的主要目标是提供一种优雅且高度可维护的模板创建方式。为实现这一目标,它以自然模板的概念为基础,将其逻辑注入模板文件,其方式不会影响模板被用作设计原型。这改善了设计沟通,缩小了设计和开发团队之间的差距。

​ thymeleaf最大的优势后缀为html,所以能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用。还有就是thymeleaf可以很好的和spring集成,Spring的官方文档中很多部分的渲染都是用这个。

​ Thymeleaf跟velocity, jsp等有很大的差别,它的语法结构更像angular等在tag的属性里加上一些东西来做渲染的,因为它本身就是一个加入了特别的tag property的Html文件,只是不经过服务端渲染的话,数据和逻辑等东西不会在html中体现而已。

学习链接记录:

https://tutorial.e-learn.cn/read/thymeleaf/standardurlsyntax

https://blog.csdn.net/howard2005/article/details/79346404?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

Thymeleaf的特点

  • 动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
  • 开箱即用:它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
  • 多方言支持:Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
  • 与SpringBoot完美整合,SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区别。

问题:动态页面技术已经有JSP,为什么还要用Thymeleaf?

主要原因包括以下几点:

  1. 使用模块引擎来编写动态页面,让开发人员无法在页面上编写 Java 代码,使得java代码和前端代码绝对的分离。
  2. SpringBoot默认整合Thymeleaf,不需要任何配置直接整合成功,打jar包发布不需要做任何配置。
  3. Thymeleaf相对于其他的模板引擎(如:Freemaker、velocity),有强大的工具支持。
  4. 相对于Jsp页面,执行效率高。

Thymeleaf:

官网:http://www.thymeleaf.org/
1.引入thymeleaf
<!--thymeleaf模板引擎,无需再引入web模块-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2.thymeleaf使用&语法

在properties或yml中可以配置thymeleaf模板解析器属性,下面是部分yml格式的属性

  # THYMELEAF (ThymeleafAutoConfiguration)
spring.thymeleaf:
  #开启模板缓存(默认值:true)
  cache: true

  #Check that the template exists before rendering it.
  check-template: true

  #检查模板位置是否正确(默认值:true)
  check-template-location: true

  #开启MVC Thymeleaf视图解析(默认值:true)
  enabled: true

  #模板编码
  encoding: UTF-8

  #要被排除在解析之外的视图名称列表,用逗号分隔
  spring.thymeleaf.excluded-view-names: 

  #要运用于模板之上的模板模式。另见StandardTemplate-ModeHandlers(默认值:HTML5)
  mode: HTML5

  #在构建URL时添加到视图名称前的前缀(默认值:classpath:/templates/)
  prefix: classpath:/templates/

  #在构建URL时添加到视图名称后的后缀(默认值:.html)
  suffix: .html

  #Thymeleaf模板解析器在解析器链中的顺序。默认情况下,它排第一位。顺序从1开始,
  #只有在定义了额外的TemplateResolver Bean时才需要设置这个属性。
  template-resolver-order:

  #可解析的视图名称列表,用逗号分隔
  spring.thymeleaf.view-names:

只要把HTML页面放在classpath/templates/,thymeleaf就能自动渲染;

使用:

​ 1.导入thymeleaf的名称空间(语法提示)

<html lang="en" xmlns:th="http://www.thymeleaf.org">

​ 2.使用thymeleaf语法

​ th:text="${hello}"

3.语法规则

  1. th:test:改变当前元素里面的文本内容

​ th:任意html属性;-------来替换原生属性的值

2)表达式语法:

简单表达式:
	可用值表达式(后台设置): ${…} 获取变量值:OGNL
			1)获取对象的属性、调用方法
			2)使用内置的基本对象,如#ctx、#vars、#locale、#request、#response、#session、						#servletContext
			  	#ctx:上下文对象
  				#vars:上下文变量
  				#locale:上下文语言环境
  				#httpServletRequest:(只有在Web上下文)HttpServletRequest对象
  				#httpSession:(只有在Web上下文)HttpSession对象。
				用法:<span th:text="${#locale.country}">US</span>.

			3)内置的工具对象,如#numbers、#message、#uris、#dates
				#dates: java.util的实用方法。对象:日期格式、组件提取等.
				#calendars:类似于#日期,但对于java.util。日历对象
				#numbers:格式化数字对象的实用方法。
				#strings:字符串对象的实用方法:包含startsWith,将/附加等。
				#objects:实用方法的对象。
				#bools:布尔评价的实用方法。
				#arrays:数组的实用方法。
				#lists:list集合。
				#sets:set集合。
				#maps:map集合。
				#aggregates:实用程序方法用于创建聚集在数组或集合.
				#messages:实用程序方法获取外部信息内部变量表达式,以同样的方式,因为它们将获得使用    							#{…}语法
				#ids:实用程序方法来处理可能重复的id属性(例如,由于迭代)。
			   <span th:text="${information}">
			
	所有可用值表达式: *{…} 选择表达式:和${}在功能上一样
		补充:配合 th:object = "${session.user}"
			<div th:object="${session. user}" >
				Name: <span th: text=" *{firstName}" >Sebastian.
				Surname: <span th: text=" *{lastName}" >Pepper.
				Nationality: <span th: text=" *{nationality}" >Saturn.
			</div>
			
	消息表达式: #{…} 国际化时使用,也可以使用内置的对象,比如date格式化数据
	链接表达式: @{…} 用来配合link src href使用的语法,可以链接目录下的静态资源,也可以链接到后端请求处				理接口
			
	片段表达式: ~{…} 用来引入公共部分代码片段,并进行传值操作使用的语法。

字面值:
	文本: ‘one text’,’another text’,…
	数字: 1,2,1.2,…
	布尔: true,false
	空值:null
	文字标记: something,main,name,one,sometext, main,…
	
文本操作:
	并置:+
	替换:|The name is ${name}|
	html
	<a href="" th:href="@{|/name/${test.size()}|}">链接地址:</a>
	//渲染后的结果
	<a href="/name/3">链接地址:</a>
	
数学操作:
	二元操作:+, - , * , / , %
	一元操作: - (负)
	布尔操作

	一元 : and or
	二元 : !,not
	
比较:
	比较:> , < , >= , <= ( gt , lt , ge , le )
	等于:== , != ( eq , ne )
	
条件:
	If-then: (if) ? (then)
	If-then-else: (if) ? (then) : (else)
	Default: (value) ?: (defaultvalue)
	
无操作
	使用_ 来禁止转义。

https://blog.csdn.net/u014042066/article/details/75614906?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

二、Lambda表达式

​ Lambda 表达式,也可称为闭包,它是 Java 8 发布的新特性。

​ Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

​ 使用 Lambda 表达式可以使代码变的更加简洁紧凑。

新特性

Java8 新增了非常多的特性:

  • Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
  • 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
  • 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
  • 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
  • Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
  • Date Time API − 加强对日期与时间的处理。
  • Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
  • Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
使用匿名内部类存在的问题

当需要启动一个线程去完成任务时,通常会通过Runnable接口来定义任务内容,并使用Thread类来启动线程。

//使用匿名内部类
//面向对象冗余
//创建一个Runnable接口的匿名内部类对象来指定线程要执行的任务内容,再将其交给一个线程来启动
        new Thread(new Runnable(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值