静态页面化

来源:互联网 发布:猪八戒题库软件 编辑:程序博客网 时间:2024/06/13 00:10
静态页面化

 

 一.含义:

页面静态化,其实就是将动态生成的jsp页面,变成静态的HTML页面,让用户直接访问

二.好处:

1,首先就是访问速度,不需要去访问数据库,或者缓存来获取哪些数据,浏览器直接加载渲染html页即可。所以可以大大的提高访问效率;   

2,从网站优化来分析,搜索引擎更喜欢静态的网页,静态网页与动态网页相比,搜索引擎更喜欢静的,更便于抓取,搜索引擎SEO排名更容易提高。     

3,从安全角度讲,静态网页不宜遭到黑客攻击,如果黑客不知道你网站的后台、网站采用程序、数据库的地址,静态网页, 更不容易受到黑客的攻击。      

4,从网站稳定性来讲,如果程序、数据库出了问题,会直接影响网站的访问,而静态-+++网页就避免了如此情况,不会因为程序等,而损失网站数据,影响正常打开,损失用户体验,影响网站信任度。

网站首页上板块划分很多,不同板块的数据库查询方式不同,首页内容量巨大,如果按照一般的动态jsp页面的话那么数据库查询将是巨大的开销,会导致首页访问速度的下降。于是考虑将这个首页全部静态化 

三、实现逻辑:

一,首先需要我们将一些需要静态化的页面进行分类,哪些经常不变内容的页面都需要静态化,例如,在电商里边的商店,店铺信息页;商品,货物信息页 等等。这些页面一旦发布了,后来改变的相对来说频率比较低,所以生成静态页面相对来说,可以大大提高用户的访问速度(不需要访问数据库,来动态生成jsp页面)。            

二,将动态和静态分离开,例如:页面中用户信息,搜索栏等。这些信息需要从服务器获取,而那些静态页面一般放在云服务器上,例如阿里的OSS服务器,这里就设计到跨域问题,利用JSONP,来进行静态页面和动态页面,不同域直接的整合。                

三,有些页面并不一定非要来静态化,但是为了避免地址暴露过多的信息,受到不法分子的攻击,URL伪静态也可以帮助我们,使页面看起来就像静态页面一样,这里提供一个URLRwrite,很简单好用,原理只是一个Filter。


四、代码展示:

package com.servlet;

import java.io.File;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class Servlet extends HttpServlet{

@Override

protected void service(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

System.out.println("chapterId "+request.getParameter("chapterId"));

if(request.getParameter("chapterId")!= null){

String chapterFileName = "bookChapterRead_"+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("没有此静态页面");

//存放业务处理后得到的信息  

            request.setAttribute("lastPageId", request.getParameter("chapterId"));  

            new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(),  

                    chapterFileName, chapterFilePath, "/bookRead.jsp");  

}

}

}

 

 

package com.servlet;

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静态页面  

* 功能:创建HTML静态页面  

*/    

public class CreateStaticHTMLPage {  

     /**

     * 生成静态HTML页面的方法  

     * @param request 请求对象

     * @param response 响应对象

     * @param servletContext Servlet上下文

     * @param fileName 文件名称

     * @param fileFullPath 文件完整路径

     * @param jspPath 需要生成静态文件的JSP路径(相对即可)

     * @throws IOException

     * @throws ServletException

     */  

    public void createStaticHTMLPage(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);//发送指定文件流到客户端

    }  

}

 

<servlet>  

      <servlet-name>htmlServlet</servlet-name>  

      <servlet-class>com.servlet.Servlet</servlet-class>  

    </servlet>  

    <servlet-mapping>  

      <servlet-name>htmlServlet</servlet-name>  

      <url-pattern>*.do</url-pattern>  

</servlet-mapping>

 

 

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  

<%  

String path = request.getContextPath();  

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  

%>  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

<html>  

  <head>  

  <%  

    String lastPageId=(String)request.getAttribute("lastPageId");  

  %>  

    <title>book</title>  

    <meta http-equiv="pragma" content="no-cache">  

    <meta http-equiv="cache-control" content="no-cache">  

    <meta http-equiv="expires" content="0">      

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  

    <meta http-equiv="description" content="This is my page">  

  </head>  

  <body>  

  这是跳转页面:  

   <%=lastPageId %>  

  </body>  

</html>  

 

 

 

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>首页面</title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">    

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

  </head>

  <body>

   <form action="kanName.do">

     <input name="chapterId" type="text" value="122"/>

     <input name="userName" type="text" value="张庆伟"/>

     <input type="submit" value="提交"/>

   </form>

  </body>

</html>