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 中去获取

posted @ 2022-05-15 23:14  ppqppl  阅读(54)  评论(0编辑  收藏  举报