jsp 模板引擎。无需 tomcat,只需一个 jar 包直接根据 jsp 源文件渲染得到 html 页面。

背景

说到模板引擎,大家能想到的一般都是 freemarker、thymeleaf 之类的。

而说到 jsp 估计大家会一致的说 jsp 本质就是一个 servlet。的确,jsp 本质确实是 servlet,但是单单从 jsp 来说,它支持各种标签来渲染数据,其他的模板引擎也都有自己的专属标签去渲染数据。所以我觉得 jsp 从某种意义上,可以说是由 servlet 实现的模板引擎,我觉得是没问题的。

但是问题来了,jsp 渲染为 html,必须先转换为 servlet java 代码,然后再编译为 class 字节码,接着再由 jvm 装载运行,最后直接向客户端输出 html。

可见,如果说 jsp 是一款模板引擎,但我们却没办法直接获取它渲染生成的 html。我觉得这是绝对不允许的。

我网上找了很多资料,但大部分都是编写一个包装类,利用 include 方法拦截 html,而且还需要启动 tomcat 服务器,在浏览器中发请求或者模拟请求才可以,甚是麻烦。

因此,我决定,探索 jsp 的奥秘,并试图找到一种方式,直接将 jsp 源文件渲染为 html !

代码示例

其实这个想法很早之前就产生了,但是一直没有付诸行动。

不知道今天那根线搭错了,突然心血来潮的要去研究它,还真让我搞成功了!

先看使用示例:
首先 pom.xml 引用依赖(需要自行下载安装):

<dependency>
            <groupId>com.kfyty</groupId>
            <artifactId>k-jte</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

然后在 resources 文件夹下创建 template 文件夹,接着在其中创建 jsp 文件:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML>
<html>
<head>
    <jsp:include page="include/title.jsp">
        <jsp:param name="title" value="jsp 模板引擎" />
    </jsp:include>
</head>
<body>
    <h1>${content}</h1>
    <c:forEach begin="1" end="5" step="1" var="index">
        <span>index: ${index}</span>
    </c:forEach>
</body>
</html>

在 template 文件夹下创建 include 文件夹并创建 title.jsp:

<title>${title}</title>

编写示例代码并运行:

package com.kfyty.demo;

import com.kfyty.kjte.JstlRenderEngine;
import com.kfyty.kjte.JstlTemplateEngine;
import com.kfyty.kjte.config.JstlTemplateEngineConfig;

import java.util.List;

public class Main {

    public static void main(String[] args) throws Exception {
        String savePath = "C:\\Users\\fyty\\Desktop";
        JstlTemplateEngineConfig config = new JstlTemplateEngineConfig(savePath, "/template");

        // 模板变量
        config.putVar("title", "test");

        // 模板引擎
        JstlTemplateEngine engine = new JstlTemplateEngine(config);

        // 渲染引擎
        JstlRenderEngine renderEngine = new JstlRenderEngine(engine, engine.load());
        renderEngine.doRenderTemplate();
    }
}

得到的 html 如下:

<!DOCTYPE HTML>
<html>
<head>
    <title>jsp 模板引擎</title>
</head>
<body>
    <h1>test</h1>
    
        <span>index: 1</span>
    
        <span>index: 2</span>
    
        <span>index: 3</span>
    
        <span>index: 4</span>
    
        <span>index: 5</span>
    
</body>
</html>

好了,终于得到了心心念的结果了。

研究了一天,好累,大家有兴趣了直接去看源码吧。
github 地址:https://github.com/kfyty/k-jte

PS:(目前支持了 jstl 标签,jsp:include、jsp:param 指令)