thymeleaf模板引擎入门

ThymeLeaf是什么

Thymeleaf是一个用于服务器端的java模板引擎,它使用简单但功能强大,目前可以处理的模板类型包括:HTML、XML、TEXT、JavaScript、CSS等。

搭建thymeleaf开发环境

首先创建一个Maven web项目,pom文件依赖信息如下:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf</artifactId>
        <version>3.0.7.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

 

可见,thymeleaf的依赖并不复杂,它只需要一个库文件。

TemplateEngin、ITemplateResolver和IContext

这三个组件构成thymeleaf的核心:

  • ITemplateResolver用于设置模板引擎,例如模板的存放目录,模板的后缀,是否开启模板缓存等等。
  • TemplateEngine用于解析模板。
  • IContext用于保存模板中需要的一些变量。例如要把变量传递到模板中,就可以先把变量放入IContext的实现类中,然后在模板中获取该变量的值。

一个简单的thymeleaf使用例子

为了让程序代码尽可能简单,这里只使用最基本的servlet处理web请求。

创建Servlet

servlet代码如下,它只是一个简单的servlet,没有什么功能:

@WebServlet(urlPatterns="/index")
public class IndexServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    public void init() throws ServletException {
        super.init();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

 

引入模板引擎属性

要使模板引擎可以工作,至少需要创建TemplateEngine类和ITemplateResolver接口的实例,因此在刚才创建的servlet中创建两个类属性, 如下:

@WebServlet(urlPatterns="/index")
public class IndexServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    TemplateEngine templateEngine;
    ServletContextTemplateResolver templateResolver;
    
    //其他servlet方法
}

 

初始化模板引擎

这一步可以在servlet的init方法中初始化上面加入的两个属性。一般情况下,模板解析器有一些默认值,例如它默认以html方式解析模板。但是,模板的保存路径和后缀是空的,这两个必须由我们自己设置。

@Override
public void init() throws ServletException {
    super.init();
    
    templateEngine = new TemplateEngine();
    templateResolver = new ServletContextTemplateResolver(getServletContext());
    templateResolver.setPrefix("/WEB-INF/templates"); //模板位置
    templateResolver.setSuffix(".html");   //模板扩展名
    
    templateEngine.setTemplateResolver(templateResolver);
}

 

其中prefix就是模板保存的路径,suffix就是模板的扩展名(后缀)。

使用WebContext

WebContext是IContext的其中一个实现类,它的基本作用是保存变量。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    
    WebContext context = new WebContext(request, response, getServletContext());
    
    //添加变量message到context
    context.setVariable("message", "hello thymeleaf");
    
    //解析模板并显示到浏览器
    templateEngine.process("home", context, response.getWriter());
}

 

当请求到来的时候,我们创建一个上下文对象用于保存变量,将来可以在模板中获取变量的值。

TemplateEngine的process方法用于解析模板并利用当前response对象的writer把模板输出到浏览器。

整个过程是非常简单清晰的。

在模板中获取变量的值

home.html文件内容:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h3 th:text="${message}">this is a greeting</h3>
</body>
</html>

 

代码中的核心是th:text标签和${message}占位符,它们用于把从上下文中获取到的变量值替换掉当前标签的文本,这里是:this is a greeting

完整代码:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.sharpcode</groupId>
    <artifactId>learnthymeleaf</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>learnthymeleaf Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>learnthymeleaf</finalName>

        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
            </plugin>
        </plugins>
    </build>

</project>

 

IndexServlet

@WebServlet(urlPatterns = "/home")
public class IndexServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    TemplateEngine templateEngine;
    ServletContextTemplateResolver templateResolver;

    @Override
    public void init() throws ServletException {
        super.init();

        templateEngine = new TemplateEngine();

        templateResolver = new ServletContextTemplateResolver(getServletContext());
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");

        templateEngine.setTemplateResolver(templateResolver);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        WebContext context = new WebContext(request, response, getServletContext());

        // 添加变量message到context
        context.setVariable("message", "hello thymeleaf");

        // 解析模板并显示到浏览器
        templateEngine.process("home", context, response.getWriter());
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

 

posted @ 2017-08-19 09:40  破代码  阅读(8468)  评论(0编辑  收藏  举报