Ps:好久没写博客了,不是我太懒,是因为苦逼的我出差去上海了,天天加班 刚回成都....

今天说说jsp页面静态化,知道静态化的朋友都不陌生,说白了就是访问后缀是html 而不是jsp。

没听说过静态化的朋友会问为啥要这么做,jsp访问好好的 为啥多此一举

好处:

1. 效率方面,访问html页面时,服务器找到页面后直接返回,不会再进行后台处理,速度快很多很多,同时也是解决高并发,降低服务器资源占用最有效的方式。

各大门户类网站大家都可以看看页面的后缀,几乎都是.html结尾的.

2. seo方面,搜索引擎对html的收录较好,爬虫对html解析几乎是100%,而对动态页面则少之又少,静态化后页面收录会高N多倍。这也是有些程序在没有真正实现

静态化的时候,提供了伪静态的访问方式,伪静态对服务器性能和访问速度没有提升,仅仅是在seo方向有一定作用。

具体说说怎么处理, 这里以java web为例讲解,因为我对php,asp研究没有jsp深。

  1. 首先,我们需要写页面的模板,就是jsp页面,我们生成后的html是基于该模板的,说白了就是用查询好的数据去填充对应的地方,如下我写的一个简单模板jsp
  • <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>文章标题——${id}</title>
    </head>
    <body>现在时间是${time},你访问的文章id为${id}
    </body>
    </html>

    这个jsp页面我命名为articleTemplate.jsp ,只简单的写了时间和id,你可以根据页面需要展示的内容,写出美观又好看的页面,然后填充数据,这里需要导入jstl包

2. 编写对应的生成html的servlet或者controller,因为每个功能对应的模板和需要展示的数据都不一样,所以一般有多少个jsp页面就需要写多少个servlet

首先创建一个 JspStatic,用于接收用户请求,如果html页面还未生成过,则生成并返回,如果已经生成过了,则直接返回html页面

package com.xiaochangwei.html;

import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
*
* 接收用户请求,生成或者直接返回html
*
* @author xiaochangwei
*
*/
@WebServlet("/JspStatic")
public class JspStatic extends HttpServlet {
private static final long serialVersionUID = 1L; public JspStatic() {
super();
} public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request.getParameter("id") != null) {
String fileName = "article_" + request.getParameter("id") + ".html";
String filePath = getServletContext().getRealPath("/") + fileName;
File chapterFile = new File(filePath);
if (chapterFile.exists()) {
System.out.println("html页面存在,直接跳转");
response.sendRedirect(fileName);
return;
} System.out.println("新生成html页面");
//TODO 这里可调用service查询页面上需要的数据,然后封装到request里面
request.setAttribute("time", new java.util.Date());
request.setAttribute("id", request.getParameter("id"));
new CreateStaticHTMLPage().create(request, response, getServletContext(), fileName, filePath,
"/articleTemplate.jsp");
}
} protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

这里代码很简单了,为了测试效果,我在控制台打了对应的信息,以便区分。

首先接收一个id参数,然后根据规则查找这个id对应的html页面是否存在,如果存在,就直接返回这个html页面

如果没有,则生成html,在生成之前需要调用其他service等查询到页面需要展示的数据,并放到request里面  请注意TODO描述

最后调用create方式生成页面,参数包括了封装了数据的request,需要生成的文件名和路径,以及需要使用的模板等

具体生成html的代码如下:

