7.8.2 稍微复杂的对象
案例:创建一个Employee002类,但是Employee02类中将一个Computer类作为自己的成员属性,在请求域内共享Employee002类的对象emp02,rootServlet调用Thymeleaf渲染root.html并响应给客户端,root.html要显示动态数据(请求域内的稍微复杂的对象emp02)
代码演示如下:
//创建Employee02类 public class Employee02 { private Integer id; private String name; private Integer gender; //0 男 1 女 private Double salary; private Computer computer;//对象关联 public Employee02(Integer id, String name, Integer gender, Double salary, Computer computer) { this.id = id; this.name = name; this.gender = gender; this.salary = salary; this.computer = computer; } public Employee02() { } @Override public String toString() { return "Employee02{" + "id=" + id + ", name='" + name + '\'' + ", gender=" + gender + ", salary=" + salary + ", computer=" + computer + '}'; } 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 Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } public Computer getComputer() { return computer; } public void setComputer(Computer computer) { this.computer = computer; } }
//创建Computer类 public class Computer { private Integer id; private String brand; private double price; public Computer() { } @Override public String toString() { return "Computer{" + "id=" + id + ", brand='" + brand + '\'' + ", price=" + price + '}'; } public Computer(Integer id, String brand, double price) { this.id = id; this.brand = brand; this.price = price; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }
//在rootServle中创建一个employee02对象,渲染root.html后响应给客户端 Employee02 employee02=new Employee02(102,"熊二",1,34567d,new Computer(1,"联想",5000.0) //请求域内共享一个稍微复杂的对象 request.setAttribute("emp02",employee02); //调用Thymeleaf渲染root.html页面,响应给客户端 this.processTemplate("root",request,response);
//root.html获取请求域内emp02的相关属性 复杂对象: <div th:text="${emp02}"></div> <div th:text="${emp02.id}"></div> <div th:text="${emp02.name}"></div> <div th:text="${emp02.salary}"></div> Kdiv th:text="${emp02.computer}"></div> //调用的是emp02的电脑对象的getId()的返回值,下同 <div th:text="{emp02.computer.id}"></div> <div th:text="$emp02.computer.brand}"></div> <div th:text="$empe2.computer.price}"></div>
7.8.3 list集合(简单集合)
案例:在请求域内共享list集合,rootServlet调用Thymeleaf渲染root.html网页并响应给客户端,root.html要显示动态数据(请求域内的list集合)
代码演示如下:
//请求域内共享一个list集合 List<String> strs=new ArrayList<>(); strs.add("法外狂徒张三"); strs.add("法外狂徒李四"); strs.add("法外狂徒王五"); request.setAttribute("strs",strs); //调用Thymeleaf渲染root.html并响应给客户端 this.processTemplate("root",request,response);
<p>list集合</p> <p th:text="${strs}"></p> //从请求域中获取list集合strs中下标为0的元素(第0+1个元素),下同 <p th:text="${strs[0]}"></p> <p th:text="${strs[1]}"></p> <p th:text="${strs[2]}"></p>
7.8.4 复杂集合(list集合存储对象)
案例:在请求域内共享复杂集合,集合内放三个Employee类的对象,rootServlet调用Thymeleaf渲染root.html,在root.html中要显示动态数据(请求域内的复杂集合)
代码示例如下:
//请求域内共享复杂集合 List<Employee> emps=new ArrayList<>(); emps.add(new Employee(101,"法外狂徒张三",0,500000.0)); emps.add(new Employee(102,"法外狂徒李四",1,68787.0)); emps.add(new Employee(103,"法外狂徒王五",1,198687.0)); request.setAttribute("emps",emps); //调用Thymeleaf渲染root.html并响应给客户端 this.processTemplate("root",request,response);
<p>复杂集合</p> <p th:text="${emps}"></p> //获取集合中第一个对象的toString()的返回值 <p th:text="${emps[0]}"></p> //获取集合中第一个对象的getId()的返回值 <p th:text="${emps[0].id}"></p> //获取集合中第一个对象的getName()的返回值 <p th:text="${emps[0].name}"></p>
总结:
遇到对象就通过.属性名的方式去获取属性值(原理是调用get方法)
遇到Lst集合就通过下标获得到元素,如果元素是对象的话,还是回到上一句
7.8.5 复杂集合(map集合存储对象)
遇到Map集合就通过.key值的方式获得value值,如果value值是对象的话,遇到对象就通过.属性名的方式去获取属性值(原理是调用get方法)
案例:请求域内共享map集合,rootServlet调用Thymeleaf渲染root.html后响应给客户端,root.html要显示动态数据(请求域内的map集合)
代码示例如下:
//请求域内共享map集合 Map<String,Employee> map=new HashMap<>(); map.put("emp01",new Employee(101,"法外狂徒张三",0,500000.0)); map.put("emp02",new Employee(102,"法外狂徒李四",1,68787.0)); map.put("emp03",new Employee(103,"法外狂徒王五",1,198687.0)); request.setAttribute("map",map); //调用Thymeleaf渲染root.html并响应给客户端 this.processTemplate("root",request,response);
<p>map集合</p> <p th:text="${map}"></p> //获取请求域内map集合的key值为emp01的value值 <p th:text="${map.emp01}"></p> //获取请求域内map集合的key值为emp01的value值(对象)的getId()的返回值,下同 <p th:text="${map.emp01.id}"></p> <p th:text="${map.emp02.name}"></p>
7.9 分支与迭代
7.9.1 分支,控制元素的是否显示
7.9.1.1 th:if 和 th:unless
语法:
th:if=""
: 值如果是true,元素就显示,值如果是false,就不显示
th:unless=""
: 和if反过来即可案例:请求域内共享msg数据,调用Thymeleaf渲染页面并呼应给客户端,页面内使用h:if
或th:unless等渲染表达式去判断msg数据的长度
代码示例如下:
//在请求域中共享msg数据 request.setAttribute("msg","这是msg数据"); this.processTemplate("toif",request,response);
<p>th:if/unless</p> <p th:text="${msg}"></p> <p th:if="${#strings.length(msg)>5}">msg的数据长度大于5就显示</p> <p th:if="${#strings.length(msg)<=5}">msg的数据长度小于或等于5就显示(1)</p> <p th:unless="${#strings.length(msg)>5}">msg的数据长度小于或等于5就显示(2)</p> <p th:unless="${not (#strings.length(msg)<=5)}">msg的数据长度小于或等于5就显示(3)</p>
7.9.1.2 th:switch和th:case
语法:
th:switch=“” (看switch中的数据和哪个case相同,有相同的就显示哪个)
th:case=“”
案例:请求域内共享msg数据,调用Thymeleaf渲染页面并呼应给客户端,页面内使用渲染表达式th:switch和th:case去判断msg数据的长度并显示结果
代码示例如下:
request.setAttribute("msg","这是msg"); this.processTemplate("toif",request,response);
<div th:switch="${#strings.length(msg)}"> <p th:case="1">长度为1</p> <p th:case="2">长度为2</p> <p th:case="3">长度为3</p> <p th:case="4">长度为4</p> <p th:case="5">长度为5</p> </div>
7.9.2 迭代(遍历循环)
语法:
th:each=“obj,status:后台请求域中数据的key”
7.9.2.1 简单数组迭代
案例:请求域内共享一个list集合,调用thymeleaf渲染页面并响应给客户端,页面使用渲染表达式th:each去遍历请求域内list集合,在无序列表中显示
代码示例如下:
//请求域内共享一个list集合 List<String> strs=new ArrayList<>(); strs.add("法外狂徒张三"); strs.add("法外狂徒李四"); strs.add("法外狂徒王五"); request.setAttribute("strs",strs);
//迭代从请求域获得的list集合strs,并在无序列表中显示 <ul> <li th:each="str,status :${strs}" th:text="${str}"></li>
7.9.2.2 复杂数组迭代
案例:请求域内共享一个list集合(装三个Employee类的对象),调用thymeleaf渲染页面并响应给客户端,页面使用渲染表达式th:each去遍历请求域内的list集合,在表格中显示
//请求域内共享复杂集合 List<Employee> emps=new ArrayList<>(); emps.add(new Employee(101,"法外狂徒张三",0,500000.0)); emps.add(new Employee(102,"法外狂徒李四",1,68787.0)); emps.add(new Employee(103,"法外狂徒王五",1,198687.0)); request.setAttribute("emps",emps);
<table border="1" width="300px"> <tr> <td>序号</td> <th>编号</th> <th>姓名</th> <th>性别</th> <th>工资</th> </tr> <tr th:each="emp,status :${emps}"> <!-- status.index是从0开始的 --> <td th:text="${status.index+1}"></td> <td th:text="${emp.id}"></td> <td th:text="${emp.name}"></td> <!-- <td th:if="${emp.gender==0}" th:text="男"></td> <td th:if="${emp.gender==1}" th:text="女"></td> --> <td th:text="${emp.gender==0?'男':'女'}"></td> <td th:text="${emp.salary}"></td> </tr> </table>
7.10 Thymeleaf包含其他模板文件
7.10.1 应用场景
网页内公共代码片段的提取
公共代码片段是什么?
以腾讯视频 pc端为例,无论用户点击了什么频道,网站左侧的红框部分总是在那里,不会改变