/** */ /** * * <p> * 模板预处理类,主要在输出到模板之前做一些自定义操作 * </p> * * <p> * 以下为FreemarkerServlet的具体执行顺序 * </p> * <ul> * <li type="i">init()</li> * <li type="i"> | -- createConfiguration()</li> * <li type="i"> | -- createObjectWrapper()</li> * <li></li> * <li type="i"><font color="gray">process(request,response)</font></li> * <li type="i"> | -- preprocessRequest(request, response)</li> * <li type="i"> | -- requestUrlToTemplatePath(request)</li> * <li type="i"> | -- deduceLocale(path, request, response))</li> * <li type="i"> | -- createModel(wrapper, servletContext, request, response)</li> * <li type="i"> | -- | -- initializeServletContext(request, response)</li> * <li type="i"> | -- | -- initializeSession(request, response)</li> * <li type="i"> | -- | -- createRequestParametersHashModel(request)</li> * <li type="i"> | -- preTemplateProcess(request, response, template, model)</li> * <li type="i"> | -- <font color="gray">template.process(model, * response.getWriter())</font></li> * <li type="i"> | -- postTemplateProcess(request, response, template, model)</li> * </ul> * * <p> * 请按照对应的执行顺序进行适当覆盖 * </p> * <p> * 注:灰色部分为重要的中间环节, 不是可覆盖的方法 * * </p> */ public class BaseServlet extends FreemarkerServlet ... { private static final long serialVersionUID = -7091792853096097981L; /**//* * <p>覆盖构建配置过程, 这里可以自定义配置</p> * * @see freemarker.ext.servlet.FreemarkerServlet#createConfiguration() */ @Override protected Configuration createConfiguration() ...{ // 取得配置 Configuration config = super.createConfiguration(); // 自动引入core模板, 此模板封装了大部分公共宏 config.addAutoInclude("/template/common/core.ftl"); return config; } /**//* * <p>覆盖创建模型方法, 这里可以对模型生成过程进行定制处理</p> * * @see freemarker.ext.servlet.FreemarkerServlet#createModel(freemarker.template.ObjectWrapper, * javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @Override protected TemplateModel createModel(ObjectWrapper wrapper, ServletContext servletContext, HttpServletRequest request, HttpServletResponse response) throws TemplateModelException ...{ // TODO: 自定义修改模型 return super.createModel(wrapper, servletContext, request, response); } /**//* * <p>覆盖创建对象树方法, 主要进行模板对象树的内容</p> * * @see freemarker.ext.servlet.FreemarkerServlet#createObjectWrapper() */ @Override protected ObjectWrapper createObjectWrapper() ...{ // TODO Auto-generated method stub return super.createObjectWrapper(); } /**//* * <p>覆盖构建参数Hash列表方法, 这里可以自定义请求参数列表</p> * * @see freemarker.ext.servlet.FreemarkerServlet#createRequestParametersHashModel(javax.servlet.http.HttpServletRequest) */ @Override protected HttpRequestParametersHashModel createRequestParametersHashModel( HttpServletRequest request) ...{ return super.createRequestParametersHashModel(request); } /**//* * <p>覆盖deduceLocale方法, 主要可以自定义一些本地化的内容</p> * * @see freemarker.ext.servlet.FreemarkerServlet#deduceLocale(java.lang.String, * javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @Override protected Locale deduceLocale(String str, HttpServletRequest request, HttpServletResponse response) ...{ // TODO Auto-generated method stub return super.deduceLocale(str, request, response); } /**//* * <p>覆盖Servlet上下文方法, 主要实现自定义上下文</p> * * @see freemarker.ext.servlet.FreemarkerServlet#initializeServletContext(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @Override protected void initializeServletContext(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ...{ super.initializeServletContext(request, response); } /**//* * <p>覆盖初始化Session方法, 主要定制Session内容</p> * * @see freemarker.ext.servlet.FreemarkerServlet#initializeSession(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @Override protected void initializeSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ...{ super.initializeSession(request, response); } /**//* * <p>覆盖输出模板方法, 这是整个周期的最后一步, 主要做一些后期处理和收尾工作</p> * * @see freemarker.ext.servlet.FreemarkerServlet#postTemplateProcess(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse, * freemarker.template.Template, freemarker.template.TemplateModel) */ @Override protected void postTemplateProcess(HttpServletRequest request, HttpServletResponse response, Template template, TemplateModel data) throws ServletException, IOException ...{ super.postTemplateProcess(request, response, template, data); } /**//* * <p>覆盖请求处理方法, 主要实现在请求被处理前的自定义操作</p> * * @see freemarker.ext.servlet.FreemarkerServlet#preprocessRequest(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse) */ @Override protected boolean preprocessRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ...{ // TODO: 实现自定义Request处理 return super.preprocessRequest(request, response); } /**//* * <p>覆盖模板预处理方法, 主要实现模板处理前的具体自定义操作</p> <p>这里可以加转换和模板方法的处理代码,例如:</p> * <code> SimpleHash sh = (SimpleHash) data; sh.put("upperCase", new * UpperCaseTransform()); </code> <p>或</p> <code> SimpleHash sh = * (SimpleHash) data; sh.put("indexOf", new IndexOfMethod()); </code> * * @see freemarker.ext.servlet.FreemarkerServlet#preTemplateProcess(javax.servlet.http.HttpServletRequest, * javax.servlet.http.HttpServletResponse, * freemarker.template.Template, freemarker.template.TemplateModel) */ @Override protected boolean preTemplateProcess(HttpServletRequest request, HttpServletResponse response, Template template, TemplateModel data) throws ServletException, IOException ...{ SimpleHash sh = (SimpleHash) data; // 装载转换器 IBuilder tb = new TransformBuilder(sh); sh = tb.getSimpleHash(); // 装载模板方法 IBuilder mb = new MethodBuilder(sh); sh = mb.getSimpleHash(); // 装载其他上下文 IBuilder cb = new ContextBuilder(sh, request); sh = cb.getSimpleHash(); return super.preTemplateProcess(request, response, template, sh); }