📄 basepagevender.java.svn-base
字号:
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 + -