package com.xiaochangwei.html;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; /**
* 创建HTML静态页面
*
* @author xiaochangwei
*
*/
public class CreateStaticHTMLPage {
/**
* 生成静态HTML页面的方法
*
* @param request
* 请求对象
* @param response
* 响应对象
* @param servletContext
* Servlet上下文
* @param fileName
* 文件名称
* @param fileFullPath
* 文件完整路径
* @param jspPath
* 需要生成静态文件的JSP路径(相对即可)
* @throws IOException
* @throws ServletException
*/
public void create(HttpServletRequest request, HttpServletResponse response,
ServletContext servletContext, String fileName, String fileFullPath, String jspPath)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");// 设置HTML结果流编码(即HTML文件编码)
RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);// 得到JSP资源
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 用于从ServletOutputStream中接收资源
final ServletOutputStream servletOuputStream = new ServletOutputStream() {// 用于从HttpServletResponse中接收资源
public void write(byte[] b, int off, int len) {
byteArrayOutputStream.write(b, off, len);
} public void write(int b) {
byteArrayOutputStream.write(b);
}
};
final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream));// 把转换字节流转换成字符流
HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response) {// 用于从response获取结果流资源(重写了两个方法)
public ServletOutputStream getOutputStream() {
return servletOuputStream;
} public PrintWriter getWriter() {
return printWriter;
}
};
rd.include(request, httpServletResponse);// 发送结果流
printWriter.flush();// 刷新缓冲区,把缓冲区的数据输出
FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath);
byteArrayOutputStream.writeTo(fileOutputStream);// 把byteArrayOuputStream中的资源全部写入到fileOuputStream中
fileOutputStream.close();// 关闭输出流,并释放相关资源
response.sendRedirect(fileName);// 发送指定文件流到客户端
}
}

下面我们测试下程序的执行情况:

1.最开始控制台啥都没有

2. 回车后,控制台打出了 新生成html页面 如下

3. 在浏览器中输入 http://localhost:9990/Html/JspStatic?id=100 不是直接输入html对应路径,控制台打出 直接跳转

证明没有再重新去生成,并且明显感觉速度要快很多, 如果生成页面时需要查找的数据更多,则效果更明显  并且上面的时间戳都一样,表示是同一个页面

并且可以看到服务器对应路径下有一个生成了的html页面,且内容完全一样

好了具体的内容就讲到这里了,这就是页面静态化。

-------------------------------------------------------------

实际项目中使用静态化时需要注意的地方:

1. 某条信息有修改时,为了及时反映到html页面,需要重新生成html页面,操作方式即删除现有html重新生成一个

2.页面上的连接就直接写具体的html,不用再去后台请求一次,但是要注意页面的及时更新,一般用定时器执行

比如CMS系统,一般管理端提供了多久更新一次,频率太高会加重服务器负担,但数据反映及时;频率太低,新信息又不能及时展示,所以结合实际折中考虑吧

3.如CMS分类信息列表及门户首页数据,除了具体链接是html外,列表的生成方式也有讲究

a. 直接通过读数据库列表,然后计算出对应的html页面生成链接,  每次生成列表对服务器也是一种消耗

b. 直接读取生成的静态html列表文件来生成列表, 这个挺好的,不用去查询数据库, 文件的操作会更好 【推荐】

虽说静态化有很多好处,但是也要结合实际情况,一天没有几个人访问的网站我觉得就没必要了, 主要适用于高并发,访问量很大的网站。

欢迎大家给我意见及建议,相互探讨 共同进步

