Apache Commons JCI最佳实践(四)动态编译JSP文件

Apache Commons JCI
placeholder image
admin 发布于:2019-06-08 14:06:41
阅读:loading

章接前文,我们知道JSP文件是先编译成Java文件,再由Java文件编译成Class后被最终执行的,既然是编译系列文章不能少了对JSP文件的编译尝试,先声明一下本次经过较短时间的尝试发现,官网给出的一个基于servlet运行编译的示例对于JSP的编译属于“示例”级别的,因为我们知道JSP文件中是可以被定义class、方法、变量等东西,而在尝试示例的时候,发现定义了一个变量被编译后的效果并不是很给力,可以通过本文的示例进行说明。

在进行之前先对官网上的示例文件中的JSP生产者“org.apache.commons.jci.examples.serverpages.JspGenerator”说明一下,这个类是将JSP文件读取并生成一个Java源文件的示例,但是通过debug中的代码发现并不好使,终于在尝试调试了半天后,简单修改其代码实现后可以正常使用了,该类的源文件路径为:http://commons.apache.org/proper/commons-jci/xref/org/apache/commons/jci/examples/serverpages/JspGenerator.html,本次修改的地方为2处,分别解决的是生成编译为Java文件时的错行与生成的Java文件中无内容的问题,具体修改参考:

image.png

image.png

Test代码

package cn.chendd.example;

import junit.framework.TestCase;
import org.apache.commons.io.FileUtils;
import org.apache.commons.jci.compilers.CompilationResult;
import org.apache.commons.jci.compilers.JavaCompiler;
import org.apache.commons.jci.compilers.JavaCompilerFactory;
import org.apache.commons.jci.examples.serverpages.JspGenerator;
import org.apache.commons.jci.readers.FileResourceReader;
import org.apache.commons.jci.stores.FileResourceStore;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;

/**
 * @author chendd
 * @date 2019/6/8 13:47
 * 
编译JSP文件为Java再编译为Class
 */
public class JspClassCompiler extends TestCase {

    
public void testJSPCompiler() throws Exception {

        String resourceName = 
"cn/chendd/examples/TestJSP.java";
        File sourceDir = 
new File("D:\\test\\compiler");
        File targetDir = 
new File("D:\\test\\compiler");
        JavaCompiler compiler = 
new JavaCompilerFactory().createCompiler("eclipse");
        JspGenerator transformer = 
new JspGenerator();
        File jspFileSource = 
new File(sourceDir , "cn/chendd/examples/test.jsp");
        
byte bytes[] = transformer.generateJavaSource(resourceName, jspFileSource);
        FileUtils.writeStringToFile(
new File(sourceDir , resourceName), new String(bytes));

        String sources[] = { resourceName };

        String jarPath = 
"C:\\Users\\chendd\\.m2\\repository\\javax\\servlet\\javax.servlet-api" +
                
"\\3.0.1\\javax.servlet-api-3.0.1.jar";
        URL urls[] = 
new URL[]{
            
new File(jarPath).toURI().toURL()
        };

        ClassLoader classloader = 
new URLClassLoader(urls);

        CompilationResult result = compiler.compile(sources, 
new FileResourceReader(sourceDir),
                
new FileResourceStore(targetDir) , classloader);
        System.
out.println(result.getErrors().length " errors");
        System.
out.println(Arrays.toString(result.getErrors()));
        System.
out.println(result.getWarnings().length " warnings");
    }

}

JSP代码

image.png

JSP编译成Java代码

image.png

JSP编译成Java代码再编译成Class

image.png

 点赞


 发表评论

当前回复:作者

 评论列表


留言区