Java集成thymeleaf视图层模板引擎构建web项目实例讲解(附项目源码)_thymeleaf+servlet项目源码-程序员宅基地

技术标签: java  spring mvc  servlet  模板引擎  thymeleaf  

我们提供一个Java使用Thymeleaf的简单示例。Thymeleaf是一个模板引擎可以处理XML,XHTML、HTML5。Thymeleaf利用最少的IO操作来获得更快的速度,使用thymeleaf模板引擎加快了前后端开发工作的并行运作。Thymeleaf还提供了国际化。Thymeleaf提供了最基础的两个编程API:ServletContextTemplateResolver 和TemplateEngine。Servletcontexttemplateresolver负责解析模板、Templateengine使用templateengine process()方法处理模板数据。模板引擎表达式可以从properties文件和WebContext获取属性值从而展示到页面。需要注意的是:属性文件、模板文件必须同名且位于同一目录(编译后)。

使用servlet3.0注解报会在访问时报404错误,解决方案如下web.xml文件头如下配置:

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

Java+Thymeleaf示例程序的准备工作

(本文章分享在CSDN平台,更多精彩请阅读 东陆之滇的csdn博客:http://blog.csdn.net/zixiao217 ,如在其他平台看到此文可能会出现内容不完整的现象,请移至东陆之滇http://blog.csdn.net/zixiao217查看原文)

  • Java 8
  • Thymeleaf
  • Servlet 3
  • Tomcat 8
  • Maven
  • Eclipse

示例程序的目录结构

这里写图片描述

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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.byron4j</groupId>
    <artifactId>java2Thymeleaf</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>java2Thymeleaf</name>
    <url>http://blog.csdn.net/zixiao217/article/details/52723437</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>



        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring4</artifactId>
            <version>2.1.5.RELEASE</version>
        </dependency>
    </dependencies>



    <build>
        <finalName>thymeDemo</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <!-- <compilerArguments> <extdirs>lib</extdirs> </compilerArguments> -->
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

使用th:text外化文本

打开我们的模板文件WEB-INF\templates\welcome.html,如果我们直接访问该html文件,则会显示”Welcome Offline”,当我们通过服务启动之后访问url则显示从后台获得的属性值。

注意:在模板文件中需要声明thymeleaf的文档类型、xml命名空间,WEB-INF\templates\welcome.html

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
  <head>
    <title>Thymeleaf-Java Demo</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF8" />
  </head>
  <body>
    <p th:text="#{welcome.msg}">喂,掉线了丿_|</p>
    <p>Date : <span th:text="${currentDate}">1990-01-01 00:00:00</span></p>
  </body>
</html> 

th:text: 该属性用来计算表达式的值,并将结果展示为标签的内容
#{…}: 从属性文件获得该属性的值。 表达式#{welcome.msg} 会尝试获得属性文件中key为welcome.msg的value。
${…}: OGNL表达式 会获取在org.thymeleaf.context.WebContext中设置的值。在这个Demo中表达式${currentDate} 将会获取在WebContext中设置的currentDate 属性值。

ServletContextTemplateResolver 解析模板和TemplateEngine.process()处理模板

ThymeleafAppUtil.java

package org.byron4j.java2Thymeleaf;

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;


/**
 *  @author     Byron.Y.Y
 *  @optDate    2016年11月15日
 *  Thymeleaf模板引擎和解析器
 */
public class ThymeleafAppUtil {
    

    private static TemplateEngine templateEngine;

    /**
     * static代码块,加载初始模板设置:/WEB-INF/templates/**.html文件
     */
    static {
        ServletContextTemplateResolver templateResolver = 
                new ServletContextTemplateResolver();
        templateResolver.setTemplateMode("XHTML");
        templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setCacheTTLMs(3600000L);
        templateEngine = new TemplateEngine();
        templateEngine.setTemplateResolver(templateResolver);
    }

    public static TemplateEngine getTemplateEngine() {
     return templateEngine;
    }

}

ServletContextTemplateResolver: 负责解析Thymeleaf模板。我们需要设置模板模式、模板文件的前缀、后缀等。
TemplateEngine: 处理thymeleaf模板。

属性文件

属性文件、模板文件必须同名且放在一个目录中(项目编译后)
WEB-INF\templates\welcome_en.properties

welcome.msg=Welcome to Thymeleaf World!

WEB-INF\templates\welcome_zh.properties

welcome.msg=欢迎使用 Thymeleaf!

Servlet类

WelcomeServlet.java

package org.byron4j.java2Thymeleaf;

import java.io.IOException;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *  @author     Byron.Y.Y
 *  @optDate    2016年11月15日
 *  使用servlet3注解,注册一个servlet,并在容器启动时加载
 */
@WebServlet(urlPatterns = "/welcome", loadOnStartup = 1)
public class WelcomeServlet extends HttpServlet {
    

    private static final long serialVersionUID = 1L;

    //POST请求
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
            doGet(request,response);
    }

    //GET请求
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
        response.setContentType("text/html;charset=UTF-8");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        WelcomeApplication application = new WelcomeApplication();
        application.process(request, response);
    }
} 

