Package org.douyu.plugins.freemarker

Source Code of org.douyu.plugins.freemarker.FreeMarkerViewManager

package org.douyu.plugins.freemarker;

import java.io.File;
import java.io.Writer;
import java.util.Map;
import java.util.HashMap;

import douyu.mvc.Context;
import douyu.mvc.ViewException;
import douyu.mvc.ViewManager;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;

/**
*
* @author ZHH
*
*/
public class FreeMarkerViewManager implements ViewManager {

  private static final String defaultContentType = "text/html; charset=UTF-8";
  private static final String defaultEncoding = "UTF-8";

  private Context douyuContext;

  private Configuration config = new Configuration();
  private Map<String, Object> root = new HashMap<String, Object>();

  FreeMarkerViewManager(Context douyuContext) {
    this.douyuContext = douyuContext;
    if (douyuContext.getHttpServletResponse().getContentType() == null)
      douyuContext.getHttpServletResponse().setContentType(defaultContentType);

    try {
      config.setDirectoryForTemplateLoading(new File(douyuContext.getApplicationBase()));
      config.setObjectWrapper(new DefaultObjectWrapper());
    } catch (Throwable t) {
      throw new ViewException(t);
    }
  }

  private String defaultViewFileName() {
    StringBuilder viewFileName = new StringBuilder(50);
    viewFileName.append(douyuContext.getControllerClassName().replace('.', File.separatorChar));
    viewFileName.append(".");
    viewFileName.append(douyuContext.getActionName());
    viewFileName.append(".ftl");

    return viewFileName.toString();
  }

  @Override
  public void out() {
    out(defaultViewFileName());
  }

  @Override
  public void out(String viewFileName) {
    try {
      Template template = config.getTemplate(viewFileName, defaultEncoding);

      if (template != null) {
        Writer writer = douyuContext.getHttpServletResponse().getWriter();

        //TODO
        //template.process内部会自动调用writer.flush,
        //如果在输出ftl文件后又接着输出jsp,那么jsp会出异常:
        //java.lang.IllegalStateException: Cannot create a session after the response has been committed
        //因为调用writer.flush会导致响应头会被提交
        template.process(root, writer);

        //writer.flush();
        //writer.close();
      }
    } catch (Throwable t) {
      throw new ViewException(t);
    }
  }

  @Override
  public void put(String key, Object value) {
    root.put(key, value);
  }
}
TOP

Related Classes of org.douyu.plugins.freemarker.FreeMarkerViewManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.