页面静态化
1. 效率方面,访问html页面时,服务器找到页面后直接返回,不会再进行后台处理,速度快很多很多,同时也是解决高并发,降低服务器资源占用最有效的方式。
2.静态网页化可以提高速度 不管是asp、php、jsp、.net等动态程序,都需要读取调用数据库内容,才能显示数据,相对于流量比较大,就增加了数据库的读取次数,占用很大的服务器资源,影响网站速度。而采用网站做成静态的,直接除去了读取数据库的操作,减少了环节,还提高了网站反映速度。
3.静态网页化有利于搜索引擎的收录 从网站优化来分析,搜索引擎更喜欢静态的网页,静态网页与动态网页相比,搜索引擎更喜欢静的,更便于抓取,搜索引擎SEO排名更容易提高,目前一些门户网站,如新浪、搜狐、网易、阿里巴巴、百度、慧聪等,页面大多都采用静态或伪静态网页来显示,更便于搜索引擎抓取与排名。
4. 静态网页化有利于网站稳定
1、从安全角度讲,静态网页不宜遭到黑客攻击,但也说不定,黑客能耐大着呢
2、从网站稳定性来讲,如果程序、数据库出了问题,会直接影响网站的访问,而静态网页就避免了如此情况,不会因为程序等,而损失网站数据,影响正常打开。
articleTemplate.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文章标题——${id}</title>
</head>
<body>现在时间是${time},你访问的文章id为${id}
</body>
</html>
JspStatic.java
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;
import CreateStaticHTMLPage.CreateStaticHTMLPage;
/**
*
* 接收用户请求,生成或者直接返回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);
}
}
CreateStaticHTMLPage.java
package CreateStaticHTMLPage;
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=UTF-8");// 设置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);// 发送指定文件流到客户端
}
}
然后我们访问地址输上去
访问后他的地址就会变成后缀为.html形式的
而控制台就会显示这是一个新生成的
然后再看文件目录就会发现多了一个html的文件
当我们再次访问的时候,后台就会显示页面已存在,直接跳转
在用静态化页面方面也要注意信息的更新,某条信息有修改时,为了及时反映到html页面,需要重新生成html页面,操作方式即删除现有html重新生成一个