/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.portal.engine; import java.io.File; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import com.jinhe.tss.component.param.ParamManager; import com.jinhe.tss.component.param.entity.Param; import com.jinhe.tss.component.param.extend.ParamConfig; import com.jinhe.tss.component.support.web.webwork.PTActionSupport; import com.jinhe.tss.core.Config; import com.jinhe.tss.core.sso.context.Context; import com.jinhe.tss.core.util.FileHelper; import com.jinhe.tss.core.util.URLUtil; import com.jinhe.tss.portal.PortalConstants; import freemarker.template.TemplateException; /** * 支持freemarker引擎解析的Action基类。 * * 可用于组件的预览等功能。 * */ public abstract class FreeMarkerSupportAction extends PTActionSupport { /** 用户自定义的参数(在参数模块中,名称为userdefinedParams) */ private static final String USER_DEFINED_PARAMS = "userdefinedParams"; private static final String USE_FREEMARKER = "useFreemarker"; // 是否解析 protected Logger log = Logger.getLogger(this.getClass()); protected Long portalId; public void setPortalId(Long portalId) { this.portalId = portalId; } /** * 解析Freemarker模板 * @param template * @return */ protected String printHTML(String template){ return printHTML(template, true); } protected String printHTML(String template, boolean parseTwice){ if( !Config.TRUE.equalsIgnoreCase(ParamConfig.getAttribute(USE_FREEMARKER)) ){ print(template); return XML; } try { FreemarkerParser parser = getFreemarkerParser(); if(parser.isFtlTemplateReady){ HttpServletResponse response = Context.getResponse(); response.setContentType("text/html;charset=GBK"); if(parseTwice) { // 是否需要解析两次 parser.parseTemplateTwice(template, response.getWriter()); } else { parser.parseTemplate(template, response.getWriter()); } return XML; } } catch (Exception e) { log.error("执行Freemarker引擎解析时候出错", e); String errorInfo = "执行Freemarker引擎解析时候出错,请联系管理员!<br/>错误信息:(" + e.getMessage() + ")<br/>"; if(e instanceof TemplateException){ print(errorInfo + ((TemplateException)e).getFTLInstructionStack() + template); }else { print(errorInfo + e); } return XML; } print(template); return XML; } @SuppressWarnings("unchecked") protected FreemarkerParser getFreemarkerParser(){ HttpServletRequest request = Context.getRequestContext().getRequest(); //设置门户资源路进为Freemarker模板路径 FreemarkerParser parser = new FreemarkerParser(getPortalResourcesPath()); if(parser.isFtlTemplateReady){ // 将本次http请求中带的参数放入到freemarker数据模型中, // 以方便调用,因为是每次请求都新建一个FreemarkerParser,所以不会存在多线程问题。 parser.putParameters(request.getParameterMap()); parser.putParameters(getUserDefineParams()); } return parser; } protected File getPortalResourcesPath(){ URL url = URLUtil.getWebFileUrl(PortalConstants.PORTAL_MODEL_DIR); List<File> list = FileHelper.listSubDir(new File(url.getFile())); for( File file : list ){ if(file.getName().endsWith("_" + portalId)) //判断文件夹路径是否以 "_12"这样结尾,是的话表示是当前门户的资源文件夹 return file; } return null; } // 获取用户自定义的参数(在参数模块中,名称为userdefinedParams) protected Map<String, String> getUserDefineParams(){ Map<String, String> paramsMap = new HashMap<String, String>(); try{ List<Param> params = ParamManager.getComboParam(USER_DEFINED_PARAMS); if(params != null){ for( Param p : params ){ paramsMap.put(p.getText(), p.getValue()); } } } catch(Exception e) { //do nothing } return paramsMap; } }