深入浅出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>

,

<#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>

Head.ftl

<#import "component/showUrl.ftl" as c>

,

生成界面

Freemarker 使用细节

Html 转义

<#escape x as (x!)?html>

变量及全局变量

,

<#assign soml_follow="">

<#assign soml_grade="">

<#assign soml_visitor="">

<#assign soml_interested="">

<#assign soml_follow_user="">

<#assign follow>

<#--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>

,

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)>

  • ${product.productName?if_exists}

  • <#if (product_index>=9)> <#break>

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

/WEB-INF/pages/ true GBK

,

ignore 300 yyyy-MM-dd HH:mm:ss yyyy-MM-dd HH:mm:ss # true,false true -->

key="auto_import">/common/index.ftl

key="tag_syntax">auto_detect

GBK -->

异常处理

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 静态化页面

标签: