Thymeleaf:视图模板技术
Thymeleaf是一个供后端人员使用的,为快速开发页面而生的Java模板引擎,能够动态地替换掉静态内容,使页面动态显示。
(模板引擎(用于Web开发)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。)
(1)添加JAR包
(2)新建一个Servlet类ViewBaseServlet
import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.WebContext; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ServletContextTemplateResolver; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; 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()); } }
(3)在web.xml中添加配置
<!-- 在上下文参数中配置视图前缀和视图后缀 --> <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>
(4)我们的Servlet继承ViewBaseServlet
根据逻辑视图获得真实视图名称
@WebServlet("/index") public class IndexServlet extends ViewBaseServlet { protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { FruitDAO fruitDAO = new FruitDAOImpl(); List<Fruit> fruitList = fruitDAO.getFruitList(); System.out.println("fruitList.size() = " + fruitList.size()); HttpSession session = request.getSession(); session.setAttribute("fruitList",fruitList); Object fr = session.getAttribute("fruitList"); System.out.println("fr = " + fr); //处理模板(视图名称,request,response) //thymeleaf 会将这个逻辑视图名称对应到物理视图名称上去, //逻辑视图名称: index //物理视图名称: view-prefix + 逻辑视图名称 + view-suffix //真实视图名称: / index .html super.processTemplate("index",request,response); } }
(5)页面使用Thymeleaf标签获取数据
<div> <table> <tr> <th>名称</th> <th>单价</th> <th>数量</th> <th>备注</th> </tr> <tr th:if="${#lists.isEmpty(session.fruitList)}"><!--判断集合是否为空--> <td>库存为空!</td><!--为空输出语句--> </tr> <tr th:unless="${#lists.isEmpty(session.fruitList)}" th:each="fruit : ${session.fruitList}"> <!--集合不为空,循环输出--> <td th:text="${fruit.fname}"></td> <td th:text="${fruit.price}"></td> <td th:text="${fruit.fcount}"></td> <td th:text="${fruit.remark}"></td> </tr> </table> </div>