依赖tomcat实现jsp预编译,修改重新实现JspC类

tomcat的jspc编译需要引用ant,而且内部是自己扫描的jsp文件。本人做框架时已经有项目里所有的jsp文件路径,不想引用ant包,因此简化了jspc类。

背景:

tomcat的jspc编译需要引用ant,而且内部是自己扫描的jsp文件。本人做框架时已经有项目里所有的jsp文件路径,不想引用ant包,因此简化了jspc类。

框架传送门:

https://github.com/xiangjiangchuangyuan/struts

https://github.com/xiangjiangchuangyuan/util    --此为工具包

调用:

// 判断线上环境,执行预编译
		if (jspList.size() > 0 && WebContextUtils.isLinuxOS()) {
			new JspC(sc, jspList, true).execute();
		}

具体代码:

package com.xjcy.struts.context;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.servlet.ServletContext;
import javax.servlet.jsp.tagext.TagLibraryInfo;

import org.apache.jasper.JasperException;
import org.apache.jasper.JspCompilationContext;
import org.apache.jasper.Options;
import org.apache.jasper.compiler.JspConfig;
import org.apache.jasper.compiler.JspRuntimeContext;
import org.apache.jasper.compiler.TagPluginManager;
import org.apache.jasper.compiler.TldCache;
import org.apache.jasper.servlet.JspCServletContext;
import org.apache.jasper.servlet.TldScanner;
import org.apache.log4j.Logger;
import org.xml.sax.SAXException;

import com.xjcy.util.FileUtils;

/***
 * 预编译jsp文件,移除ant引用 2018-04-10
 * 
 * @author YYDF
 *
 */
public class JspC implements Options {

	static final Logger logger = Logger.getLogger(JspC.class);

	private String uriRoot;
	private File scratchDir;
	private JspCServletContext context;
	private TldScanner scanner;
	private TldCache tldCache;
	private JspRuntimeContext rctxt;
	private JspConfig jspConfig;
	private TagPluginManager tagPluginManager;
	private final List<String> pages = new Vector<>();

	private static final String Encoding = "UTF-8";

	public JspC(ServletContext sc, boolean clear) {
		this(sc, null, clear);
	}

	public JspC(ServletContext sc, List<String> jspList, boolean clear) {
		this.uriRoot = sc.getRealPath("/");
		String outputDir = sc.getRealPath(StrutsContext.CLASS_PATH);
		this.scratchDir = new File(outputDir);
		try {
			if (jspList != null) {
				pages.addAll(jspList);
				logger.debug("Add pages with list " + jspList.size());
			}
			initServletContext(this.getClass().getClassLoader());
			if (clear) {
				File output = new File(outputDir + "/org");
				if (output.exists()) {
					FileUtils.deleteDir(output);
					logger.debug("Deleted dir " + output.getPath());
				}
			}
		} catch (JasperException | IOException e) {
			logger.error("Init context faild", e);
		}
	}

	public void setJspFiles(String jspFiles) {
		if (jspFiles == null) {
			return;
		}
		StringTokenizer tok = new StringTokenizer(jspFiles, ",");
		while (tok.hasMoreTokens()) {
			pages.add(tok.nextToken());
		}
	}

	public void execute() {
		long start = System.currentTimeMillis();
		Iterator<String> iter = pages.iterator();
		while (iter.hasNext()) {
			processFile(iter.next());
		}
		logger.debug("Jsp servlet build success in " + (System.currentTimeMillis() - start) + " ms");
	}

	protected void initServletContext(ClassLoader loader) throws IOException, JasperException {
		URL resourceBase = new File(uriRoot).getCanonicalFile().toURI().toURL();
		context = new JspCServletContext(new PrintWriter(System.out), resourceBase, loader, false, false);

		try {
			scanner = new TldScanner(context, false, false, false);
			scanner.scan();
		} catch (SAXException e) {
			throw new JasperException(e);
		}
		tldCache = new TldCache(context, scanner.getUriTldResourcePathMap(), scanner.getTldResourcePathTaglibXmlMap());
		rctxt = new JspRuntimeContext(context, this);
		jspConfig = new JspConfig(context);
		tagPluginManager = new TagPluginManager(context);
	}

	protected void processFile(String file) {
		try {
			String jspUri = file.replace('\\', '/');
			JspCompilationContext clctxt = new JspCompilationContext(jspUri, this, context, null, rctxt);

			logger.debug("Compiling file: " + file);
			clctxt.createCompiler().compile(true, true);
		} catch (Exception e) {
			logger.error("Compile '" + file + "' faild", e);
		}
	}

	@Override
	public boolean getErrorOnUseBeanInvalidClassAttribute() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean getKeepGenerated() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean isPoolingEnabled() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean getMappedFile() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean getClassDebugInfo() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public int getCheckInterval() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public boolean getDevelopment() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean getDisplaySourceFragment() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean isSmapSuppressed() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean isSmapDumped() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean getTrimSpaces() {
		return true;
	}

	@Override
	public String getIeClassId() {
		return "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93";
	}

	@Override
	public File getScratchDir() {
		return scratchDir;
	}

	@Override
	public String getClassPath() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getCompiler() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getCompilerTargetVM() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getCompilerSourceVM() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getCompilerClassName() {
		return "org.apache.jasper.compiler.JDTCompiler";
	}

	@Override
	public TldCache getTldCache() {
		return tldCache;
	}

	@Override
	public String getJavaEncoding() {
		return Encoding;
	}

	@Override
	public boolean getFork() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public JspConfig getJspConfig() {
		return jspConfig;
	}

	@Override
	public boolean isXpoweredBy() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public TagPluginManager getTagPluginManager() {
		return tagPluginManager;
	}

	@Override
	public boolean genStringAsCharArray() {
		return true;
	}

	@Override
	public int getModificationTestInterval() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public boolean getRecompileOnFail() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean isCaching() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Map<String, TagLibraryInfo> getCache() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int getMaxLoadedJsps() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int getJspIdleTimeout() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public boolean getStrictQuoteEscaping() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean getQuoteAttributeEL() {
		// TODO Auto-generated method stub
		return false;
	}
}


  • 发表于 2018-04-11 09:11
  • 阅读 ( 3151 )
  • 分类:开源项目

条评论

请先 登录 后评论
不写代码的码农
呓语的风

2 篇文章

作家榜 »

  1. 小编 文章
返回顶部
部分文章转自于网络,若有侵权请联系我们删除