All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nutz.plugins.view.velocity.VelocityLayoutView Maven / Gradle / Ivy

package org.nutz.plugins.view.velocity;

import java.io.StringWriter;
import java.io.Writer;
import java.util.Map.Entry;

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

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.io.VelocityWriter;
import org.apache.velocity.util.SimplePool;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.view.AbstractPathView;

/**
 * Created by Wizzer on 14-9-23.
 * Modify by wendal on 15-5-20
 */
public class VelocityLayoutView extends AbstractPathView {

    private static final Log log = Logs.get();
    
    protected static final int WRITER_BUFFER_SIZE = 8 * 1024;
    
    protected SimplePool writerPool = new SimplePool(40);


    public VelocityLayoutView(String dest) {
        super(dest);
    }

    public void render(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Exception {
        String path = evalPath(req, obj);
        resp.setContentType("text/html;charset=\"UTF-8\"");
        resp.setCharacterEncoding("UTF-8");
        try {
            StringWriter sw = new StringWriter();
            org.nutz.lang.util.Context ctx = super.createContext(req, obj);
            Context context = new VelocityContext();
            for (Entry en : ctx.getInnerMap().entrySet()) {
                context.put(en.getKey(), en.getValue());
            }
            path = path.replace('.', '/');
            if (path.endsWith("/vm")) {
                path = path.substring(0, path.length() - 3) + ".vm";
            } else {
                path += ".vm";
            }
            log.debug("Path::"+ path);
            Template template = Velocity.getTemplate(path);
            template.merge(context, sw);
            internalRenderTemplate(template, context, resp.getWriter());
        } catch (Exception e) {
            log.error("模板引擎错误", e);
            throw e;
        }
    }
    
    private void internalRenderTemplate(Template template, Context context, Writer writer) throws Exception {
        VelocityWriter velocityWriter = null;
        try {
            velocityWriter = (VelocityWriter) writerPool.get();
            if (velocityWriter == null) {
                velocityWriter = new VelocityWriter(writer, WRITER_BUFFER_SIZE, true);
            } else {
                velocityWriter.recycle(writer);
            }
            template.merge(context, velocityWriter);
        } catch (Exception pee) {
            throw new Exception(pee);
        } finally {
            if (velocityWriter != null) {
                velocityWriter.flush();
                velocityWriter.recycle(null);
                writerPool.put(velocityWriter);
            }
            writer.flush();
            writer.close();
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy