一、变量表达式
1、设置和读取变量
在Java代码中设置变量:
Context ctx = new Context();
ctx.setVariable("userName", "Angus");
在模板中获取变量值:
${userName}
${ognl表达式},称为变量表达式
2、其他情况下如何从变量读取数据
①模板文件mix_var.html
获取变量中的属性的属性:<span th:text="${user['parent']['age']}"></span>
获取List中的第1个元素:<span th:text="${users[0].name}"></span>
获取Map中的元素:<span th:text="${userMap['key1'].name}"></span>
获取数组中的的第2个元素:<span th:text="${userArr[1].name}"></span>
②创建测试方法
@Test
public void testMixVar() {
TemplateEngine templateEngine = new TemplateEngine();
// 设置模板解析器
templateEngine.setTemplateResolver(new ClassLoaderTemplateResolver());
Context ctx = new Context();
// 设置User的Parent属性
User user = new User();
Parent parent = new Parent();
parent.setAge(10);
user.setParent(parent);
ctx.setVariable("user", user);
// 设置集合变量
List<User> users = new ArrayList<User>();
users.add(new User(1, "Angus.L"));
users.add(new User(2, "Paris.L"));
ctx.setVariable("users", users);
// 设置Map变量
Map<String, User> userMap = new HashMap<String, User>();
userMap.put("key1", new User(1, "Angus.M"));
userMap.put("key2", new User(2, "Paris.M"));
ctx.setVariable("userMap", userMap);
// 设置数组
User[] userArr = new User[]{new User(1, "Angus.A"), new User(2, "Paris.A")};
ctx.setVariable("userArr", userArr);
String result = templateEngine.process("mix_var.html", ctx);
System.out.println(result);
}
③获取的变量为null情况
获取的变量为null,则获取它的类属性(貌似不行),或者抛出org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating OGNL expression,注意不是空指针异常。
注意:如果web应用使用了Spring MVC,则OGNL将会被替换为SpringEL。
二、信息表达式
1、读取配置文件里的属性
语法:#{key}等同于$(#messages.msg(key))
① 创建普通的maven工程,引入Thymeleaf依赖
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
② 创建externalized.html
<span th:text="#{page.myText}">This is prototype text.</span>
③ 创建externalized.properties(注意:主文件名同上)
page.myText=This is config text.
④ 创建测试类及测试方法
public class ThymeleafTest {
@Test
public void testExternalized() {
TemplateEngine templateEngine = new TemplateEngine();
// 创建解析器
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
// 设置到模板引擎中
templateEngine.setTemplateResolver(resolver);
// 处理classpath下的 externalized.html 文件
String result = templateEngine.process("externalized.html", new Context());
System.out.println(result);
}
}
输出:<span>This is config text.</span>
⑤ 解析#{page.myText}过程
当解析模板中的#{page.myText}时,Thymeleaf会调用java.util.Locale的getLanguage、getCountry、getVariant这些方法去获取语言代码、国家代码、方言,再依次寻找下面所示的属性文件,如果存在,就到里面找page.myText属性,如果找到,停止查找:
模板名称_语言代码_国家代码-方言.properties(注意:最后一个分隔符是中划线)
模板名称_语言代码_国家代码.properties
模板名称_语言代码.properties
模板名称.properties
所以找到了externalized.properties。详细例子看下面
2、文本国际化
从上文所述可知,thymeleaf解析模板中的#{key}的过程。根据这个过程,我们推出只要设置好Locale以及属性文件名称,就可以国际化信息。
①使用不同语言表达同一信息
i18n_zh_CN-beijing.properties
i18n.daughter=女儿
i18n_zh_CN-shaoxing.properties
i18n.daughter=囡
②创建模板i18n.html
<span th:text="#{i18n.daughter}">Prototpye text</span>
③创建测试方法
@Test
public void testI18n() {
TemplateEngine templateEngine = new TemplateEngine();
// 创建解析器
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
// 设置到模板引擎中
templateEngine.setTemplateResolver(resolver);
// 处理classpath下的 html 文件
Context ctx = new Context();
// 本机默认的Local为 zh、CN
Locale maLocale = new Locale("zh", "CN", "beijing");
ctx.setLocale(maLocale);
String result = templateEngine.process("i18n.html", ctx);
System.out.println("使用zh_CN-beijing.properties文件:" + result);
// ============ 使用新的 Locale ============
Context ctx2 = new Context();
Locale dbLocale = new Locale("zh", "CN", "shaoxing");
ctx2.setLocale(dbLocale);
result = templateEngine.process("i18n.html", ctx2);
System.out.println("使用zh_CN-shaoxing.properties文件:" + result);
}
输出:使用zh_CN-beijing.properties文件:<span>女儿</span>
使用zh_CN-shaoxing.properties文件:<span>囡</span>
3、处理转义文本
在html页面中,有些符号不是它本身的含义了,而是有了另外的意义,这就是转义文本。
比如“<”,本身的含义是小于,但在html中却是标签的一部分,不是小于的意思了。但如果用th:text来处理属性时,输出的是原意,例如:
假如属性文件存在 html.span=<span style="color:red">囡</span>
模板中使用 th:text="#{html.span}"来展示,结果如下:
<span style="color:red">囡</span>
如果要保持原样,使用th:utext="#{html.span}"
4、在消息表达式中使用变量
在消息表达式中使用变量 : #{属性名(${变量}, ${变量},......)}
①创建User类、Parent类
public class User {
private Integer id;
private String name;
private Parent parent;
public User() {
super();
}
public User(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
public void printUser(Integer id, String name) {
System.out.println("User类的print方法:" + id + ", " + name);
}
}
public class Parent {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
②创建模板文件visit_var.html
<div th:text="#{data.key(${user.name}, ${user.id})}">Prototype content</div>
③创建属性文件visit_var.properties
data.key=你好,{0}, 你的id是:{1}
④创建测试方法
@Test
public void testVisitVar() {
TemplateEngine templateEngine = new TemplateEngine();
// 设置模板解析器
templateEngine.setTemplateResolver(new ClassLoaderTemplateResolver());
Context ctx = new Context();
User user = new User();
user.setId(1);
user.setName("Angus");
ctx.setVariable("user", user);
String result = templateEngine.process("visit_var.html", ctx);
System.out.println(result);
}
输出:<div>你好,Angus, 你的id是:1</div>
三、链接表达式
1、链接表达式的几种格式
表达式 | 处理结果 | 访问路径 | |
---|---|---|---|
绝对路径 | @{http://xx} | http://xx | http://xx |
页面相对路径 | @{xx} | xx | http://ip:port/blog/xx |
上下文相对路径 | @{/xx} | /blog/xx | http://ip:port/blog/xx |
服务器相对路径 | @{~xx} | /xx | http://ip:port/xx |
协议相对路径 | @{//xx} | //xx | xx |
2、设置单个URL参数
创建springboot项目,引入Thymeleaf依赖和Web场景依赖,复制上面的User和Parent类,创建模板文件link.html和控制器
<a th:href="@{/xx(id=${user.id})}"></a>
@Controller
public class LinkController {
@GetMapping("/link")
public String link(HttpServletRequest request) {
request.setAttribute("user",new User(1, "sun"));
return "link";
}
}
访问http://localhost:8080/link 查看网页源代码:<a href="/xx?id=1"></a>
3、设置多个URL参数
参数之间用逗号隔开
<a th:href="@{/xx(id=${user.id},name=${user.name})}"></a>
访问http://localhost:8080/link 查看网页源代码:<a href="/xx?id=1&name=sun"></a>
4、路径拼接参数
<a th:href="@{/xx{id}(id=${user.id})}"></a>
访问http://localhost:8080/link 查看网页源代码:<a href="/xx1"></a>
注意:/开头的URL只能用在web环境下