Thymeleaf - 视图模板技术
Thymeleaf - 视图模板技术
客户端发请求给 index ,组件 indexServlet 中 service() 方法进行响应 -> doGet()
Servlet 调用 DAO 组件 DAOImpl -> BaseDAO 从数据库中获取数据,再按顺序返回 Servlet
//得到的数据:
List<Fruit> fruitList = fruitDAO.getFruitList();
session.setAttribute("fruitList",fruitList);
response.sendRedirect("index.html"); //使用jsp时可以这么写,作用就是告诉客户端请再发送请求给 index.html
super.process……("index"); //index 对应 index.html
在 index.html 页面上加载 java 内存中的 fruitList 数据,过程被称为"渲染" render
Thymeleaf 就是用来帮助我们做试图渲染的一个技术
要单独进行jar包添加
新建一个 Servlet 类 ViewBaseServlet
public class ViewBaseServlet extends HttpServlet {
private TemplateEngine templateEngine;
@Override
public void init() throws ServletException {
// 1.获取ServletContext对象
ServletContext servletContext = this.getServletContext();
// 2.创建Thymeleaf解析器对象
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
// 3.给解析器对象设置参数
// ①HTML是默认模式,明确设置是为了代码更容易理解
templateResolver.setTemplateMode(TemplateMode.HTML);
// ②设置前缀
String viewPrefix = servletContext.getInitParameter("view-prefix");
templateResolver.setPrefix(viewPrefix);
// ③设置后缀
String viewSuffix = servletContext.getInitParameter("view-suffix");
templateResolver.setSuffix(viewSuffix);
// ④设置缓存过期时间(毫秒)
templateResolver.setCacheTTLMs(60000L);
// ⑤设置是否缓存
templateResolver.setCacheable(true);
// ⑥设置服务器端编码方式
templateResolver.setCharacterEncoding("utf-8");
// 4.创建模板引擎对象
templateEngine = new TemplateEngine();
// 5.给模板引擎对象设置模板解析器
templateEngine.setTemplateResolver(templateResolver);
}
protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 1.设置响应体内容类型和字符集
resp.setContentType("text/html;charset=UTF-8");
// 2.创建WebContext对象
WebContext webContext = new WebContext(req, resp, getServletContext());
// 3.处理模板数据
templateEngine.process(templateName, webContext, resp.getWriter());
}
}
在web.xml文件中添加配置
配置前缀 view-prefix
配置后缀 view-suffix
会在 init 中使用
<!-- 配置上下文参数 -->
<context-param>
<param-name>view-prefix</param-name>
<param-value>/</param-value>
</context-param>
<context-param>
<param-name>view-suffix</param-name>
<param-value>.html</param-value>
</context-param>
使我们的 Servlet 继承 ViewBaseServlet
@WebServlet("/index") //servlet 从 3.0 开始支持注解方式的注册
public class IndexServlet extends ViewBaseServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
FruitDAO fruitDAO = new FruitDAOImpl();
List<Fruit> fruitList = fruitDAO.getFruitList();
//保存到session作用域中
HttpSession session = req.getSession();
session.setAttribute("fruitList",fruitList);
super.processTemplate("index",req,resp);
}
}
根据逻辑视图名称得到物理视图名称
//此处视图名称是 index
//thymeleaf 会将这个逻辑视图名称对应到物理视图名称上去
//逻辑视图名称 :index
//物理视图名称 : view-prefix + 逻辑视图名称 + view-suffix
//所以真是的视图名称是: / index .html 即路径中的 /index.html
super.processTemplate("index",request,response);
thymeleaf 语法
判断 lists 是否为空,使用方式如下:
<tr th:if="${#lists.isEmpty(session.fruitList)}">
<td colspan="4">对不起,库存为空!</td>
</tr>
<tr th:unless="${#lists.isEmpty(session.fruitList)}">
<td>苹果</td> <!-- text就是用来覆盖已经协定的文本内容的 -->
<td>5</td>
<td>20</td>
<td><img src="imgs/del.jpg" class="delImg"/></td>
</tr>
括号中写:作用域名 + key 值作为要进行判断的 list 数组名称
thi:if 和 th:unless 就是平时使用的 if / else
循环使用迭代标签,th:each 就是表示循环:th:each="临时变量名称 : ${ 列表 }"
其中列表名称如果前面加上 “作用域.” 就是在指定作用狱中的列表,否则就是从 request 中去获取