登录 
欢迎来到陈冬冬(雪地里走)的学习天地 | 经验分享整理平台 | 陈冬冬
 服务器本次启动于:26天前 

commons jci最佳实践(四)动态编译JSP文件

2019-06-08 14:06:41 阅读:()

章接前文,我们知道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文件中无内容的问题,具体修改参考:

blob.png


blob.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代码

blob.png

JSP编译成Java代码

blob.png

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

blob.png




你可能感兴趣的:
      关键字:java(13)commons(12)new(12)jsp(12)import(12)
      互动()
      评论()
      比起点赞,站长更喜欢登录后的评论
      • 0
      • 0
      • 0
      • 0
      • 0