WelcomeApplication.java

package org.byron4j.java2Thymeleaf;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.thymeleaf.context.WebContext;

public class WelcomeApplication {
    
    public void process(HttpServletRequest request, HttpServletResponse response) 
         throws IOException {
        WebContext ctx = new WebContext(request, response, request.getServletContext(),
                request.getLocale());
        ctx.setVariable("currentDate", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

        /**
         * 使用Thymeleaf引擎加载模板文件welcome.html
         */
        ThymeleafAppUtil.getTemplateEngine().process("welcome", ctx, response.getWriter());
    }
}

web.xml

声明使用了servlet3,eclipse默认生成的web.xml使用的是servlet2.3、2.5,我们需要手动指定为servlet3,运用servlet3.0注解报会在访问时报404错误。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

  <display-name>Archetype Created Web Application</display-name>
</web-app>

运行结果:
这里写图片描述

完整的Demo Maven工程代码

演示项目源码下载 http://download.csdn.net/detail/zixiao217/9684984

Thymeleaf+Java Demo演示项目源码

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zixiao217/article/details/53191659

智能推荐

int32的取值范围及相关编程知识_int32在c语言中-程序员宅基地

文章浏览阅读604次。在编程中,我们经常需要了解int32的取值范围以确保我们的程序在处理整数时不会溢出或出现意外行为。通过了解int32的取值范围,并在程序中进行适当的范围检查,我们可以更好地处理整数数据,并避免潜在的溢出错误。请注意,这里只展示了C语言的示例,其他编程语言可能有类似的方法来确定整数类型的取值范围,并进行相应的范围检查。在不同的编程语言中,int32类型可能会有不同的名称,例如C语言中的"int",Java中的"int",Python中的"int"等。是否在int32的范围内,并输出相应的结果。_int32在c语言中

ABAP修改工单组件BAPI,同步修改增强字段_sap 修改工单组件bapi-程序员宅基地

文章浏览阅读327次,点赞3次,收藏5次。要修改正常工单,一定要对原BAPI进行改造。使用该BAPI修改工单时,能正常出发增强推送等功能。_sap 修改工单组件bapi

leetcode-829-程序员宅基地

文章浏览阅读212次。题目描述:给定一个正整数 N,试求有多少组连续正整数满足所有数字之和为 N?首先,刚开始读错题目了,以为是子集和就行,后来发现是连续子集;想到用子集树,但是超时了class Solution: def consecutiveNumbersSum(self, N: int) -> int: self.res = 0 nums = ..._leetcode qian 400 timu

STM32内存结构介绍,FreeRTOS内存分配技巧,Stack_Size和Heap_Size大小设置-程序员宅基地

文章浏览阅读1.5w次,点赞56次,收藏283次。STM32内存结构介绍和FreeRTOS内存分配技巧这是我第一次使用FreeRTOS构建STM32的项目,踩了好些坑,又发现了我缺乏对于操作系统的内存及其空间的分配的知识,故写下文档记录学习成果。文章最后要解决的问题是,如何恰当地分配FreeRTOS中的堆、任务栈的空间。但是在概念的理解上,也需要知道STM32内存的相关知识。所以首先大致介绍一下STM32的内存结构。STM32内存结构STM32的数据在物理上分别储存在RAM和Flash中。RAM可读可写,掉电清零。Flash可读可写,但是读写时间很_heap_size

【数据库】密级,视图机制,审计(第四章例题_2)_对删除sc表结构或删除sc表数据的操作进行审计-程序员宅基地

文章浏览阅读493次。敏感度标记(Label) 对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label) 敏感度标记分成若干级别绝密(Top Secret,TS)机密(Secret,S)可信(Confidential,C)公开(Public,P)TS>=S>=C>=P主体的敏感度标记称为许可证级别(Clearance Level)客体的敏感度标记称为密级(Classification Level)规则:主体(操作者)的密级别=客体的密集时,可读可写。主体>客体_对删除sc表结构或删除sc表数据的操作进行审计

