Freemarker笔记

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略胜一筹。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值