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

📄 basepagevender.java

📁 EasyJWeb是基于java技术
💻 JAVA
字号:
package com.easyjf.web.core.support;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.RuntimeSingleton;

import com.easyjf.web.IPageVender;
import com.easyjf.web.Page;
import com.easyjf.web.WebForm;
import com.easyjf.web.WebInvocationParam;
import com.easyjf.web.core.FrameworkEngine;
import com.easyjf.web.exception.FrameworkException;

/**
 * 基础的页面合成支持类,完成了除了最终合成页面以外的所有工作, 如得到模板,创建Velocity上下文对象等
 * 
 * @author stefanie_wu
 * 
 */
abstract public class BasePageVender implements IPageVender {

	private static final Logger logger = Logger.getLogger(BasePageVender.class);

	private Map globalUtils;

	private final static Map templateCache = new HashMap();

	public boolean venderPage(HttpServletRequest request,
			HttpServletResponse response, Page page, WebInvocationParam param) {
		String uri = page.getUrl();
		Context context = createContext(param.getForm());
		context.put("session", PageVenderSupport.session2map(request
				.getSession()));
		context.put("request", PageVenderSupport.request2map(request));
		if (FrameworkEngine.getValidateManager() != null)
			context.put("errors", FrameworkEngine.getValidateManager()
					.getErrors().getErrors());
		try {
			Template template = getTemplate(uri, request.getCharacterEncoding());
			if (context != null && (template != null)) {
				return mergeTemplate(template, context, response, page,
						request, param);
			} else {
				throw new FrameworkException("模块合成出错!");
			}
		} catch (ResourceNotFoundException rnfe) {
			throw new FrameworkException("找不到模板!"
					+ FrameworkEngine.getWebConfig().getTemplateBasePath()
					+ uri, rnfe);
		} catch (ParseErrorException pee) {
			throw new FrameworkException("模板文件中存在语法错误,不能正常解析!"
					+ FrameworkEngine.getWebConfig().getTemplateBasePath()
					+ uri, pee);
		} catch (MethodInvocationException mie) {
			throw new FrameworkException("模板方法调用错误:", mie);
		} catch (Exception e) {
			throw new FrameworkException("查找模板错误!", e);
		}
	}

	abstract public Integer getOrder();

	/**
	 * 模板方法,子类需要实现该方法来完成最终的合成页面步骤
	 * 返回的boolea值作为最终venderPage方法的返回值
	 * 
	 * @param template
	 *            处理完成的Velocity模板对象
	 * @param context
	 *            处理完成的Velocity上下文对象
	 * @param response
	 *            HttpServletResponse对象
	 * @param page
	 *            处理完成的Page对象
	 * @return
	 */
	abstract protected boolean mergeTemplate(Template template,
			Context context, HttpServletResponse response, Page page,
			HttpServletRequest request, WebInvocationParam param);

	/**
	 * 填充Velocity上下文, 从form的resultMap,并加入公共工具类
	 * 
	 * @param form
	 * @return
	 */
	protected Context createContext(WebForm form) {
		Map result = form.getEasyJWebResult();
		Context context = new VelocityContext();
		for (Iterator it = result.keySet().iterator(); it.hasNext();) {
			String name = (String) it.next();
			context.put(name, result.get(name));
		}
		PageVenderSupport.createUtilContext(context, this.globalUtils);
		return context;
	}

	/**
	 * 根据模板名字和编码完成Velocity模板对象的创建工作
	 * 
	 * @param templateName
	 * @param encoding
	 * @return
	 * @throws ResourceNotFoundException
	 * @throws ParseErrorException
	 * @throws MethodInvocationException
	 * @throws Exception
	 */
	protected Template getTemplate(String templateName, String encoding)
			throws ResourceNotFoundException, ParseErrorException,
			MethodInvocationException, Exception {
		String name = parseTemplateName(templateName);

		if (FrameworkEngine.getWebConfig().isDebug())
			return RuntimeSingleton.getTemplate(name, encoding);// 若为Debug状态,则每次都重新载入模板
		String templatePath = (String) Velocity
				.getProperty("file.resource.loader.path");
		java.io.File f = new java.io.File(new java.io.File(templatePath), name);
		Template template = (Template) templateCache.get(name);// 先从Cache中读取模板文件
		// 这里得进一步完善,当用户已经更改模板文件后,需要能够自动加载,同时增加Cache数量的限制
		if (template == null
				|| (f.exists() && f.lastModified() > template.getLastModified()))
			synchronized (templateCache) {
				{
					logger.info("重新加载模板文件:" + name);
					template = RuntimeSingleton.getTemplate(name, encoding);// name
					templateCache.put(name, template);
				}
			}
		return template;
	}

	private String parseTemplateName(String templateName) {
		String name = templateName;
		if (name.length() > 10) {
			String begin = name.substring(0, 10);
			if (begin.equalsIgnoreCase("classpath:"))
				name = templateName.substring(10);
		}
		String language = com.easyjf.web.ActionContext.getContext()
				.getRequest().getLocale().getLanguage();
		String templatePath = (String) Velocity
				.getProperty("file.resource.loader.path");
		java.io.File f = new java.io.File(new java.io.File(templatePath), name);
		String tname = language + java.io.File.separator
				+ name.substring(name.lastIndexOf("/") + 1);
		java.io.File i18nFile = new java.io.File(f.getParentFile(), tname);
		if (i18nFile.exists()) {
			name = name.substring(0, name.lastIndexOf("/")) + tname;
		}
		return name;
	}

}

⌨️ 快捷键说明

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