jsp实现html页面静态化

时间:2024-02-25 08:27:44
一、实现原因
  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下了。