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

一、变量表达式

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}"来展示,结果如下:
&lt;span style=&quot;color:red&quot;&gt;囡&lt;/span&gt;

如果要保持原样,使用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、链接表达式的几种格式

假设context-path为blog
表达式处理结果访问路径
绝对路径@{http://xx}http://xxhttp://xx
页面相对路径@{xx}xxhttp://ip:port/blog/xx
上下文相对路径@{/xx}/blog/xxhttp://ip:port/blog/xx
服务器相对路径@{~xx}/xxhttp://ip:port/xx
协议相对路径@{//xx}//xxxx

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&amp;name=sun"></a>

4、路径拼接参数

<a th:href="@{/xx{id}(id=${user.id})}"></a>

访问http://localhost:8080/link  查看网页源代码:<a href="/xx1"></a>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值