freemark 页面静态化
1. 页面静态化是什么?
页面静态化有非常多含义,在WEB开发中。静态网页一般理解为站点中大部分超级链接所引用的页面是单独的HTML静态页面文件(如.htm、.html等页面文件,html语言本身是静态的,不支持数据的传递,能够防止SQL注入
)。
2. 为什么都要把页面静态化呢?
对于如今的互联网应用(Web Application)来说。动态页面是占有绝对高的地位的,正因为有了动态化,才有了如今互联网的丰富多彩。可是如同全部别的事实一样,优点往往都是有代价的。为了产生出动态的效果,每一次对页面的请求都会要求server对页面进行编译或者运行。这些操作都非常消耗系统资源。假设这期间还有和数据库的通讯,那么代价将会更大。
假设一个页面在一定的时间内。其内容没有发生改变,那么就不必为每一次对它的訪问进行一次“新”的编译或运行。我们能够把它在这段没有发生改变的时间内的 结果保存到一个静态的页面里面。然后每次訪问这个页面时,就用刚才保存的静态页面进行回复。这样便能大大地降低系统资源的消耗。并且提高对客户的响应速度。而这个过程就称之为页面静态化。
3. 页面静态化方案?
眼下主流的静态化主要有两种:一种是通过程序将动态页面抓取并保存为静态页面,这样的页面的实际存在于server的硬盘中。第二种是通过WEBserver的 URL Rewrite的方式,他的原理是通过webserver内部模块按一定规则将外部的URL请求转化为内部的文件地址,一句话来说就是把外部请求的静态地址转化 为实际的动态页面地址。而静态页面实际是不存在的。这两种方法都达到了实现URL静态化的效果。可是也各有各自的特点(也叫伪静态)。
3.1. 它们的有什么差别?
将动态页面转化为实际存在的静态页面这样的方法,因为静态页面的存在,少了动态解析过程,所以提高了页面的訪问速度和稳定性,使得优化效果非常明显。所以这样的方法被广泛採用。
可是它的局限性相同存在。
对于大型站点而言,这样的方法将带来不可忽视的问题。
一、因为生成的文件数量较多。存储须要考虑文件、文件夹的数量问题和磁盘空间容量的问题;
二、页面维护的复杂性和大工作量。及带来的页面维护及时性问题,须要一整套站点更新制度。
而URL Rewrite方式特点相同鲜明。因为是server内部解析的地址,所以内容是实时更新的,也不存在文件管理和硬件问题,维护比較方便。在server级URL Rewrite重写技术并不影响页面的运行速度。
可是URL Rewrite的门槛比較高,国内虚拟主机大多不支持。并且虚拟主机是文件夹级的URL Rewrite,通过遍历文件夹读物URL转发规则的方式将大大降低页面的运行速度。
4. 页面静态化怎么做?
先介绍上面的第一种的页面静态化,这个静态化实现了真正的静态化。做这个静态化能够用freemarker和httpclient.
Freemarker是一种基于模板的、用来生成输出文本的通用工具。所以我们必须要定制符合自己业务的模板出来,然后生成的我们得html页面
Freemarker是通过freemarker.template.Configuration这个对象对模板进行载入的(它也处理创建和缓存预解析模板的工作)。然后我们通过getTemplate方法获得你想要的模板,有一点要记住freemarker.template.Configuration在你整个应用必须保证唯一实例。
Freemarker实现页面静态化主要步骤:
1.导入相关的jar包。我用servlet做的,仅仅须要导入一个freemarker.jar
2.导入2个工具类DirectoryFilter和FreeMarkertUtil,DirectoryFilter(它实现了文件过滤器那个接口FilenameFilter)这个工具类主要是为了推断是否已经生成了特定的html文件的java类(用处不大),FreeMarkertUtil封装freemarker用于创建模板和载入模板。
里面还包括了初始化模版的一个方法。
DirectoryFilter.java
package com.lyl.util;
import java.io.File;
import java.io.FilenameFilter;
/**
* 推断是否已经生成了特定的html文件的java类
* @author Administrator
*
*/
public class DirectoryFilter implements FilenameFilter {
String myString;
public DirectoryFilter(String myString)
{
this.myString = myString;
}
public boolean accept(File dir,String name)
{ //FilenameFilter.accept(File dir, String name)
// 測试指定文件是否应该包括在某一文件列表中。
String f= new File(name).getName();
if(f.contains(myString) || f.equals(myString)){
return true;
}
return false;
}
}
FreeMarkertUtil.java
package com.lyl.util;
import java.io.IOException;
import java.io.Writer;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletContext;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* 封装freemarker用于创建模板和载入模板。里面还包括了初始化模版的一个方法
* @author Administrator
*
*/
public class FreeMarkertUtil {
private static Configuration config = new Configuration();
/**
* @param templateName
* 模板名字
* @param root
* 模板根 用于在模板内输出结果集
* @param out
* 输出对象 详细输出到哪里
*/
public static void processTemplate(String templateName, Map<?
, ?
> root,
Writer out) {
try {
// 获得模板
Template template = config.getTemplate(templateName, "utf-8");
// 生成文件(这里是我们是生成html)
template.process(root, out);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} finally {
try {
out.close();
out = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 初始化模板配置
*
* @param servletContext
* javax.servlet.ServletContext
* @param templateDir
* 模板位置
*/
public static void initConfig(ServletContext servletContext,
String templateDir) {
config.setLocale(Locale.CHINA);
config.setDefaultEncoding("utf-8");
config.setEncoding(Locale.CHINA, "utf-8");
config.setServletContextForTemplateLoading(servletContext, templateDir);
config.setObjectWrapper(new DefaultObjectWrapper());
}
}
3、配置web.xml
<?xml version="1.0" encoding="UTF-8"?
>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>freemarker_stat</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Index</servlet-name>
<servlet-class>com.lyl.servlet.Index</servlet-class>
<init-param>
<param-name>templateDir</param-name><!-- 模板存放位置。是基于app的根文件夹的 -->
<param-value>/templates</param-value>
</init-param>
<load-on-startup>3</load-on-startup><!-- 为了启动的时候初始化模板配置 -->
</servlet>
<servlet-mapping>
<servlet-name>Index</servlet-name>
<url-pattern>/Index.do</url-pattern>
</servlet-mapping>
</web-app>
4、新建jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="expires" content="0">
</head>
<body>
<form action="Index.do" method="post">
<input type="submit" value="登录">
</form>
</body>
</html>
5、新建一个servlet 注意和web.xml中配置的跳转名称相同
package com.lyl.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lyl.client.ProcessClient;
import com.lyl.util.DirectoryFilter;
import com.lyl.util.FreeMarkertUtil;
public class Index extends HttpServlet {
private static final long serialVersionUID = 7474850489594438527L;
public Index() {
super();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//html生成之后存放的路径
String dirPath = request.getSession().getServletContext().getRealPath("/templates/html");
File path = new File(dirPath);
System.out.println(path);
//生成的文件的名字
String indexFileName = "index.html";
/**
* 推断是否已经存在该html文件,存在了就直接訪问html 。不存在生成html文件
*/
String[] indexfileList = path.list(new DirectoryFilter(indexFileName));
if(indexfileList==null||indexfileList.length<=0){
Writer out =null;
System.out.println("html文件不存在,创建一个HTML");
// 字节流变为字符流 生成html文件
out = new OutputStreamWriter(new FileOutputStream(dirPath+"/"+indexFileName),"UTF-8");
//进去这里把动态JSP写入这个HTML
ProcessClient.processBody(out);
request.getRequestDispatcher("/templates/html/index.html").forward(request, response);
}else{
System.out.println("html已存在,直接訪问");
request.getRequestDispatcher("/templates/html/"+indexfileList[0]).forward(request, response);
}
}
/**
* 初始化模板配置,供以后获得模板。在init里载入也主要是为保证Configuration实例唯一
*/
public void init(ServletConfig config) throws ServletException {
String templateDir = config.getInitParameter("templateDir");
FreeMarkertUtil.initConfig(config.getServletContext(), templateDir);
}
}
须要注意的几点
1 检查生成后的静态网页中图片、CSS及JS等的引用路径是否正确
2 放入Map中的数据的key必须与模版文件里接收数据的名字保持一致
3 设置的编码方式与你project的编码方式保持一致
4 注意输出流的关闭
5 生成的静态网页文件名称自己定义
到这里freemark静态已经实现了 本demo下载地址下载
freemark 页面静态化的更多相关文章
- fastDFS shiro权限校验 redis FreeMark页面静态化
FastDFS是一个轻量级分布式文件系统, 使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传.下载等服务 FastDFS服务端有两个角色:跟踪器(tracker)和存储节点( ...
- Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化
模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...
- 页面静态化技术Freemarker技术的介绍及使用实例.
一.FreeMarker简介 1.动态网页和静态网页差异 在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术.静态网页,随着HTML代码的生成,页面的内容和显示效 ...
- JSP页面静态化
Ps:好久没写博客了,不是我太懒,是因为苦逼的我出差去上海了,天天加班 刚回成都.... 今天说说jsp页面静态化,知道静态化的朋友都不陌生,说白了就是访问后缀是html 而不是jsp. 没听说过静态 ...
- 大型网站提速关键技术(页面静态化,memcached,MySql优化)(三)
页面静态化的技术实现有两种方式 使用PHP自己的缓存机制 先说明一下OB缓存的机制. ob1.php 代码:说明的ob的各个用法->项目中 ☞ 如何打开ob缓存 ① 配置php.ini ...
- 大型网站提速关键技术(页面静态化,memcached,MySql优化)(二)
一:页面静态化 几个概念: 静态网址:(比如:http://localhost/abc.html) 特点:1.利用seo(search engine optimization) 搜索引擎优化;2:访问 ...
- 大型网站提速关键技术(页面静态化,memcached,MySql优化)(一)
一:关键技术介绍: 衡量是否为大型网站的要素: A:PV值(page views 页面浏览量) 访问量大: 带来的问题:1:流量大 -->解决方案:增加带宽,优化程序(视频和图片较浪费带宽,尽量 ...
- php页面静态化技术;学习笔记
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C# MVC 页面静态化导致的问题
在设置页面静态化的路由,代码如 //静态路由 routes.MapRoute( name: "html", url: "{controller}/{action}.htm ...
随机推荐
- 解决小米手机Android Studio安装app 报错的问题It is possible that this issue is resolved by uninstalling an existi
问题描述 Android Studio升级到2.3版本之后,小米手机MIUI8不能运行Android Studio程序,报如下错误: Installation failed with message ...
- linux & windows 共享 smbd 部署
smbd : yum install samba samba-client samba-swat mount.cifs : yum -y install cifs-utils ##挂载nas 文 ...
- 特征选取方法PCA与LDA
一.主成分分析(PCA)介绍 什么是主成分分析? 主成分分析是一种用于连续属性降维的方法,把多指标转化为少数几个综合指标. 它构造了原始属性的一个正交变换,将一组可能相关的变量转化为一组不相关的变 ...
- POJ 3020 Antenna Placement 最大匹配
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6445 Accepted: 3182 ...
- Alfresco 5.0.d 企业文档管理系统
Thanks for downloading Alfresco Community Edition. Your download should begin in three seconds. If i ...
- JAVA加解密 -- 消息摘要算法
消息摘要算法是一种单向加密算法 主要用于验证数据完整性,也是数字签名的核心算法 消息鉴别:指在接收方将原始信息进行摘要,然后与接收到的摘要信息进行对比 a.MD家族 – MD5(128位摘要信息) M ...
- 工作流学习——Activiti流程变量五步曲
一.前言 上一篇文章我们将流程实例的启动与查询,任务的办理查询都进行了介绍,我们这篇文章来介绍activiti中的流程变量. 二.正文 流程变量与我们寻常理解的变量是一样的,仅仅只是是用在了我们act ...
- Linux 进程间通信 --- 信号通信 --- signal --- signal(SIGINT, my_func); --- 按键驱动异步通知(转)
信号 ( signal ) 机制是 UNIX 系统中最为古老的进程间通信机制,很多条件可以产生一个信号. 信号的产生: 1,当用户按下某些按键时,产生信号. 2,硬件异常产生信号:除数为 0 ,无效 ...
- 自行控制loadrunner的socket协议性能测试 (转)
一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字符串转换为十六进制数据包 发送自己定义的数据包 接收数据包到自定义缓冲 ...
- angular4 radio checkbox 有用
<span *ngFor="let op of [{'id':'a','text':'11'},{'id':'b','text':'2222'},{'id':'cc','text':' ...