页面静态化,其实就是将动态生成的jsp页面,变成静态的HTML页面,让用户直接访问。有一下几方面好处:
1,首先就是访问速度,不需要去访问数据库,或者缓存来获取哪些数据,浏览器直接加载渲染html页即可。所以可以大大的提高访问效率;
2,从网站优化来分析,搜索引擎更喜欢静态的网页,静态网页与动态网页相比,搜索引擎更喜欢静的,更便于抓取,搜索引擎SEO排名更容易提高。
3,从安全角度讲,静态网页不宜遭到黑客攻击,如果黑客不知道你网站的后台、网站采用程序、数据库的地址,静态网页, 更不容易受到黑客的攻击。
4,从网站稳定性来讲,如果程序、数据库出了问题,会直接影响网站的访问,而静态网页就避免了如此情况,不会因为程序等,而损失网站数据,影响正常打开,损失用户体验,影响网站信任度。
实现逻辑:
一,首先需要我们将一些需要静态化的页面进行分类,哪些经常不变内容的页面都需要静态化,例如,在电商里边的商店,店铺信息页;商品,货物信息页 等等。这些页面一旦发布了,后来改变的相对来说频率比较低,所以生成静态页面相对来说,可以大大提高用户的访问速度(不需要访问数据库,来动态生成jsp页面)。
二,将动态和静态分离开,例如:页面中用户信息,搜索栏等。这些信息需要从服务器获取,而那些静态页面一般放在云服务器上,例如上篇说到的阿里的OSS服务器,这里就设计到跨域问题,利用JSONP,来进行静态页面和动态页面,不同域直接的整合。
三,有些页面并不一定非要来静态化,但是为了避免地址暴露过多的信息,受到不法分子的攻击,URL伪静态也可以帮助我们,使页面看起来就像静态页面一样,这里提供一个URLRwrite,很简单好用,原理只是一个Filter。
案例
package com.controller;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.controller.CreateStaticHTMLPage;
import com.dao.EmpDao;
public class Servlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int nowpage = 1;
if(request.getParameter("chapterId")!= null){
//静态页面名称
String chapterFileName = "Emp_"+request.getParameter("chapterId")+".html";
//页面保存路径
String chapterFilePath = getServletContext().getRealPath("/") + chapterFileName;
File chapterFile = new File(chapterFilePath);
if(chapterFile.exists()){//如果有这个文件就告诉浏览器转向
System.out.println("有此静态页面");
response.sendRedirect(chapterFileName);
return;
}
System.out.println("没有此静态页面");
//存放业务处理后得到的信息
int pageSize = Integer.parseInt(request.getParameter("chapterId"));
EmpDao ed = new EmpDao();
String param = null;
ArrayList al = ed.selectEmp(nowpage, pageSize, param);
request.setAttribute("list", al);
//新建静态页面
new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(),
chapterFileName, chapterFilePath, "/empRead.jsp");
}
}
}
创建静态页面
package com.controller;
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;
public class CreateStaticHTMLPage {
public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String jspPath) throws ServletException, IOException{
//设置HTML结果流编码(即HTML文件编码)
response.setContentType("text/html;charset=utf-8");
//得到JSP资源
RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);
//用于从ServletOutputStream中接收资源
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//用于从HttpServletResponse中接收资源
final ServletOutputStream servletOuputStream = new ServletOutputStream(){
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);
//把byteArrayOuputStream中的资源全部写入到fileOuputStream中
byteArrayOutputStream.writeTo(fileOutputStream);
//关闭输出流,并释放相关资源
fileOutputStream.close();
//发送指定文件流到客户端
response.sendRedirect(fileName);
}
}
web.xml
<servlet>
<servlet-name>demoServlet</servlet-name>
<servlet-class>com.controller.Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demoServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>
index.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>
</head>
<body>
<form action="emp.do">
<input name="chapterId" type="text" value="5"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
empRead.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'empRead.jsp' starting page</title>
</head>
<body>
<table border="1" cellpadding="1">
<tr>
<td>员工编号</td>
<td>员工姓名</td>
<td>员工薪水</td>
<td>员工奖金</td>
<td>员工上级编号</td>
<td>员工入职日期</td>
</tr>
<c:forEach items="${list }" var="e">
<tr>
<td>${e.empno }</td>
<td>${e.ename }</td>
<td>${e.sal }</td>
<td>${e.comm }</td>
<td>${e.mgr }</td>
<td>${e.hiredate }</td>
</tr>
</c:forEach>
</table>
</body>
</html>