有序链表的交集_有序链表的交集调用函数-程序员宅基地

文章浏览阅读1.3k次。已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。输入格式说明:输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示序列的结尾(-1不属于这个序列)。数字用空格间隔。输出格式说明:在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出“NULL”。样例输入与输出:_有序链表的交集调用函数

随便推点

python缺requests及其他依赖包_>>> import requests traceback (most recent call la-程序员宅基地

文章浏览阅读1.9k次。>>> import requestsTraceback (most recent call last): File "<stdin>", line 1, in <module>ImportError: No module named requests需要安装requests插件pip install requests报 -bash: pip: command not found需要安装pip第一种方._>>> import requests traceback (most recent call last): file "", line

ipad的正确使用方法视频,ipad的正确使用方法图解_ipad9右边两个键是什么-程序员宅基地

文章浏览阅读2.9k次。当你找不到你想要的App、联络人、音乐……时,你可以向下轻扫屏幕,以获得搜索页面,只需输入该名称,然后点击来直接打开 6. 单手快速关 App 大家知道吗?5、快速静音 按住向下的降低调量键两秒钟,iPad就会快速变成静音模式 6、常用域名 在浏览器输入网址时,按住键盘上的〔.com〕键,就会跳出.net、.edu.、.hk、.tw等其他常用网域名可以选择 7、摇晃iPad撤销输入 文字输入错误时,只要摇晃iPad机身,就会跳出提示可以「撤销输入」,点击「撤销输入」即可重新输入文字。_ipad9右边两个键是什么

Wireshark数据抓包分析——网络协议篇-程序员宅基地

文章浏览阅读270次。Wireshark数据抓包分析——网络协议篇 Wireshark是眼下最受欢迎的抓包工具。它能够执行在Windows、Linux及MAC OS X操作系统中,并提供了友好的图形界面。同一时候,Wireshark提供功能强大的数据抓包功能。使用它。能够以各种方式抓取用户所须要的网络数据包。..._分析五条不同类型的wireshark抓包行分析是什么网络应用

GPS系统跟踪捕获算法的Verilog实现_gps的ca码设计与相关verilog程序-程序员宅基地

文章浏览阅读4.1k次。GPS系统跟踪捕获算法_gps的ca码设计与相关verilog程序

苹果 macOS Sonoma 14 开发者预览版 Beta 3 发布_mac os sonoma最新版本-程序员宅基地

文章浏览阅读81次。苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 3 更新。但是并未发现 macOS 14 Sonoma 的第三个开发者测试版的新功能,且更新日志和 Beta 2 类似。_mac os sonoma最新版本

ES6-17【类、类的继承、类的实现、类的修饰】_es6 类修饰 详解-程序员宅基地

文章浏览阅读270次。一.类(1).基础最简单的定义方式class Person{}log(new Person());//Person{}log(typeof Person);function标准写法class Person{ constructor(name = "zhangsan",age = "18"){ //私有属性 this.name = name; this.age = age; } //公有属性 _es6 类修饰 详解

推荐文章

热门文章

相关标签