jFinal 集成Velocity的toolbox,仓促完成的,有改进的想法欢迎留言:)

package com.jfinal.render;

import java.io.IOException;
import java.io.Writer;
import java.util.Properties;

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

import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;
import org.apache.velocity.io.VelocityWriter;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.tools.view.ToolboxManager;
import org.apache.velocity.tools.view.context.ChainedContext;
import org.apache.velocity.tools.view.servlet.ServletToolboxManager;
import org.apache.velocity.util.SimplePool;

@SuppressWarnings("deprecation")
public class VelocityWithToolboxRender extends Render
{
   private static final String TOOL_BOX_CONF_FILE ="/WEB-INF/toolbox.xml";
   private static final String encoding = getEncoding();
   private static final String contentType = "text/html;charset=" + encoding;
   protected ToolboxManager toolboxManager = null;
   private static SimplePool writerPool = new SimplePool(40);

   public VelocityWithToolboxRender(String view)
   {
      this.view = view;
      initToolbox(RenderFactory.getServletContext());
   }
   
   static {
      String webPath = RenderFactory.getServletContext().getRealPath("/");  
      Properties properties = new Properties();
      properties.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, webPath);
      properties.setProperty(RuntimeConstants.ENCODING_DEFAULT, encoding); 
      properties.setProperty(RuntimeConstants.INPUT_ENCODING, encoding); 
      properties.setProperty(RuntimeConstants.OUTPUT_ENCODING, encoding); 
      
      Velocity.init(properties); 
   }

   protected void initToolbox(ServletContext servletContext)
   {
      toolboxManager = ServletToolboxManager.getInstance(servletContext, TOOL_BOX_CONF_FILE);
   }

   @SuppressWarnings("unchecked")
   protected Context createContext(HttpServletRequest req, HttpServletResponse resp)
   {
      ChainedContext ctx = new ChainedContext(new VelocityEngine(), req, resp, RenderFactory.getServletContext());

      if (toolboxManager != null)
      {
         ctx.setToolbox(toolboxManager.getToolbox(ctx));
      }
      return ctx;
   }

   @Override
   public void render()
   {
      Context context = createContext(request, response);
      VelocityWriter vw = null;
      Template template = Velocity.getTemplate(view);
      response.setContentType(contentType);
      try
      {
         Writer writer = response.getWriter();
         vw = (VelocityWriter) writerPool.get();
         if (vw == null)
         {
            vw = new VelocityWriter(writer, 4 * 1024, true);
         }
         else
         {
            vw.recycle(writer);
         }
         template.merge(context, vw);
      }
      catch (IOException e)
      {
      }
      finally
      {
         if (vw != null)
         {
            try
            {
               vw.flush();
               vw.recycle(null);
               writerPool.put(vw);
            }
            catch (Exception e)
            {
               Velocity
                     .debug("VelocityViewServlet: " + "Trouble releasing VelocityWriter: " + e.getMessage());
            }
         }
      }
   }

}


用法如下:写一个BaseController
@Override
   public void render(String view)
   {
      super.render(new VelocityWithToolboxRender(view));
   }

因为我的项目中展现层用的是Velocity,所以可以直接覆盖super class的render方法。
  

转载于:https://my.oschina.net/yangxiaobin/blog/62059

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值