Apache Commons JCI最佳实践(四)动态编译JSP文件
Apache Commons JCIadmin 发布于: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文件中无内容的问题,具体修改参考:
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");
}
}
点赞