• jsp实现html页面静态化


    一、实现原因
      1.网站访问量过大,导致服务器压力加大以及数据库数据交换频繁。生成静态页面提供访问以缓解压力。
      2.静态页面是动态页面的备份,若动态页面出现异常,静态页面可以暂时替代。
     
    二、使用场合
      当某个页面访问量很大,且数据不经常变动适合转换为html存储。如网站首页,新闻文章页等
     
    三、实现方法
      实现方法有很多,有框架自动生成,有重写输出方法,有用缓存机制从而无需生成静态页面等,此处介绍两种方法。
      1.使用servlet发送请求读取jsp动态数据,将数据写入html文件并保存。
        a.首先需要一个servlet类,service方法中是生成静态页面的主要代码。
     1 /**
     2  * @file_name 文件名及文件之后的参数
     3  * @path 文件所在的路径.相对于根目录而言的.
     4  * @realName 文件要保存的名字
     5  * @realPath 文件要保存的真实路径, 默认与文件所在的目录相同。
     6  */
     7 public class JspToHtml extends HttpServlet {
     8 
     9     public void service(HttpServletRequest request, HttpServletResponse response)
    10             throws ServletException, IOException {
    11 
    12         HttpSession session = request.getSession();
    13         String url = "";
    14         String name = "";
    15         ServletContext sc = getServletContext();
    16 
    17         String file_name = request.getParameter("file_name");// 你要访问的jsp文件,如news.jsf。
    18         // file_name如:fileDetail.jsf?fileId=56.要是有参数, 只有一个参数。并且以参数名作为文件名。
    19 
    20         String realName = request.getParameter("realName");// 要保存的文件名。如aaa;注意可以没有这个参数。
    21 
    22         String path = request.getParameter("path");// 你要访问的jsp文件路径。如news。注意可以没有这个参数。
    23 
    24         String realPath = request.getParameter("realPath");// 你要保存的文件路径,如htmlNews.注意可以没有这个参数。
    25         // 下面确定要保存的文件名字。
    26         if (realName == null || realName == "") {
    27             int a = 0;
    28             a = file_name.indexOf("=") + 1;
    29             realName = file_name.substring(a);
    30             if (realName.indexOf(".") > 0) {
    31                 realName = file_name.substring(0, file_name.indexOf("."));
    32             }
    33         }
    34         // 下面构造要访问的页面。
    35         if (path == null || path.equals("")) {
    36             url = "/" + file_name;// 这是你要生成HTML的jsp文件,如
    37         } else {
    38             url = "/" + path + "/" + file_name;// 这是你要生成HTML的jsp文件,如
    39         }
    40         // 下面构造要保存的文件名,及路径。
    41         // 1、如果有realPath,则保存在realPath下。
    42         // 2、如果有path则保存在path下。
    43         // 3、否则,保存在根目录下。
    44         if (realPath == null || realPath.equals("")) {
    45             if (path == null || path.equals("")) {
    46                 // 这是生成的html文件名,如index.htm.说明:
    47                 // ConfConstants.CONTEXT_PATH为你的上下文路径。
    48                 name = session.getServletContext().getRealPath("") + "\" + realName + ".html";
    49             } else {
    50                 name = session.getServletContext().getRealPath("") + "\" + path + "\" + realName
    51                         + ".html";// 这是生成的html文件名,如index.html
    52             }
    53         } else {
    54             name = session.getServletContext().getRealPath("") + "\" + realPath + "\" + realName
    55                     + ".html";// 这是生成的html文件名,如index.html
    56         }
    57         File file = new File(name.substring(0, name.length() - (realName.length() + 5)));
    58         if (!file.exists()) {
    59             file.mkdir();
    60         }
    61         // 访问请求的页面,并生成指定的文件。
    62         RequestDispatcher rd = sc.getRequestDispatcher(url);
    63 
    64         final ByteArrayOutputStream os = new ByteArrayOutputStream();
    65 
    66         final ServletOutputStream stream = new ServletOutputStream() {
    67             public void write(byte[] data, int offset, int length) {
    68                 os.write(data, offset, length);
    69             }
    70 
    71             public void write(int b) throws IOException {
    72                 os.write(b);
    73             }
    74         };
    75 
    76         //此处需要转码,防止中文字符乱码
    77         final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
    78         79        
    80         HttpServletResponse rep = new HttpServletResponseWrapper(response) {
    81             public ServletOutputStream getOutputStream() {
    82                 return stream;
    83             }
    84 
    85             public PrintWriter getWriter() {
    86                 return pw;
    87             }
    88         };
    89         rep.setCharacterEncoding("gbk");// response的编码为gbk防乱码
    90         rd.include(request, rep);
    91         pw.flush();
    92         FileOutputStream fos = new FileOutputStream(name); // 把jsp输出的内容写到xxx.html
    93 
    94         os.writeTo(fos);
    95         fos.close();
    96     }
    97 }

        b.调用servlet的方法,这个方法即是后台发送请求访问servlet的方法。

     1 // 这个方法适当重载,就可以省去一些参数传递。
     2     public static void CallOnePage(String basepath, String fileName, String path, String realName,
     3             String realPath) {
     4         try {
     5             String str = basepath + "toHtmlPath?file_name=" + fileName + "&path=" + path
     6                     + "&realName=" + realName + "&realPath=" + realPath;
     7             System.out.println(str);
     8             int httpResult; // 请求返回码
     9 
    10             URL url = new URL(str); // URL发送指定连接请求
    11             URLConnection connection = url.openConnection();
    12             connection.connect();
    13             HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
    14             httpResult = httpURLConnection.getResponseCode();
    15 
    16             if (httpResult != HttpURLConnection.HTTP_OK) { // 返回码为200则连接成功
    17                 System.out.println("没有连接成功!");
    18             } else {
    19                 System.out.println("连接成功了!!!!!");
    20             }
    21         } catch (Exception e) {
    22             e.printStackTrace();
    23         }
    24     }

        c.需要在web.xml里面配置servlet

    <servlet>
            <servlet-name>jspToHtml</servlet-name>
            <servlet-class>com.adam.util.JspToHtml</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>jspToHtml</servlet-name>
            <url-pattern>/jspToHtml</url-pattern>
        </servlet-mapping>

      此时便可以通过第b步的方法来生成html页面了,如

    CallOnePage("http://localhost:8080/adam/","test/testHtml.do?method=save&id=1100&subid=1151&tohtml=1", "", "index", "htmls");
    

       生成index.html文件存放在项目目录的htmls文件夹下。

      2.使用httpclient生成静态html

        a.首先导入httpclient的jar文件(commons-httpclient-3.0.1 解压后取出jar文件导入)

        b.实现主生成方法

     1 /**
     2      * @basePath url host信息
     3      * @target 需要转换的链接
     4      * @path 文件要保存的真实路径
     5      * @name 文件要保存的名字
     6      * @extension 文件要保存的扩展名.html/.htm
     7      */
     8     public static boolean staticHtml(String basePath, String target, String path, String name,
     9             String extension) {
    10         boolean result = true;
    11         HttpClient client = new HttpClient();
    12         GetMethod getMethod = new GetMethod(basePath + "/" + target);
    13 
    14         System.err.println(path);
    15         try {
    16             client.executeMethod(getMethod);
    17 
    18             File filePath = new File(path);
    19             if (!filePath.exists()) {
    20                 filePath.mkdirs();
    21             }
    22 
    23             File file = new File(path + name + extension);
    24 
    25             // FileWriter writer = new FileWriter(file);
    26             // writer.write(getMethod.getResponseBodyAsString());
    27             // writer.flush();
    28 
    29             //FileWriter 无法指定编码格式,此处替代使用防止存储的文件乱码
    30             Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),
    31                     "UTF-8"));
    32             
    33             out.write(getMethod.getResponseBodyAsString());
    34             out.flush();
    35             out.close();
    36         } catch (Exception e) {
    37             e.printStackTrace();
    38             result = false;
    39         }
    40         return result;
    41     }

      此时便可以通过此方法来生成html页面了,如

    staticHtml("http://localhost:8080/btbasic", "main/main.do?method=main", path, "index",".html");
    

       便可以生成index.html放在指定的path下了。

  • 相关阅读:
    二叉树前、中、后遍历
    程序员节宜冒泡
    HashMap源码分析
    Stack源码解析
    逆袭之旅DAY24.XIA.二重进阶、双色球
    逆袭之旅DAY24.XIA.数组练习
    LY.JAVA面向对象编程.内部类
    LY.JAVA面向对象编程.修饰符
    LY.JAVA面向对象编程.包的概述、导包
    XIA.人机猜拳
  • 原文地址:https://www.cnblogs.com/adamJin/p/7717398.html
Copyright © 2020-2023  润新知