freemark 页面静态化

1. 页面静态化是什么?

页面静态化有很多含义,在WEB开发中,静态网页一般理解为网站中大部分超级链接所引用的页面是单独的HTML静态页面文件(如.htm、.html等页面文件,html语言本身是静态的,不支持数据的传递,可以防止SQL注入

)。

2. 为什么都要把页面静态化呢?

对于现在的互联网应用(Web Application)来说,动态页面是占有绝对高的地位的,正因为有了动态化,才有了现在互联网的丰富多彩,但是如同所有别的事实一样,好处往往都是有代价的。为了产生出动态的效果,每一次对页面的请求都会要求服务器对页面进行编译或者执行,这些操作都很消耗系统资源。如果这期间还有和数据库的通讯,那么代价将会更大。

   如果一个页面在一定的时间内,其内容没有发生改变,那么就不必为每一次对它的访问进行一次“新”的编译或执行。我们可以把它在这段没有发生改变的时间内的 结果保存到一个静态的页面里面,然后每次访问这个页面时,就用刚才保存的静态页面进行回复。这样便能大大地减少系统资源的消耗,并且提高对客户的响应速度。而这个过程就称之为页面静态化。

3. 页面静态化方案?

目前主流的静态化主要有两种:一种是通过程序将动态页面抓取并保存为静态页面,这样的页面的实际存在于服务器的硬盘中,另外一种是通过WEB服务器的 URL Rewrite的方式,他的原理是通过web服务器内部模块按一定规则将外部的URL请求转化为内部的文件地址,一句话来说就是把外部请求的静态地址转化 为实际的动态页面地址,而静态页面实际是不存在的。这两种方法都达到了实现URL静态化的效果,但是也各有各自的特点(也叫伪静态)。

3.1. 它们的有什么区别?

将动态页面转化为实际存在的静态页面这种方法,由于静态页面的存在,少了动态解析过程,所以提高了页面的访问速度和稳定性,使得优化效果非常明显。所以这种方法被广泛采用。但是它的局限性同样存在。对于大型网站而言,这种方法将带来不可忽视的问题。

一、由于生成的文件数量较多,存储需要考虑文件、文件夹的数量问题和磁盘空间容量的问题;

二、页面维护的复杂性和大工作量,及带来的页面维护及时性问题,需要一整套站点更新制度。

而URL Rewrite方式特点同样鲜明,由于是服务器内部解析的地址,所以内容是实时更新的,也不存在文件管理和硬件问题,维护比较方便。在服务器级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);
        }  

    }

到这里freemark静态已经实现了 本demo下载地址下载

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-04 19:17:20

freemark 页面静态化的相关文章

Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则.强大的功能.高效的渲染效率.详尽的帮助说明与不断的更新与维护.常见的前端模板引擎有: 常用的java后台模板引擎:jsp.FreeMarker.Velocity等. 请不要迷恋速度,为了推广的测试可能是片面的,好的模板引擎经得起时间考验,建议大家选择成熟的.常用的模板引擎.另外不管前后端的模板引擎

浅谈——页面静态化

现在互联网发展越来越迅速,对网站的性能要求越来越高,也就是如何应对高并发量.像12306需要应付上亿人同时来抢票,淘宝双十一--所以,如何提高网站的性能,是做网站都需要考虑的. 首先网站性能优化的方面有很多:1,使用缓存,最传统的一级二级缓存:2,将服务和数据库分开,使用不同的服务器,分工更加明确,效率更加高:3,分布式,提供多台服务器,利用反向代理服务器nginx进行反向代理,将请求分散开来:4,数据库的读写分离,不同的数据库,将读操作和写操作分开,并实时同步即可:5,分布式缓存,使用memc

一个做页面静态化的php类

<?phpnamespace Common;/* * * 功能:页面静态化的创建和删除 * 创建:当且仅当,一个页面需要被静态化并且还未静态化时. * 删除:当且仅当,一个页面存在静态化页面并且需要被重新静态化时. * * 作者:郭军周 * * 注 :本类基于ThinkPHP3.2,或者其他具有"单一入口且MVC模式"的其他php框架. * * 使用方式:在Controller的构造方法中获取其对象:在Controller的销毁方法里,用其对象的_static方法. * 例:XX

页面静态化1---概念(Apache内置压力测试工具使用方法)

三个概念 ①静态网址: http://127.0.0.1/regis.html ②动态网址:在请求页面时可以动态的传一些值进去. http://127.0.0.1/regis.php?id=45&title=今天天气不错 ③伪静态网址: 伪静态仅仅是对动态网址的一个重写,伪静态网址不能让动态网址静态化,搜索引擎不会认为伪静态就是HTML文档,其次伪静态可取,但是应把重心放在取出冗余参数.规范URL,竟可能的避免重复也等等. 举例说明:http://v.youku.com/v_show/id_XM

页面静态化2--- PHP缓存机制完成页面静态化

我们可以使用PHP自带的缓存机制来完成页面静态化,但在这里,需要说明一点,仅靠PHP缓存机制并不能完美的解决页面静态化,往往需要和其他页面静态技术(通常是伪静态技术)结合使用 例子: 当访问一个页面时,先判断是否存在缓存,存在则直接输出缓存文件中的内容,否则,先查询数据库,获得数据,生成缓存文件. 详解PHP缓存机制: output_buffering,常用的函数 ob_start() ob_get_contents() ob_clean() ob_end_clean() ob_flush()

[项目构建 九]babasport 页面静态化技术Freemarker技术的介绍及使用实例.

一.FreeMarker简介 1.动态网页和静态网页差异 在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术.静态网页,随着HTML代码的生成,页面的内容和显示效 果就不会再发生变化(除非你修改页面代码).而动态网页则不然,页面代码虽然没有发生变化,但是显示的内容却是可以随着时间.环境或者数据库操作的结果而 发生相应的变化.简而言之,动态网页是基本的HTML语法规范与java.VB.VC等高级程序设计语言.数据库编程等多种技术的融合,以实现对网站内容 和风格

php页面静态化

<?php /** * php页面静态化 * 静态化分为 真静态和伪静态 * 静态化的有点在于 SEO 和 安全性 使用缓存机制还可以大大提高网站的速度 */ /** * php自带的缓存机制 * 需要在php.ini中进行配置 * 或者使用ob_start()-> output_buffering:on * 关于几个缓存的函数:ob_start();ob_clean();ob_get_content();ob_end_clean();关闭缓存同时清空 * ob_flush();输出缓存里面的

网站优化—页面静态化技术

数据库检索的问题 主要是为了减少数据库的操作,让MySQL能够提供更强大的服务 ? 使用缓存技术 磁盘缓存:就是将用户请求数据库的数据,保存到磁盘文件形成一个静态的HTML文本,下次用户的访问的时候,直接返回该HTML文本. 内存缓存:将MySQL的数据取出之后,保存到内存(memcache,不算一个NOSQL数据库,但是是一个缓存系统)之中,下次直接从内存中返回.(效率非常高) 注意:只要不使用sql语句作为查询条件的数据库(仓库)就叫做NOSQL数据库 优化MySQL 设计:存储引擎的选择,

PHP网站页面静态化之OB法

将PHP的执行页面预先转换成HTML,是所谓的PHP静态化方法之一. 其他还有模板替换法,opcache等方法. 静态化的作用: 提高网站的响应速度,降低服务器的负载: 用于搜索引擎的SEO: 利用PHP输出buffer直接写成html,定时后台定时扫一遍网站,是比较容易实现的网页静态化. 静态化之前: <?php for($i=0;$i<1000;$i++){ echo "bull<br>"; } ?> 静态化: <?php ob_start();