您的位置:首页 > 其它

Freemarker笔记

2016-05-23 10:45 127 查看
1. 关键代码

package com.testxx.weixin.base.view;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.Map;

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

import org.springframework.beans.BeansException;
import org.springframework.util.StringUtils;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerView;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.testxx.weixin.base.cons.ConsProper;
import com.testxx.weixin.base.cons.Consts;

import freemarker.template.SimpleHash;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
* 处理静态化页面
* @author XIONGXING
*
*/
public class CustomerFreeMarkerView extends FreeMarkerView {

protected ConsProper consProper;

@Override
protected void initServletContext(ServletContext servletContext) throws BeansException {
super.initServletContext(servletContext);
WebApplicationContext  webcontext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
consProper = (ConsProper)webcontext.getBean(ConsProper.class);
}

@Override
protected void doRender(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
throws Exception {

// Expose model to JSP tags (as request attributes).
exposeModelAsRequestAttributes(model, request);
// Expose all standard FreeMarker hash models.
SimpleHash fmModel = buildTemplateModel(model, request, response);
if (logger.isDebugEnabled()) {
logger.debug("Rendering FreeMarker template [" + getUrl() + "] in FreeMarkerView '" + getBeanName() + "'");
}
// Grab the locale-specific version of the template.
Locale locale = RequestContextUtils.getLocale(request);

/*
* 1:创建HTML 0,其他 都不会创建
*
* CREATE_HTML_PATH:文件完整路径
*/
Integer createHtmlFlag = (Integer) model.get(Consts.CREATE_HTML);
String createFilePath = (String) model.get(Consts.CREATE_HTML_PATH);

if (null != createHtmlFlag && 1 == createHtmlFlag.intValue()) {
if(StringUtils.isEmpty(createFilePath)){
String uri = request.getRequestURI();
createFilePath =consProper.getCreateHTMLRootPath()+uri.substring(0,uri.lastIndexOf("."))+".html";
logger.info("createFilePath:"+createFilePath);
}
createHTML(getTemplate(locale), fmModel, request, response, createFilePath);
}
processTemplate(getTemplate(locale), fmModel, response);
}

/**
* 生成自定义的视图
*
* @param response
* @param obj
* @throws IOException
*/
@SuppressWarnings("unused")
private void print(HttpServletResponse response, Object obj)
throws IOException {
PrintWriter writer = response.getWriter();
writer.print(new ObjectMapper().writeValueAsString(obj));
writer.flush();
writer.close();
}

/**
* 创建HTML时校验
*
* @param template
* @param model
* @param request
* @param response
* @throws IOException
* @throws TemplateException
* @throws ServletException
*/
private void createHTML(Template template, SimpleHash model,
HttpServletRequest request, HttpServletResponse response,
String htmlPath) throws IOException, TemplateException,
ServletException {
File htmlFile = new File(htmlPath);
if (!htmlFile.getParentFile().exists()) {
htmlFile.getParentFile().mkdirs();
}
if (htmlFile.exists() && htmlFile.delete()) { // 文件存在并删除成功
createHTMLFile(template, model, htmlFile);
}
if (!htmlFile.exists()) { // 文件不存在则进行创建
createHTMLFile(template, model, htmlFile);
}
}

/**
* 创建文件
*
* @param template
* @param model
* @param htmlFile
* @throws IOException
* @throws TemplateException
*/
private void createHTMLFile(Template template, SimpleHash model,
File htmlFile) throws IOException, TemplateException {
Writer out = null;
try {
htmlFile.createNewFile();
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(htmlFile), Consts.UTF_8));
// 处理模版
template.process(model, out);
} finally {
if (out != null) {
out.flush();
out.close();
}
}
}
}


springmvc.xml相关freemarker的配置

<!-- config begin-->
<context:property-placeholder location="classpath:/config/properties/application-freemarker.properties" ignore-unresolvable="true" />
<!-- config end-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="viewClass" value=" com.testxx.weixin.base.view.CustomerFreeMarkerView" />
<property name="cache">
<value>true</value>
</property>
<property name="suffix">
<value>.ftl</value>
</property>
<property name="contentType">
<value>text/html; charset=UTF-8</value>
</property>
</bean>

<!-- 这里配置的是freemarker -->

<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/views/" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">0</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="number_format">0.##########</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="classic_compatible">true</prop>
<prop key="template_exception_handler">ignore</prop>
</props>
</property>
<!-- Freemarker 变量  -->
<property name="freemarkerVariables" >
<map>
<entry key="webRoot" value="${webRoot}"></entry>
<entry key="nginxRoot" value="${nginxRoot}"></entry>
</map>
</property>
</bean>

<!-- 设置freeMarker的配置文件路径 -->
<bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean"></bean>


controller如果如下部分,则会生成HTML代码,否则按正常流程走过

mv.addObject(Consts.CREATE_HTML,1);

2.总结说明

目前觉得挺好用的一款框架, 查阅过一些资料,尤其与jsp对比, freemarker略胜一筹。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: