依照静态非静态来划分网页分为两种:静态网页和非静态网页,究其优缺点而言,静态网页在用户訪问的时候响应快,可是因为里面的数据是写死的。所以致命的缺陷就是数据不能动态显示。非静态页面(如jsp)数据能够动态显示,能够这样理解,这种页面就是显示数据的一个模板,可是因为在用户请求得到响应曾经。server端须要将其解析为浏览器可识别的html语言。这个解析过程须要耗费时间(尤其页面数据量大的时候。耗费的时间会很多其它),所以致命的缺陷就是请求发出后响应的过程较慢。那么有没有一种方法或工具自己主动生成静态网页呢?答案是肯定的。今天谈一下对FreeMarker的认识:

1、什么是FreeMarker:

FreeMarker是一个用Java语言编写的模板引擎。通过模板(扩展名为“ftl”的文件)生成静态的网页,从而提高訪问站点的用户体验。

2、普通情况下什么时候使用FreeMarker:

一般使用FreeMarker生成门户站点的静态文件。

3、如何使用FreeMarker:

样例1:

a、下载FreeMarker相关jar包:http://download.csdn.net/detail/wangshuxuncom/7592455

b、新建所须要的模板——index.ftl:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
<head>
<title>首页</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<center style="margin-top: 21%;"><font style="color: red;font-size: 39pt;font-weight: bold;">${message}</font></center>
</body>
</html>

c、新建一个Servlet——IndexServlet:

package com.ghj.packageofservlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class IndexServlet extends HttpServlet { private static final long serialVersionUID = 1714787202664419914L; public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("message", "欢迎进入系统。! 。");
request.getRequestDispatcher("index.ftl").forward(request, response);
}
}

d、将FreeMarker相关jar包导入新建的系统中。并配置web.xml文件:

<?

xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class> <!-- FreemarkerServlet settings: -->
<init-param>
<param-name>TemplatePath</param-name><!-- 指定模板的路径 -->
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name><!-- 设置生成html文件的编码方式。 -->
<param-value>text/html; charset=UTF-8</param-value>
</init-param> <!-- FreeMarker settings: -->
<init-param>
<param-name>template_update_delay</param-name><!-- template_update_delay用来指定更新模版文件的间隔时间,相当于多长时间检測一下是否有必要又一次载入模版文件,0 表示每次都又一次载入,否则为多少毫秒钟检測一下模版是否更改。 -->
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name><!-- 设置模板文件的编码方式。 -->
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>number_format</param-name>
<param-value>0.##########</param-value>
</init-param> <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>IndexServlet</servlet-name>
<servlet-class>com.ghj.packageofservlet.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IndexServlet</servlet-name>
<url-pattern>/IndexServlet</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

e、公布project。在http中输入“http://127.0.0.1:8080/project名/IndexServlet”就可以看到效果。

        说明:在这个project中,ftl文件充当了类似于jsp的角色。

0分下载该样例

样例2:

a、下载FreeMarker相关jar包:http://download.csdn.net/detail/wangshuxuncom/7592455

b、新建所须要的模板——index.html(注意:非“ftl”):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
<head>
<title>首页</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<center style="margin-top: 21%;"><font style="color: red;font-size: 39pt;font-weight: bold;">${message}</font></center>
</body>
</html>

c、新建一个Servlet——IndexServlet:

package com.ghj.packageofservlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class IndexServlet extends HttpServlet { private static final long serialVersionUID = 1714787202664419914L; public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("message", "欢迎进入系统!!。");
request.getRequestDispatcher("index.html").forward(request, response);//非“index.html”非“index.ftl”
}
}

d、将FreeMarker相关jar包导入新建的系统中,并配置web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class> <!-- FreemarkerServlet settings: -->
<init-param>
<param-name>TemplatePath</param-name><!-- 指定模板的路径 -->
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name><!-- 设置生成html文件的编码方式。 -->
<param-value>text/html; charset=UTF-8</param-value>
</init-param> <!-- FreeMarker settings: -->
<init-param>
<param-name>template_update_delay</param-name><!-- template_update_delay用来指定更新模版文件的间隔时间。相当于多长时间检測一下是否有必要又一次载入模版文件,0 表示每次都又一次载入。否则为多少毫秒钟检測一下模版是否更改。 -->
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name><!-- 设置模板文件的编码方式。 -->
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>number_format</param-name>
<param-value>0.##########</param-value>
</init-param> <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.html</url-pattern><!-- 非“*.ftl” -->
</servlet-mapping> <servlet>
<servlet-name>IndexServlet</servlet-name>
<servlet-class>com.ghj.packageofservlet.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IndexServlet</servlet-name>
<url-pattern>/IndexServlet</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

e、公布project。在http中输入“http://127.0.0.1:8080/project名/IndexServlet”就可以看到效果;

说明:在这个project中。html文件充当了类似于jsp的角色;本样例和上面的代码基本一样,不同点在于:上一个样例模板的文件类型为ftl,而本样例为html——这说明一点:仅仅要配置得当,模板未必仅仅能是ftl类型的文件。

0分下载该样例

总结:

1、上面两个样例大同小异,看完上面样例之后大家可能会有疑问:上面两个样例中,从client请求的发出到client看到结果整个过程是如何的呢?嗯嗯嗯,这确实是一个须要搞清楚的问题:向IndexServlet发出请求——>IndexServlet接收请求并将模板和模板所需数据作为响应——>FreemarkerServlet接收IndexServlet发出的请求并将数据“填充”到模板对应的位置,然后将响应返回client——>客户看到结果。

2、个人感觉假设用FreeMarker单纯去实现上面的样例,觉得有点儿大材小用,或者说有点儿“屈才”——假设要实现上面的功能。直接使用诸如jsp的非静态页面岂不不更好,FreeMarker的看家本事是生成诸如HTML格式的静态页面(且看以下样例)。

样例3:

a、下载FreeMarker相关jar包:http://download.csdn.net/detail/wangshuxuncom/7592455

        b、新建所须要的模板——index.ftl:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
<head>
<title>首页</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<center style="margin-top: 21%;"><font style="color: red;font-size: 39pt;font-weight: bold;">${message}</font></center>
</body>
</html>

c、新建一个创建HTML静态页面工具类——FreemarkerUtil:

package com.ghj.packageoftool;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map; import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException; /**
* Freemarker工具类
*
* @author GaoHuanjie
*/
public class FreemarkerUtil { /**
* 创建静态HTML文件
*
* @param templateFilePath 模板文件存放的路径
* @param templateFileName 模板文件名
* @param htmlFilePath 静态文件(即HTML文件)保存路径
* @param htmlFileName 所生成静态文件(即HTML文件)的名称
* @param propMap 用于处理模板的属性Object映射
*
* @return boolean 静态文件创建成功返回true,否则返回false
*/
public boolean createHtmlFile(String templateFilePath, String templateFileName, String htmlFilePath, String htmlFileName, Map<String, Object> propMap){
try {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
configuration.setDirectoryForTemplateLoading(new File(templateFilePath));
//configuration.setClassForTemplateLoading(this.getClass(), "/ftl");//假设模板文件在src的某个包内,请将上一行代码凝视掉而使用该代码。ftl代表包名。
Template template = configuration.getTemplate(templateFileName, "UTF-8");//确保模板中的中文在生成静态文件里不变成乱码。 File createHTMLFilePath = new File(htmlFilePath);
if (!createHTMLFilePath.exists()) {//假设保存静态文件(即HTML文件)的根路径不存在,则创建该文件夹。
createHTMLFilePath.mkdirs();
}
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(htmlFilePath + "/" + htmlFileName)), "UTF-8"));//防止数据(propMap)中的中文在静态页面中变为乱码。
template.process(propMap, writer);//生成静态文件
writer.flush();
writer.close();
} catch (TemplateException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
}

d、新建一个创建HTML静态页面监听器——CreatHtmlListener:

package com.ghj.packageoflistener;

import java.util.HashMap;
import java.util.Map; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import com.ghj.packageoftool.FreemarkerUtil; /**
* 创建HTML静态页面监听器
*
* @author GaoHuanjie
*/
public class CreatHtmlListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent event) {
//event.getServletContext().log("创建HTML静态页面监听器销毁!!!");
} public void contextInitialized(ServletContextEvent event) {
FreemarkerUtil freemarkerUtil = new FreemarkerUtil();
String templateFilePath = event.getServletContext().getRealPath("/")+"templates";
String templateFileName = "index.ftl";
String htmlFilePath = event.getServletContext().getRealPath("/");
String htmlFileName = "index.html";
Map<String, Object> propMap = new HashMap<String, Object>();
propMap.put("message", "Hello,欢迎进入系统!。!");
if(freemarkerUtil.createHtmlFile(templateFilePath, templateFileName, htmlFilePath, htmlFileName, propMap)){
event.getServletContext().log("HTML静态页面创建完毕!!!");
}
}
}

e、将FreeMarker相关jar包导入新建的系统中。并配置web.xml文件:

<?

xml version="1.0" encoding="UTF-8"?

>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <listener>
<listener-class>com.ghj.packageoflistener.CreatHtmlListener</listener-class>
</listener> <welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

f、公布project。在http中输入“http://127.0.0.1:8080/project名”就可以看到效果。

说明:在这个project中,创建HTML静态页面的监听器在project被Tomcat公布时被运行而且index.html被创建,在实际应用中某些门户站点生成静态页面的时机并不像该监听器写的那样——往往在监听器中加入一个定时器,在特定的时间点更新静态网页。以使client可以看到最新的内容,我不知道大家留意过没有。门户站点首页内容更新并非那么的频繁。

        【0分下载该样例

对FreeMarker技术的思考的更多相关文章

  1. freemarker技术入门例子(结合struts2)

    由于最近项目里面要求要使用freemarker技术来做展现层,所以在网上搜索了好多资料,基础知识是看了李刚原来写的那本<struts2权威指南>.一直想在网上找一个很基础的例子来入门,但是 ...

  2. 页面静态化技术Freemarker技术的介绍及使用实例.

    一.FreeMarker简介 1.动态网页和静态网页差异 在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术.静态网页,随着HTML代码的生成,页面的内容和显示效 ...

  3. SLAM前端技术选择思考

    以前是专门做室内定位技术研究的,先后学习和分析了多种基于电磁的室内定位技术,如WiFi指纹定位(先后出现过RSSI.CTF.CIR多种指纹特征).WiFi ToF定位.低功耗蓝牙BLE以及iBeaco ...

  4. FreeMarker 技术资料与问题解决备忘录

    技术资料: http://www.ibm.com/developerworks/cn/java/j-lo-freemarker/ FM 解析hash序列 output[name = mouse; pr ...

  5. 关于javascript模块加载技术的一些思考

    前不久有个网友问我在前端使用requireJs和seajs的问题,我当时问他你们公司以前有没有自己编写的javascript库,或者javascript框架,他的回答是什么都没有,他只是听说像requ ...

  6. 海盗湾The Pirate Bay:每一名技术人员都应该思考的问题

    海盗湾The Pirate Bay:一场互联网技术下没有硝烟的战争 写在前面: 开学啦,返校啦!祝大家新的一年,工作顺顺利利,家庭幸福美满! 正文: 假期的时候,闲来无事,看了几部纪录片,其中< ...

  7. 下篇:技术 Leader 的思考方式

    作者: 朱春茂(知明) 技术 Leader 是一个对综合素质要求非常高的岗位,不仅要有解具体技术问题的架构能力,还要具备团队管理的能力,更需要引领方向带领团队/平台穿越迷茫进阶到下一个境界的能力.所以 ...

  8. 制衡技术,从Adblock所想到的

    这是一个很特别的东西.可能已经有人发现了它,但是它并非被广泛接受. 对于这个技术的思考来源主要是在安装了Adblock后想到的.这种反作用力的技术,很可能是一片蓝海.而这种技术的产生及推广,对未来社会 ...

  9. FreeMarker系列学习笔记

    FreeMarker是一个非常优秀的模板引擎,这个模板引擎可用于任何场景,FreeMarker负责将数据模型中的数据合并到模板中,从而生成标准输出.FreeMarker可以提供昜好的团队协作,对于界面 ...

随机推荐

  1. mysql条件查询and or使用实例及优先级介绍

    mysql and与or介绍 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 使用OR关键字时: 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 如果不符合这 ...

  2. HDU——2444The Accomodation of Students(BFS判二分图+最大匹配裸题)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  3. 写给新员工的十点SQL开发建议

    1.建立自己的知识体系 摘抄一句话你所拥有的知识并不取决于你记得多少,而在于它们能否在恰当的时候被回忆起来: 做笔记: 把笔记放在可以随时被找到的地方.个人的笔记可以放在印象笔记之类工具上,单位上的笔 ...

  4. hdfs api读写文写件个人练习

    看下hdfs的读写原理,主要是打开FileSystem,获得InputStream or OutputStream: 那么主要用到的FileSystem类是一个实现了文件系统的抽象类,继承来自org. ...

  5. Hibernate批量更新和批量删除批量添加(转)

    通常,在一个Session对象的缓存中只存放数量有限的持久化对象,等到Session对象处理事务完毕,还要关闭Session对象,从而及时释放Session的缓存占用的内存.批量处理数据是指在一个事务 ...

  6. 【CCF】通信网络 简单搜索

    去重!不然有环就直接挂掉了...0分 #include<iostream> #include<cstdio> #include<string> #include&l ...

  7. [暑假集训--数位dp]hdu2089 不要62

    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍, ...

  8. 集合-LinkList

    参考:http://www.cnblogs.com/skywang12345/p/3308807.html Consumer.class   消费者接口 参考:https://www.jianshu. ...

  9. 解决U3D4.1.5或以上无法启动MONODEV的方法

    通常会报这样的错误 System.EntryPointNotFoundException: Unable to find an entry point named 'gtksharp_list_get ...

  10. Docker安装运行Redis

    Mac环境 查询镜像: zhoumatoMBP:~ zhou$ docker search redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis ...