深入浅出FreeMarker(二)-高级教程
深入浅出FreeMarker(二)-高级教程Peter Wei2012-3-6搜狐技术部-我的搜狐i.sohu.comFreemarker 的功能MVC 框架中的View 层组件 Html 页面静态
深入浅出FreeMarker(二)-高级教程
Peter Wei
2012-3-6
搜狐技术部-我的搜狐
i.sohu.com
Freemarker 的功能
MVC 框架中的View 层组件 Html 页面静态化 代码生成工具 CMS 模板引擎 页面栏目动态定制
基础教程
深入浅出FreeMarker(一)-基础教程
FreeMarker 介绍
开发指南-5分钟入门
开发进阶
实例应用讲解(我的搜狐marco 宏以及layout 布局的使用) 常用FreeMarker 资源
,分享目标
掌握macro 宏的使用
掌握freemarker 在MVC 框架View 层中的使用细节
掌握freemarker 结合springmvc 的异常处理
深入了解freemarker 在页面静态化以及cms 中的使用,达到综合应用的能力。
Macro 宏的使用
个人展示页url 应用地址生成,有个性域名及没有的规则不一样。
宏showUrl.ftl
<#--
Description:根据domain 或者upt 、接入方式、appname 动态生成url Author: Peter Wei (mailto:guangbowei@sohu-inc.com) -->
<#--
拼装个人展示地址:因为会存在没有domain 的用户
domain:个性域名 upt:经加密后的url passport
host:主机
accessType:接入方式
appName:如blog,mblog ,video 等
-->
host="i.sohu.com" <#macro showUrl domain=show_domain!"" upt =show_upt!""
accessType="index" appName="index" > <#escape x as (x!)?html >
<#if domain!="" >
<#if accessType=="proxy " > http://${domain}. ${host}/${appName}/<#t> http://${domain}. ${host}/app/${appName}/<#t> http://${domain}. ${host}/<#t> <#elseif accessType=="appview " > <#else> #if>
,<#elseif upt!="" >
<#if accessType==" proxy " > http://${host}/p/${upt}/${appName}/<#t> http://${host}/p/${upt}/app/${appName}/<#t> http://${host}/p/${upt}/<#t> <#elseif accessType=="appview " > <#else> #if>
#if>
#escape>
#macro>
Head.ftl
<#import "component/showUrl.ftl" as c>
生成界面
- 首页
href="/upload/12/0zv40ppl4ltmblog/index.htm">微博
href="/upload/12/0zv40ppl4ltblog/index.htm">博客
href="/upload/12/0zv40ppl4ltalbum/index.htm">相册
href="/upload/12/0zv40ppl4ltvideo/index.htm">播客
href="/upload/12/0zv40ppl4ltscomment/index.htm">我来说两句
href="/upload/12/0zv40ppl4ltapp/baby/">育儿
href="/upload/12/0zv40ppl4ltapp/wenda/">问答
href="javascript:void(0);">更多
Freemarker 使用细节
Html 转义
<#escape x as (x!)?html>
#escape>
变量及全局变量
,<#assign soml_follow="
<#assign soml_grade="
<#assign soml_visitor="
<#assign soml_interested="
<#assign soml_follow_user="
<#assign follow>
#assign>
<#--JS 版本号-->
<#global version="201202022018" >
<#t>标签
源代码清除空白不换行标签
<#if accessType=="proxy " > http://${host}/p/${upt}/${appName}/<#t> http://${host}/p/${upt}/app/${appName}/<#t> http://${host}/p/${upt}/<#t> <#elseif accessType=="appview " > <#else> #if>
,List 索引_index
class="img-list1" >
- <#if
root.subList[0]?exists&&root.subList[0].productList?exists>
<#list root.subList[0].productList as product> <#if (product_index>=6)>
<#if (product_index>=9)> <#break> #if> #if>
#list>
#if>
Java 常量及枚举类型的使用
常量
/**
* 布局类型
*/
public static final String LAYOUT_TYPE = "layout_type";
/**
* 默认布局, 内容区通栏
*/
public static final String DEFAULT_LAYOUT = "2" ;
/**
* 两列布局,内容区分左右
*/
public static final String TWO_COLUMN_LAYOUT = "2" ;
,ConfigInterceptor
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws
{ ModelAndView modelAndView) throws Exception {
BeansWrapper bw = SimpleObjectWrapper.getDefaultInstance (); TemplateHashModel statics = bw.getStaticModels();
modelAndView.addObject("statics" , statics);
}
Exception
ftl 页面调用
<#assign
PersonConstant=statics?if_exists["com.sohu.suc.person.constants.PersonConstant"]>
{PersonConstant.TWO_COLUMN_LAYOUT}
SpringMVC 中的配置
class ="org.springframework.web.servlet.view.freemarker.FreeMarker
key="auto_import">/common/index.ftl key="tag_syntax">auto_detect
异常处理
freemarker 提供了一个支持其错误处理机制的接口 TemplateExceptionHandler ,需要自己去扩展实现,构造自己的处理freemarker 模板错误的规范。
主要分为两个部分
,实现接口
public class FreemarkerExceptionHandler implements
TemplateExceptionHandler {
private static final Logger log =
Logger. getLogger (FreemarkerExceptionHandler.class );
/* (non-Javadoc)TemplateException
* @see
freemarker.template.TemplateExceptionHandler#handleTemplateException(freemarker.template.TemplateException, freemarker.core.Environment, java.io.Writer)
*/
@Override
public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException {
try {
out.write("[Freemarker Error: " te.getMessage() "]"); log .warn("[Freemarker Error: " te.getMessage() "]"); } catch (IOException e) {
log .warn(e.getMessage());
throw new TemplateException("Failed to print error message. Cause: " e, env);
}
}
}
接口加入spring freemarker配置中
key="template_exception_handler">com.sohu.suc.plaza.web.util.FreemarkerExceptionHandler
页面静态化
为什么要静态化
互联网,特别是门户网站,用户量和请求量都特别大。 如何解决高并发高负载的问题
常规的手段
● CDN
● 负载均衡(nginx)
● 应用缓存(memcached,redis) ● 分库分表
● 图片服务器分离
● HTML 静态化
应用Cache 再快,也快不过html 静态化页面
静态内容CDN 系统
图片、CSS 、JS 脚本、html 静态化页面