Servlet中模板引擎的使用

目录

一.本机环境及模板引擎依赖

1.本机环境

 2.项目中引入的依赖

(1)servlet开发依赖

 (2)模板引擎依赖

二.项目结构

二.模板引擎常用语法

三.使用模板引擎渲染页面

1.前端模板引擎语法使用和需要渲染的标签

2.后端Servlet进行渲染

四.对后端使用模板引擎创建的优化

1.如何对模板引擎进行优化

2.优化步骤及代码

(1)优化步骤

(2)监听器初始化模板代码

(3)调用监听器的模板引擎来进行前端页面的渲染代码


一.本机环境及模板引擎依赖

1.本机环境

因为使用模板引擎技术,需要在Maven中的pom.xml中引入thymeleaf依赖。我这里jdk使用的是1.8;

模板引擎的依赖版本为3.1.0。如果开发环境相同,可以参考下面的依赖。

 2.项目中引入的依赖

注意:这里的依赖和自己的环境要对应,否则之后可能会出现异常

引入依赖相当于是从远程仓库Maven自动下载依赖包,方便使用。这些依赖代码需要添加到Maven项目中的pom.xml文件中,之后在dependencs中添加下面依赖即可。

(1)servlet开发依赖

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <!-- 开发编译时需要这个依赖包,运行时不需要 -->
            <scope>provided</scope>
        </dependency>

 (2)模板引擎依赖

     <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <!-- 开发编译时需要这个依赖包,运行时不需要 -->
            <scope>provided</scope>
        </dependency>

二.项目结构

在使用模板技术时,将需要使用模板技术进行渲染的页面需要放到指定文件夹中才能起到效果,这里就了解一下整体的Maven项目结构。

二.模板引擎常用语法

方法功能
th:text在标签体中展示表达式求值结果的文本内容
th:[HTML标签属性]标签属性的值
th:if当表达式的结果为真时则显示内容,否则不显示
th:each 循环访问元素

三.使用模板引擎渲染页面

1.前端模板引擎语法使用和需要渲染的标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>使用模板技术渲染页面</h3>
<!--动态添加文本-->
<p th:text="${message}"></p>
<!--动态添加路径-->
<a th:href="${a1}">搜狗</a>
<!--为true就显示该标签  (这里使用条件判断)-->
<p th:if="${isLogin}">已经登录</p>
<ul>
<!--  这里是循环遍历 name知识自己定义的一个变量 ;${变量}这里的变量需要前后端保持一致 -->
    <li th:each="name : ${names}">
        <span th:text="${name}"></span>
    </li>
</ul>

<ol>
<!--  动态渲染对象中的值,里面的值通过.进行获取  -->
    <li th:each="user : ${users}">
        姓名:<span th:text="${user.name}"></span>
        年龄:<span th:text="${user.age}"></span>
    </li>
</ol>
</body>
</html>

2.后端Servlet进行渲染

首先需要初始化模板引擎,初始化前需要使用引擎解析器,设置编码格式和设置网页模板路径的前后缀,最后将解析器放到模板引擎中。然后就可以在请求方法中使用WebContext类中的setVariable方法来设置变量和值,这里在使用WebContext时还需要借助getServletContext(),最终将将webContext中的内容渲染到模板引擎中即可。最后将渲染后的页面发送给请求端即可。

Servlet代码如下:

    package practice;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Arrays;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    //初始化模板引擎
    TemplateEngine engine = new TemplateEngine();

    @Override
    public void init() throws ServletException {
        //该方法在实例对象的时候只执行依次,在这里面使用模板技术,提高效率

        //创建渲染网页的模板引擎解析器
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(getServletContext());
        //设置渲染时的编码格式
        resolver.setCharacterEncoding("utf-8");
        //设置网页模板路径的前后缀
        resolver.setPrefix("WEB-INF/templates/");
        resolver.setSuffix(".html");
        //将解析器放到模板引擎中
        engine.setTemplateResolver(resolver);

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //创建一个web上下文,用于存放键值对
        WebContext webContext = new WebContext(req, resp, getServletContext());
        webContext.setVariable("message", req.getParameter("msg"));
        webContext.setVariable("a1", "http://www.sogou.com");
        webContext.setVariable("isLogin",true);
        webContext.setVariable("names", Arrays.asList("张三","李四","王五"));
        webContext.setVariable("users", Arrays.asList(
                new User("张三",18),
                new User("李四",20),
                new User("王五",22)
                ));
        //模板名称+上下文(保存的数据)
        //返回值就是渲染后的网页字符串
        String html = engine.process("hello", webContext);
        resp.getWriter().write(html);
    }
    //必须要有getter和setter
    private static class User {
        private String name;
        private int age;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}