JSP页面静态化的更多相关文章

  1. JSP页面静态化总结之一使用URLRewrite实现url地址伪静态化

    JSP页面静态化总结之一使用URLRewrite实现url地址伪静态化 1使用URLRewrite实现url地址伪静态化1.1URLRewirte的用处 1.满足搜索引擎的要求. 2.隐藏技术实现,提 ...

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

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...

  3. filter应用案例四:页面静态化

    1 说明 你到"当当"搜索Java分类图书时,"当当"会去查询数据库!每天都有很多人去搜索"Java分类"的图书,每次都去访问数据库,这会有 ...

  4. JavaWeb笔记——利用过滤器实现页面静态化

    1.说明 页面静态化是把动态页面生成的html保存到服务器的文件上,然后再有相同请求时,不再去执行动态页面,而是直接给用户响应上次已经生成的静态页面. * 核心思路为拦截请求,实现请求转发指向静态页面 ...

  5. php动态网页实现页面静态化 通过在初次被访问时生成html文件保存起来,下次该PHP程序被访问时就直接找到以前被访问过的html页面

    一.什么是静态页面?什么是动态页面 静态页面是网页的代码都在页面中,不需要执行asp,php,jsp,.net等程序生成客户端网页代码的网页.不能   静态页面 动态页面 区别:           ...

  6. 转:php页面静态化之真静态

    之前的缓存和现在所说的页面静态化都是为网站提速的,如果是访问量小的小型网站可能不需要但是如果网站规模或访问量很大,那么页面静态化和缓存就会体现出各自的价值了下面先来了解下页面静态化的分类 页面静态化的 ...

  7. php&amp;&amp;页面静态化

    页面静态化.主要是出于两个方面的考虑.     第一:訪问html页面的速度比訪问php页面的速度快.在訪问php页面时候.须要对php进行解析.訪问html时候,直接浏览器能够解析出来.特别是PV量 ...

  8. thinkphp 页面静态化

    页面静态化(代码在最后) 静态页面 是网页的代码都在页面中,不需要执行asp,php,jsp,.net等程序生成客户端网页代码的网页,静态页面网址中一般不含“?”.“=”.“&”等特殊符号.  ...

  9. PHP扩展功能 ---- 页面静态化(OB缓冲)

    一.入门三部曲 1.什么是页面静态化 百度百科介绍: 静态页面是网页的代码都在页面中,不需要执行asp,php,jsp,.net等程序生成客户端网页代码的网页,静态页面网址中一般不含"?&q ...

随机推荐

  1. ios 数据库存储json数据

    NSData *data = [NSJSONSerialization dataWithJSONObject:info.bdata options:NSJSONWritingPrettyPrinted ...

  2. jQuery 获取屏幕高度、宽度

    做手机Web开发做浏览器兼容用到了,所以在网上找了些汇总下. alert($(window).height()); //浏览器当前窗口可视区域高度alert($(document).height()) ...

  3. Torch7学习笔记(二)nn Package

    神经网络Package [目前还属于草稿版,等我整个学习玩以后会重新整理] 模块Module module定义了训练神经网络需要的所有基础方法,并且是可以序列化的抽象类. module有两种状态变量: ...

  4. zabbix监控报错zabbix server is not running解决方法

    问题描述: 布置好zabbix监控,正常运行.但是重启了虚拟机服务器之后,页面出现如下的报错,而且设置的报信息也是失效的:

  5. Sql判断不为Null也不为空的写法

    看到不少人写: isnull(field,'')<>'' 其中这样写最经济实惠:field>''

  6. poj2833

    //poj2833优先队列.数据量太大,而且没有必要全部排序. //优先队列 //* #include<iterator> #include <stdio.h> #includ ...

  7. Smart3D系列教程2之 《为什么三维重建效果这么差?——探探那些被忽略的拍照要求和技巧》

    一.照片采集的实用概念 根据照片进行三维重建的过程中,有人没怎么遇到坑,有人被坑的不轻.可能是模型的纹理失真,模型的法线错了,模型会生成我们各种也想不到的结果,那么,是什么导致三维重建效果这么差的?是 ...

  8. Django models知识小点

    django 为使用一种新的方式,即关系对象映射(ORM) 一,创建表 1,基本结构 注意: 1,创建标的时候,如果我们不给表加自增列,生成表的时候会默认给我们生成一列为ID的自增列,当然我们也可以自 ...

  9. *HDU2147 博弈

    kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/10000 K (Java/Others)Total ...

  10. 部署Thomas Kyte 的 runstats 工具

    runstats是由Thomas Kyte开发的脚本,该脚本能对做同一件事的两个不同方法进行比较,得出孰优孰劣的结果. 1.授权 SQL> grant select on v_$statname ...