⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interpreterservlet.java

📁 ZK 基础介绍 功能操作 模块 结合数据库操作
💻 JAVA
字号:
/* InterpreterServlet.java{{IS_NOTE	Purpose:			Description:			History:		Mon Sep  5 17:06:34     2005, Created by tomyeh}}IS_NOTECopyright (C) 2005 Potix Corporation. All Rights Reserved.{{IS_RIGHT	This program is distributed under GPL Version 2.0 in the hope that	it will be useful, but WITHOUT ANY WARRANTY.}}IS_RIGHT*/package org.zkoss.web.servlet.dsp;import java.io.File;import java.io.InputStream;import java.io.InputStreamReader;import java.io.FileInputStream;import java.io.OutputStream;import java.io.StringWriter;import java.io.IOException;import java.net.URL;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServlet;import org.zkoss.lang.D;import org.zkoss.lang.Exceptions;import org.zkoss.lang.SystemException;import org.zkoss.util.logging.Log;import org.zkoss.util.resource.ResourceCache;import org.zkoss.util.resource.Locator;import org.zkoss.io.Files;import org.zkoss.xel.taglib.Taglibs;import org.zkoss.web.servlet.Charsets;import org.zkoss.web.servlet.Servlets;import org.zkoss.web.servlet.http.Https;import org.zkoss.web.util.resource.ResourceCaches;import org.zkoss.web.util.resource.ResourceLoader;import org.zkoss.web.util.resource.ClassWebResource;/** * The servlet used to interpret the DSP file (Potix Dynamic Script Page). * * <p>Initial parameters: * <dl> * <dt>charset</dt> * <dd>The default character set if not specified in the DSP page.<br/> * Default: UTF-8.</dd> * <dt>class-resource</dt> * <dd>Whether to search the class loader if a resource is not found * in the Web application (i.e., ServletContext).</dd> * Default: false.</dd> * </dl> * * @author tomyeh */public class InterpreterServlet extends HttpServlet {	private static final Log log = Log.lookup(InterpreterServlet.class);	private ServletContext _ctx;	private String _charset = "UTF-8";	private Locator _locator;	private boolean _compress = true;	public void init(ServletConfig config) throws ServletException {		//super.init(config);			//Note callback super to avoid saving config		_ctx = config.getServletContext();		String param = config.getInitParameter("compress");		if (param != null)			_compress = "true".equals(param);		param = config.getInitParameter("class-resource");		final boolean bClsRes = "true".equals(param);		_locator = new Locator() {			public String getDirectory() {				return null; //FUTURE: support relative path			}			public URL getResource(String name) {				URL url = null;				if (name.indexOf("://") < 0) {					try {						url = _ctx.getResource(name);						if (bClsRes && url == null)							url = ClassWebResource.getResource(name);					} catch (java.net.MalformedURLException ex) { //eat it					}				}				return url != null ? url: Taglibs.getDefaultURL(name);			}			public InputStream getResourceAsStream(String name) {				InputStream is = _ctx.getResourceAsStream(name);				return !bClsRes || is != null ? is:					ClassWebResource.getResourceAsStream(name);			}		};		param = config.getInitParameter("charset");		if (param != null) _charset = param.length() > 0 ? param: null;	}	public ServletContext getServletContext() {		return _ctx;	}	//-- super --//	protected	void doGet(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {		final String path = Https.getThisServletPath(request);		if (D.ON && log.debugable()) log.debug("Get "+path);		final Object old = Charsets.setup(request, response, _charset);		try {			final Interpretation cnt = (Interpretation)				ResourceCaches.get(getCache(), _ctx, path, null);			if (cnt == null) {				if (Https.isIncluded(request)) log.error("Not found: "+path);					//It might be eaten, so log the error				response.sendError(HttpServletResponse.SC_NOT_FOUND, path);				return;			}			final boolean compress = _compress && !Servlets.isIncluded(request);			final StringWriter out = compress ? new StringWriter(): null;			cnt.interpret(				new ServletDspContext(_ctx, request, response, out, null));			if (compress) {				final String result = out.toString();				try {					final OutputStream os = response.getOutputStream();						//Call it first to ensure getWrite() is not called yet						byte[] data = result.getBytes("UTF-8");					if (data.length > 200) {						byte[] bs = Https.gzip(request, response, null, data);						if (bs != null) data = bs; //yes, browser support compress					}						response.setContentLength(data.length);					os.write(data);					response.flushBuffer();				} catch (IllegalStateException ex) { //getWriter is called					response.getWriter().write(result);				}			}		} finally {			Charsets.cleanup(request, old);		}	}	protected	void doPost(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {		doGet(request, response);	}	private static final String ATTR_PAGE_CACHE = "org.zkoss.web.servlet.dsp.PageCache";	private final ResourceCache getCache() {		ResourceCache cache = (ResourceCache)_ctx.getAttribute(ATTR_PAGE_CACHE);		if (cache == null) {			synchronized (InterpreterServlet.class) {				cache = (ResourceCache)_ctx.getAttribute(ATTR_PAGE_CACHE);				if (cache == null) {					cache = new ResourceCache(new MyLoader(), 29);					cache.setMaxSize(1024);					cache.setLifetime(60*60*1000); //1hr					_ctx.setAttribute(ATTR_PAGE_CACHE, cache);				}			}		}		return cache;	}	private class MyLoader extends ResourceLoader {		private MyLoader() {		}		//-- super --//		protected Object parse(String path, File file, Object extra)		throws Exception {			try {				return parse0(new FileInputStream(file),					Interpreter.getContentType(file.getName()));			} catch (Exception ex) {				if (log.debugable())					log.realCauseBriefly("Failed to parse "+file, ex);				else					log.error("Failed to parse "+file+"\nCause: "+Exceptions.getMessage(ex)						+"\n"+Exceptions.getBriefStackTrace(ex));				return null; //as non-existent			}		}		protected Object parse(String path, URL url, Object extra)		throws Exception {			try {				return parse0(url.openStream(),					Interpreter.getContentType(url.getPath()));			} catch (Exception ex) {				if (log.debugable())					log.realCauseBriefly("Failed to parse "+url, ex);				else					log.error("Failed to parse "+url+"\nCause: "+Exceptions.getMessage(ex));				return null; //as non-existent			}		}		private Object parse0(InputStream is, String ctype) throws Exception {			if (is == null) return null;			final String content =				Files.readAll(new InputStreamReader(is, "UTF-8"))				.toString();			return new Interpreter().parse(content, ctype, null, _locator);		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -