变量表达式、信息表达式、链接表达式

一、变量表达式

1、设置和读取变量

在Java代码中设置变量:

        Context ctx = new Context();
        ctx.setVariable("userName", "Angus");

在模板中获取变量值:

${userName}

 ${ognl表达式},称为变量表达式

2、其他情况下如何从变量读取数据

①模板文件mix_var.html

获取变量中的属性的属性:
获取List中的第1个元素:
获取Map中的元素:
获取数组中的的第2个元素:

②创建测试方法

    @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 users = new ArrayList();
        users.add(new User(1, "Angus.L"));
        users.add(new User(2, "Paris.L"));
        ctx.setVariable("users", users);
        // 设置Map变量
        Map userMap = new HashMap();
        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依赖

        
            org.thymeleaf
            thymeleaf
            3.0.9.RELEASE
        

② 创建externalized.html

This is prototype text.

③ 创建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);
    }
}

输出:This is config text.

⑤ 解析#{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

Prototpye text

③创建测试方法

    @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文件:女儿
           使用zh_CN-shaoxing.properties文件:

3、处理转义文本

在html页面中,有些符号不是它本身的含义了,而是有了另外的意义,这就是转义文本。

比如“<”,本身的含义是小于,但在html中却是标签的一部分,不是小于的意思了。但如果用th:text来处理属性时,输出的是原意,例如:

假如属性文件存在  html.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

Prototype content

③创建属性文件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);
	}

 输出:

你好,Angus, 你的id是:1

三、链接表达式

1、链接表达式的几种格式

假设context-path为blog
表达式 处理结果 访问路径
绝对路径 @{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和控制器

@Controller
public class LinkController {
	@GetMapping("/link")
	public String link(HttpServletRequest request) {
		request.setAttribute("user",new User(1, "sun"));
		return "link";
	}

}

访问http://localhost:8080/link  查看网页源代码:

3、设置多个URL参数

参数之间用逗号隔开

访问http://localhost:8080/link  查看网页源代码:

4、路径拼接参数

访问http://localhost:8080/link  查看网页源代码:

注意:/开头的URL只能用在web环境下

你可能感兴趣的:(#,springboot,spring,boot)