模板其实就是一个(缺失了一些关键信息)的html页面,我使用的是Thymeleaf模板
使用模板的步骤:
(1)先去编写html页面,使用thymeleaf中的一些(特殊标记符号,也就是占位符,比如th:each,th:text="${}",把这个html页面中的关键数据进行占位
(2)在Servlet代码中获取到这些关键数据,再通过thymeleaf把这些关键性数据替换到Html页面中的特殊标记符号,也就是占位符中
(3)而在对关键性数据进行替换之前,要先对thymeleaf模板进行初始化
初始化模板一般是4个步骤(其实就是造引擎,找页面给引擎):
(1)创建一个TemplateEngine对象(模板引擎),负责把在Servlet代码中获取到这些关键数据,替换到模板中
(2)创建一个ServletContextTemplateResolver(servlet上下文模板解析器),负责找到html页面在哪,并加载供engine(引擎)来使用
(3)给resolver(解析器)设置一些属性,让他能够找到html模板页面在哪(啥样的文件被加载到内存中作为模板)
一般是用前后缀两个属性就可以找到:
① resolver.setPrefix("路径"),表示前缀,就是从那个路径开始(一般是在项目webapp/WEB-INF/template/路径下存放所有的模板文件)
② resolver.setSuffix("路径"),表示后缀(一般是 .html)
(4)找到了模板页面要交给engine引擎,所以就把resolver和engine要关联起来
方法就是引擎有一个方法engine.setTemplateResolver(解析器对象)
初始化完毕后模板引擎就可以使用解析到的模板html页面,也就可以使用thymeleaf来进行渲染
初始化有一个问题:同一个引擎要在很多servlet之间共享,可以使用ServletContext实现
把初始化engine的工作交给ServletContext,同时也把engine实力交给ServletContext管理
此时,因为任意servlet都能拿到同一个ServletContext对象,也就可以拿到同一个engine对象了
实现的方法:
希望ServletContext初始化完毕后立即初始化engine
借助监听器Listener
创建一个配置模板的类来实现ServletContextListener接口,并把这个类注释为@WebListener来声明为一个监听器,监听两个部分:ServletContext初始化完毕,ServletContext销毁完毕
(4)进行具体渲染
①渲染的时候需要定义“数据集合”这样的概念
使用WebContext,功能就是把要替换的数据收集起来,统一的传给模板引擎
收集的方式:webContext.setVariable()参数是一个或多个键值对,键就是${}里面的数据名称,值就是收集到的数据
②模板引擎进行渲染
模板引擎engine.process()参数a是模板文件名字(用那个模板页面),b是WebContext对象(传入收集到的数据),最后返回值就是一个html页面