使用 jsp 模板生成 java 源代码,并将生成的 java 代码二次编译并运行

2021/5/2 14:25:17

本文主要是介绍使用 jsp 模板生成 java 源代码,并将生成的 java 代码二次编译并运行,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

使用 jsp 模板生成 java 源代码,并将生成的 java 代码二次编译并运行

在 上篇文章中,我将 tomcat 中编译 jsp 并生成 servlet 的路线给单独走通了,从而实现了不需要启动 tomcat,而直接将 jsp 模板渲染为 html 的功能。

这一次,我突发奇想,如果使用 jsp 生成 java 源码,能否对生成的 java 代码进行二次编译,从而实现俄罗斯套娃呢?

由上篇文章可以得知,渲染 jsp 模板就是先翻译为 servlet 源码,然后编译之并实例化,接着手动调用其 init、service、destroy 方法即可。所以如果我能够想办法,在编译的时候,将原本的 servlet 源码替换为生成的 java 代码,那么就可以实现狸猫换太子了。

使用示例

事实上,也确实如此。这里先示范一下如果使用。
首先 pom.xml 引用依赖(需要自行下载安装):

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

然后在 resources 文件夹下创建 template 文件夹,接着在其中创建 HelloWorldImpl.jsp 文件,其中的 HelloWorld 接口是为了后面方便调用而存在的。毕竟这个类是根据模板生成的,不写个接口的话就只能用反射了:

package com.kfyty.jsp.template;

import com.kfyty.demo.template.HelloWorld;

public class HelloWorldImpl implements HelloWorld {
    @Override
    public void hello(String name) {
        System.out.println("hello: " + name);
    }
}

编写主函数,尝试调用 HelloWorldImpl.hello(name):

package com.kfyty.demo;

import com.kfyty.demo.template.HelloWorld;
import com.kfyty.kjte.JstlRenderEngine;
import com.kfyty.kjte.JstlTemplateEngine;
import com.kfyty.kjte.config.JstlTemplateEngineConfig;

public class Main {

    public static void main(String[] args) throws Exception {
        JstlTemplateEngineConfig config = new JstlTemplateEngineConfig("/template/HelloWorldImpl.jsp");
        config.setCompiler(true);
        config.setSuffix(".java");
        JstlTemplateEngine engine = new JstlTemplateEngine(config);
        JstlRenderEngine renderEngine = new JstlRenderEngine(engine, engine.load());
        renderEngine.doRenderTemplate();
        HelloWorld helloWorld = (HelloWorld) engine.getCompileClass().get("com.kfyty.jsp.template.HelloWorldImpl").newInstance();
        helloWorld.hello("tom");
    }
}

运行之后,控制台输出如下:

五月 02, 2021 1:10:55 下午 org.apache.jasper.servlet.TldScanner scanJars
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
hello: tom

Process finished with exit code 0

感兴趣的可以看一下源码:
github 地址:https://github.com/kfyty/k-jte



这篇关于使用 jsp 模板生成 java 源代码,并将生成的 java 代码二次编译并运行的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程