`

JSP生成静态HTML页面的几种方法

 
阅读更多

转自:http://wenku.baidu.com/view/95c78069a45177232f60a2e8.html

http://wenku.baidu.com/view/00d3a576f46527d3240ce046.html

还可以参考

JSP

生成静态

HTML

页面的几种方法

 

2008

04

12

 

星期六

 09:26 

一、

从数据库中取相应数据并替换掉模板中的对应标签,

下面是一个简单的示例

  

 

 

1.buildhtml.jsp  

<%@ page contentType="text/html; charset=gb2312" 

import="java.util.*,java.io.*"%>  

<%  

try{  

String title="This is Title";  

String content="This is Content Area";  

String editer="LaoMao";  

String filePath = "";  

filePath = request.getRealPath("/")+"test/template.htm";  

//out.print(filePath+"<br>");  

String templateContent="";  

FileInputStream fileinputstream = new FileInputStream(filePath);//

读取

模块文件

  

int lenght = fileinputstream.available();  

byte bytes[] = new byte[lenght];  

fileinputstream.read(bytes);  

fileinputstream.close();  

templateContent = new String(bytes);  

//out.print(templateContent);  

templateContent=templateContent.replaceAll("###title###",title);  

templateContent=templateContent.replaceAll("###content###",content);  

templateContent=templateContent.replaceAll("###author###",editer);//

替换掉模块中相应的地方

  

//out.print(templateContent);  

// 

根据时间得文件名

  

Calendar calendar = Calendar.getInstance();  

String fileame = String.valueOf(calendar.getTimeInMillis()) +".html";  

fileame = request.getRealPath("/")+fileame;//

生成的

html

文件保存路径

  

FileOutputStream fileoutputstream = new FileOutputStream(fileame);//

建立文件输出流

  

byte tag_bytes[] = templateContent.getBytes();  

fileoutputstream.write(tag_bytes);  

fileoutputstream.close();  

}  

catch(Exception e){  

out.print(e.toString());  

}  

%>  

 

2. template.htm  

<html>  

<head>  

<title>###title###</title>  

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">  

<LINK href="../css.css" rel=stylesheet type=text/css>  

</head>  

 

<body>  

<table width="500" border="0" align="center" cellpadding="0" 

cellspacing="2">  

   <tr>   

     <td align="center">###title###</td>  

   </tr>  

   <tr>   

     <td align="center">author

###author###&nbsp;&nbsp;</td>  

   </tr>  

   <tr>  

     <td>###content###</td>  

   </tr>  

</table>  

</body>  

</html>  

 

 

=======================================================  

 

二、从动态页的

URL

获取相应页面内容并写入到文件

  

 

/*  

* Created on 2006-3-4  

* To change the template for this generated file go to  

Window&gt;Preferences&gt;Java&gt;Code 

Generation&gt;Code 

and 

Comments  

*/  

package com.easydone.cn.tools.utils;  

 

import java.io.BufferedReader;  

import java.io.File;  

import java.io.FileOutputStream;  

import java.io.InputStream;  

import java.io.InputStreamReader;  

import java.io.PrintWriter;  

import java.net.HttpURLConnection;  

import java.net.URL;  

import java.util.Date;  

 

/**  

* @author Administrator  

* To change the template for this generated type comment go to  

Window&gt;Preferences&gt;Java&gt;Code 

Generation&gt;Code 

and 

Comments  

*/  

public class MakeHtml {  

         private static long star = 0;  

         private static long end = 0;  

         private static long ttime = 0;  

 

         //

返回

html

代码

  

         public static String getHtmlCode(String httpUrl){  

         Date before = new Date();  

         star = before.getTime();  

         String htmlCode = "";  

         try {  

         InputStream   in;  

         URL url = new java.net.URL(httpUrl);  

         HttpURLConnection connection = 

(HttpURLConnection)url.openConnection();  

         connection = (HttpURLConnection) url.openConnection();  

         connection.setRequestProperty("User-Agent","Mozilla/4.0");  

         connection.connect();  

         in = connection.getInputStream();  

         java.io.BufferedReader breader = new BufferedReader(new 

InputStreamReader(in , "GBK"));  

         String currentLine;  

           while((currentLine=breader.readLine())!=null){  

         htmlCode+=currentLine;  

           }  

         } catch (Exception e) {  

         e.printStackTrace();  

         }finally{  

         Date after = new Date();  

         end = after.getTime();  

         ttime = end-star   

         System.out.println("

执行时间

:"+ttime +"

");  

         }  

         return htmlCode;  

         }  

         //

存储文件

  

         public static synchronized void writeHtml(String 

filePath,String info,String flag) {  

 

         PrintWriter pw = null;  

         try {  

         File writeFile = new File(filePath);  

         boolean isExit = writeFile.exists();  

         if (isExit != true) {  

         writeFile.createNewFile();  

         } else {  

         if (!flag.equals("NO")) {  

         writeFile.delete();  

         writeFile.createNewFile();  

         }   

         }  

         pw = new PrintWriter(new FileOutputStream(filePath, true));  

         pw.println(info);  

         pw.close();  

         } catch (Exception ex) {  

         System.out.println(ex.getMessage());  

         }finally{  

         pw.close();  

         }  

         }  

 

         public static void main(String[] args) {  

         String url = "http://www.easydone.cn/index.htm";  

         writeHtml("c:/demo.htm",getHtmlCode(url),"NO");  

         }  

}  

 

三、利用

Filter

和定制

Response

,把服务器返回的

JSP

响应输出到我们自己的

Response

中,就可以将响应快速写入

Html

文件,然后再发送给客户。

  

 

import java.io.*;  

import javax.servlet.*;  

import javax.servlet.http.*;  

import java.util.Calendar;  

 

public class CacheFilter implements Filter {  

   ServletContext sc;  

   FilterConfig fc;  

   long cacheTimeout = Long.MAX_VALUE;  

 

   public void doFilter(ServletRequest req,  

                        ServletResponse res,  

                        FilterChain chain)  

       throws IOException, ServletException {  

     HttpServletRequest request =  

         (HttpServletRequest) req;  

     HttpServletResponse response =  

         (HttpServletResponse) res;  

 

     // check if was a resource that shouldn't be cached.  

     String r = sc.getRealPath("");  

     String path =   

         fc.getInitParameter(request.getRequestURI());  

     if (path!= null && path.equals("nocache")) {  

       chain.doFilter(request, response);  

       return;  

     }  

     path = r+path;  

 

     String id = request.getRequestURI() +   

         request.getQueryString();  

     File tempDir = (File)sc.getAttribute(  

       "javax.servlet.context.tempdir");  

 

     // get possible cache  

     String temp = tempDir.getAbsolutePath();  

     File file = new File(temp+id);  

 

     // get current resource  

     if (path == null) {  

       path = sc.getRealPath(request.getRequestURI());  

     }  

     File current = new File(path);  

 

     try {  

       long now =  

         Calendar.getInstance().getTimeInMillis();  

       //set timestamp check  

       if (!file.exists() || (file.exists() &&  

           current.lastModified() > file.lastModified()) ||  

           cacheTimeout < now - file.lastModified()) {  

         String name = file.getAbsolutePath();  

         name =  

             name.substring(0,name.lastIndexOf("/"));  

 

 new File(name).mkdirs();           ByteArrayOutputStream baos =               new ByteArrayOutputStream();  

         CacheResponseWrapper wrappedResponse =  

           new CacheResponseWrapper(response, baos);           chain.doFilter(req, wrappedResponse);   

         FileOutputStream fos = new FileOutputStream(file);           fos.write(baos.toByteArray());           fos.flush();           fos.close();         }  

     } catch (ServletException e) {         if (!file.exists()) {  

         throw new ServletException(e);         }       }  

     catch (IOException e) {         if (!file.exists()) {           throw e;         }       }   

     FileInputStream fis = new FileInputStream(file);       String mt = sc.getMimeType(request.getRequestURI());       response.setContentType(mt);  

     ServletOutputStream sos = res.getOutputStream();       for (int i = fis.read(); i!= -1; i = fis.read()) {         sos.write((byte)i);       }     }   

   public void init(FilterConfig filterConfig) {       this.fc = filterConfig;       String ct =  

         fc.getInitParameter("cacheTimeout");       if (ct != null) {  

       cacheTimeout = 60*1000*Long.parseLong(ct);       }  

     this.sc = filterConfig.getServletContext();     }   

   public void destroy() {       this.sc = null;  

 

 

 

 

 

 

     this.fc = null;     }  }   

参考文章:   

使用Filter实现静态HTML缓冲(一种折中方法)   

缓冲是Web应用中必须考虑的一个提高性能的重要手段。对于基于JSP/Servlet技术的站点,常用的缓冲有持久层的数据库连接池缓冲,内存中的值对象缓冲,JSP页面缓冲,以及各种各样的缓冲框架等等,无不是为了提高系统的吞吐量。   

然而对于大型站点来说,将JSP页面转换为静态Html也许是最高效的方法,特别适合于数据不经常变化但是页面访问量特别大的站点,如新闻等,通过把JSP动态页面预先转换为静态Html页面,当用户请求此页面时,系统自动导向到对应的Html页面,从而避免解析JSP请求,调用后台逻辑以及访问数据库等操作所带来的巨大开销。   

如何将一个已有的JSP站点的动态JSP页面转化为静态Html呢?我们希望在不用更改现有Servlet,JSP的前提下让系统自动将这些JSP转换为Html页。幸运的是,Filter为我们提供了一种实现方案。   

Filter是Servlet 2.2规范中最激动人心的特性。Filter能过滤特定URL如/admin/*并进行必要的预处理,如修改Request和Response,从而实现定制的输入输出。更强大的是,Filter本身是一个责任链模式,它能一个接一个地传递下去,从而将实现不同功能的Filter串起来,并且可以动态组合。   

要自动生成静态页面,用Filter截获jsp请求并先进行预处理,自动生成Html,是个不错的主意。一个很容易想到的方法是在Filter截获Request后,导向一个Servlet,在这个Servlet中向本机发送一个http请求,然后将响应写入一个文件:   

   URLConnection urlConn = URLConnection.open(http://localhost/req);    

注意要避免递归。   

另一个方法是不模拟http,而是定制Response,把服务器返回的JSP响应输出到我们自己的Response中,就可以将响应快速写入Html文件,然后再发送给客户。而且,由于没有http模拟请求,直接读取服务器响应速度非常快。   

截获Response的关键便是实现一个WrappedResponse,让服务器将响应写入我们的WrappedResponse中。这类似于一个代理模式,Servlet 2.x已经提供了一个WrappedResponse类,我们只需要复写其中的一些关键方法即可。   

WrappedResponse实现了Response接口,它需要一个Response作为构造函数的

 

 

 

 

 

 

参数,事实上这正是代理模式的应用:WrappedResponse充当了代理角色,它会将JSP/Servlet容器的某些方法调用进行预处理,我们需要实现自己的方法。   

综上:用Filter实现HTML缓冲的步骤是:   

1. 用Filter截获请求,如/a.jsp?id=123,映射到对应的html文件名为/html/a.jsp$id=123.htm。  

2. 查找是否有/html/a.jsp$id=123.htm,如果有,直接forward到此html,结束。  

3. 如果没有,实现一个WrappedResponse,然后调用filterChain(request, wrappedResponse)。  

4. 将返回的WrappedResponse写入文件/html/a.jsp$id=123.htm,然后返回响应给用户。  

5. 下一次用户发送相同的请求时,到第2步就结束了。    

使用这个方法的好处是不用更改现有的Servlet,JSP页,限制是,JSP页面结果不能与Session相关,需要登陆或用户定制的页面不能用这种方法缓冲。

分享到:
评论

相关推荐

    Web HML5实战合集

    3. JSP生成静态HTML页面的几种方法 4. 网页优化meta标签使用方法及规则 5. 使用-HTML5-canvas-进行-Web-绘图 6. 基于-HTML5-的-Dojo-Widget-开发 7. 浅析HTML5在移动应用开发中的使用 8. 深度分析HTML5在移动开发...

    网站性能优化 Web开发 JSP java

    2.缓存技术(当数据更新比较快,几秒钟更新一次,或者需要实时反映数据变化,或者页面具有很多种风格,不便于生成静态页面) 页面缓存(局部缓存和全局缓存)(View,html代码) 缺点:不能做到实时更新 优点:比二...

    ASP.Net.Web程序设计

    7、简要说明在网页中插入JavaSCRIPT脚本的几种方式? 在网页中插入脚本语言通常有三种方式:使用SCRIPT标记符、在标记符中直接嵌入脚本以及链接外部脚本文件. 8、说明在网页中使用CSS的几种方式?CSS选择符的作用及...

    超级有影响力霸气的Java面试题大全文档

     动态INCLUDE用jsp:include动作实现 &lt;jsp:include page="included.jsp" flush="true" /&gt;它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件...

    Java-Web程序设计(PPT).pptx

    1.1.2 Web 应用程序的工作原理 随着网络技术的发展,基于 Internet 的 Web 应用程序也变得越来越复杂,更多的内容需根据用户的请求动态生成页面信息,即动态网站。 动态网站指在Html静态页面中嵌入Java、C#、Php等...

    java 面试题 总结

    动态INCLUDE用jsp:include动作实现 &lt;jsp:include page="included.jsp" flush="true" /&gt;它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的...

    Java面试宝典2020修订版V1.0.1.doc

    1、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 56 2、sleep() 和 wait() 有什么区别? 56 3、当一个线程进入一个对象的一个synchronized方法后,其它线程...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    1、将业务层与表示层分离:使用JSP技术,网络开发人员可充分使用HTML来设计页面显示部分(如字体颜色等),并使用JSP指令或者JAVA程序片段来生成网页上的动态内容; 2、能够跨平台:JSP支持绝大部分平台,包括现在...

    JAVA面试题最全集

    76.EJB有哪几种?区别是什么? 77.JavaBean与EJB有什么区别? 78.软件开发生命周期有哪几个阶段? 79.软件开发有哪些因素? 80.软件开发中如何进行版本控制? 81.UML中,类视图如何表示类中的继承与聚合? 82.客户端...

    基于J2EE框架的个人博客系统项目毕业设计论...

    1、将业务层与表示层分离:使用JSP技术,网络开发人员可充分使用HTML来设计页面显示部分(如字体颜色等),并使用JSP指令或者JAVA程序片段来生成网页上的动态内容; 2、能够跨平台:JSP支持绝大部分平台,包括现在...

    EL表达式的详细使用

    它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。 EL 提供了在 JSP 脚本编制...

    DWR.xml配置文件说明书(含源码)

    DWR 自动将DOM、DOM4J、JDOM和XOM转换成DOM树,前面这几种类型都仅仅返回Document,Element,Node.DWR会自动将这些转换成浏览器DOM对象.通常在启动JDOM Converter时会有一个提示信息,除非你想采用JDOMconverter否则可以...

    二十三种设计模式【PDF版】

    有几种画法?艺术大家通常是创造出自己的套路,比如明末清初,水墨画法开始成熟,这时画树就不用勾勒这个模式了,而是一笔 下去,浓淡几个叶子,待毛笔的水墨要干枯时,画一下树干,这样,一个活生写意的树就画出来. 我上面...

    java-servlet-api.doc

    这份文档以及刚才提及的Javadoc格式的文档都描述了这两个软件包,Javadoc格式的文档还描述了你应该如何使用这两个软件包中的所有方法。 有关规范 你也许对下面的这些Internet规范感兴趣,这些规范将直接影响到...

    软件工程-理论与实践(许家珆)习题答案

    答:主要的软件开发方法有:结构化开发方法、Jackson(JSP、JSD)方法、原型化开发方 法、维也纳开发方法(VDM)和面向对象的开发方法。 6. 软件生命期各阶段的任务是什么? 答:软件生命期瀑布模型分为六个阶段: ...

    Java范例开发大全 (源程序)

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟)... 13.1 多线程的五种基本状态 405  实例222 启动线程 405  实例223 参赛者的比赛生活(线程休眠唤醒) 407  实例224 资源搜索并下载(线程...

    java范例开发大全(pdf&源码)

    13.1 多线程的五种基本状态 405 实例222 启动线程 405 实例223 参赛者的比赛生活(线程休眠唤醒) 407 实例224 资源搜索并下载(线程等待和通报) 410 实例225 模拟淘宝购物买卖双方交易问题 412 实例226 携子之手 ...

    java范例开发大全源代码

     实例45 请求的方法不存在(NoSuchMethodException) 63  4.3 try…catch捕获异常 65  实例46 try…catch捕获异常的实例 66  实例47 try…catch…finally捕获异常的实例 67  实例48 try…catch嵌套捕获...

Global site tag (gtag.js) - Google Analytics