四.对后端使用模板引擎创建的优化

1.如何对模板引擎进行优化

由于模板引擎只需要一次实例化,而且为了方便多个servlet对模板引擎的调用,我们这里使用监听器来监听ServletContext,并将创建好的模板引擎放到ServletContext中,由于ServletContext可以在一个webapp中全局使用,所以之后只需要使用getServletContext()方法就可以直接调用出该模板引擎实例。

  

2.优化步骤及代码

(1)优化步骤

  1. 给需要使用监听器的类设置一个注解@WebListener,然后该类再implements ServletContextListeger,接着重写contextInitialized方法即可。
  2. 先获取servlet上下文(servletcontext)。
  3. 创建模板引擎和模板引擎加载器实例。
  4. 设置加载器的编码格式及渲染文件前后缀(前缀为文件路径,后缀为文件后缀名)。
  5. 关联引擎与加载器。
  6. 将引擎放到servlet上下文中(servletcontext)。

(2)监听器初始化模板代码

package practice;

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

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener//不加就不会进行监听
//使用监听器来创建模板引擎
public class TemplateEnginListener implements ServletContextListener {
    /**
     * 这个方法在创建servletcontext的时候会自动进行调用
     * @param servletContextEvent
     */
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //获取servletcontext对象
        ServletContext servletContext = servletContextEvent.getServletContext();
        //创建模板引擎实例
        TemplateEngine engine = new TemplateEngine();
        //创建模板引擎加载器
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(servletContext);
        //给加载器设置属性,将渲染的HTML文件的前缀和后缀进行设置,最后会自动进行拼接
        //设置编码格式
        resolver.setCharacterEncoding("utf-8");
        //设置前后缀
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setSuffix(".html");
        //关联加载器和模板引擎
        engine.setTemplateResolver(resolver);
        //将模板引擎放到servletcontext中(为了方便之后的调用)
        servletContext.setAttribute("engine", engine);
    }

    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

(3)调用监听器的模板引擎来进行前端页面的渲染代码

package practice;

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

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;

