页面静态化

来源:互联网 发布:共青团中央 知乎 编辑:程序博客网 时间:2024/06/06 12:23

页面静态化,其实就是将动态生成的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>
原创粉丝点击