页面静态化

页面静态化,其实就是将动态生成的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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值