@WebServlet("/listener")
public class ServletListenerDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        ServletContext servletContext = getServletContext();
        TemplateEngine engine = (TemplateEngine) servletContext.getAttribute("engine");
        //创建一个web上下文,用于存放键值对
        WebContext webContext = new WebContext(req, resp, getServletContext());
        webContext.setVariable("message", req.getParameter("msg"));
        webContext.setVariable("a1", "http://www.sogou.com");
        webContext.setVariable("isLogin",true);
        webContext.setVariable("names", Arrays.asList("张三","李四","王五"));
        webContext.setVariable("users", Arrays.asList(
                new ServletListenerDemo.User("张三",18),
                new ServletListenerDemo.User("李四",20),
                new ServletListenerDemo.User("王五",22)
        ));
        //模板名称+上下文(保存的数据)
        //返回值就是渲染后的网页字符串
        String html = engine.process("hello", webContext);
        resp.getWriter().write(html);
    }
    //必须要有getter和setter
    private static class User {
        private String name;
        private int age;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用Java编写。FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据。 FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件。FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境。FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板使用JSP标记库。而且你还可以通过Eclipse的插件来编辑FreeMarker,经过验证,FreeMarker 最好的 Eclipse 编辑插件是 JBoss Tools。 FreeMarker是免费的。 FreeMarker特性: 1、通用目标 能够生成各种文本:HTML、XML、RTF、Java源代码等等 易于嵌入到你的产品:轻量级;不需要Servlet环境 插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等 你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器 2、强大的模板语言 所有常用的指令:include、if/elseif/else、循环结构 在模板创建和改变变量 几乎在任何地方都可以使用复杂表达式来指定值 命名的宏,可以具有位置参数和嵌套内容 名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突 输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换 3、通用数据模型 FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板显示 你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发使用方法,使其不受技术细节的打扰 4、为Web准备 在模板语言内建处理典型Web相关任务(如HTML转义)的结构 能够集成到Model2 Web应用框架作为JSP的替代 支持JSP标记库 为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员 5、智能的国际化和本地化 字符集智能化(内部使用UNICODE) 数字格式本地化敏感 日期和时间格式本地化敏感 非US字符集可以用作标识(如变量名) 多种不同语言的相同模板 6、强大的XML处理能力 <#recurse> 和<#visit>指令(2.3版本)用于递归遍历XML树 在模板清楚和直觉的访问XML对象模型 开源论坛 JForum 就是使用了 FreeMarker 做为页面模板。
Beetl相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,开发和维护模板有很好的体验。是新一代的模板引擎。总得来说,它的特性如下: 1、功能完备:同主流的java模板引擎相比,Beetl具有绝大多数功能。适用于各种应用场景,从对响应速度有很高要求的大网站到功能繁多的CMS管理系统都适合。Beetl本身还具有很多独特功能来完成模板编写和维护,这是其他模板引擎所不具有的。 2、非常简单:类似Javascript语法和习俗,只要半小时就能通过半学半猜完全掌握用法。拒绝其他模板引擎那种非人性化的语法和习俗。 3、超高的性能:Beetl 远超过主流java模板引擎性能,如5-6倍于freemarker,2倍于传统jsp技术。而且消耗较低的CPU 4、易于整合:Beetl能很容易的与各种web框架整合,如Spring MVC,JFinal,Struts,Nutz,Jodd,Servlet等。 5、支持模板单独开发和测试,即在MVC架构,即使没有M和C部分,也能开发和测试模板。 6、扩展和个性化:Beetl支持自定义方法,格式化函数,虚拟属性,标签,和HTML标签。同时Beetl也支持自定义占位符和控制语句起始符号也支持使用者完全可以打造适合自己的工具包。 关于性能: 通过与主流模板引擎Freemarker,Velocity以及JSP对比,Beetl均远高于前面三个,这是因为宏观上,通过了优化的渲染引擎,IO的二进制输出,字节码属性访问增强,微观上,通过一维数组保存上下文,合并静态文本,通过重复使用字节数组来防止java频繁的创建和销毁数组,还使用模板缓存,运行时优化等方法。 独特功能: Beetl有些功能是发展了10多年的模板引擎所不具备的,这些功能非常利于模板的开发和维护,如下: 1、自定义占位符和控制语句起始符号,这有利于减小模板语法对模板的倾入性,比如在html模板,如果定义控制语句符号是,那么,大部分模板文件都能同过浏览器打开。有的使用者仅仅采用了单个符号@ 以及回车换号作为控制语句起始符号,这又能提高开发效率。 2、可单独测试的模板。无需真正的控制层和模型层,Beetl的模板就可以单独开发和测试。 3、同时支持较为松散的MVC和严格的MVC,如果在模板语言里嵌入计算表达式,复杂条件表达式,以及函数调用有干涉业务逻辑嫌疑,你可以禁止使用这些语法。 4、强大的安全输出,通过安全输出符号!,能在模板变量,变量属性引用,for循环,占位符输出,try-catch等各个地方提供安全输出,保证渲染正常。 5、模板变量:运行将模板的某一部分输出像js那样赋值个一个变量,稍后再处理。利用模板变量能完成非常复杂的页面布局(简单的布局可使用layout标签函数)。 6、类型推测,能在运行的时候推测模板变量类型,从而优化性能,也可以通过注解的方法显示的说明模板变量属性(这是非必须的,但有助于IDE自动提示功能)。 7、可插拔的设计,错误信息提示,模板引擎缓存机制,模板资源管理,本地调用的安全管理器,严格MVC限制,模板引擎本身都有默认的实现,但又完全可以自定义以适合特定需求。 8、增强的语法,如#ajax局部渲染,for-elsefor, select-case,安全输出符号! 等,这些语法特别适合模板开发。 9、性能超高,具有最快的模板解释引擎,同时,又有较低的CPU消耗。适合各类模板引用,如CMS系统,超高访问量的门户系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值