下载 > 资源分类 >  开发技术 >  Java > jsp动态生成html

jsp动态生成html

2013-06-13 上传大小:10KB

jsp动态生成html

一、从数据库中取相应数据并替换掉模板中的对应标签,下面是一个简单的示例 


1.buildhtml.jsp 
<%@ page contentType="text/html; charset=gb2312" import="java.util.*,java.io.*"%> 
<% 
try{ 
String ti
tle="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相关,需要登陆或用户定制的页面不能用这种方法缓冲
...展开收缩
综合评分:4(23位用户评分)
开通VIP C币充值 立即下载

评论共有12条

xiaoliang5742016-11-05 10:30:40
非常好用 学习了
zympower12016-06-14 22:19:58
有用 很好
bearsorry2015-07-21 13:17:02
谢谢楼主,又有一种方法了~~~

登录后才能评论

 

相关推荐

动态Jsp页面转换成静态Html页面 立即下载
积分/C币:3
用ajax实现HTML 功能,从而达到动态从数据库中得到数据,而不要去修改jsp页面。代码: 立即下载
积分/C币:3
从数据库动态生成树形菜单的JSP实现,使用dtree 立即下载
积分/C币:5
Ext动态树的生成,后台是JSP 立即下载
积分/C币:3
jsp动态树的生成.doc 立即下载
积分/C币:3
JSP动态生成树DTREE 立即下载
积分/C币:3
JSP调用Java Bean在网页上动态生成柱状图 立即下载
积分/C币:3
jasperreport 6.4.1报表动态列,以及生成导出html 立即下载
积分/C币:3
一个能生成动态HTML格式的PHP库 立即下载
积分/C币:3
Asp.net动态生成html页面 立即下载
积分/C币:3
纯C#技术下html页面动态生成的研究与实现 立即下载
积分/C币:10
一套基于PHP+MYSQL实现支持动态、伪静态、生成HTML模式的七夜图片管理系统源码 立即下载
积分/C币:3
生成jsp 动态验证码 立即下载
积分/C币:3
jsp动态生成图像 立即下载
积分/C币:3
动态生成html的友情链接系统 立即下载
积分/C币:3
纯C#技术下HTML页面动态生成的实现 立即下载
积分/C币:3
JSP生成静态HTML页面的几种方法 立即下载
积分/C币:3
让jsp编程html生成静态页面, 立即下载
积分/C币:3
JSP动态网页编程_王丽菊_扫描全本 立即下载
积分/C币:0
JS动态树分组的实现,数据库建表,JSP页面展示 立即下载
积分/C币:3

热门专辑

VIP会员动态

关闭
img

spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip

资源所需积分/C币 当前拥有积分 当前拥有C币
5 0 0
扫码关注并点击右下角获取下载码
输入下载码
为了良好体验,不建议使用迅雷下载
img

jsp动态生成html

会员到期时间: 剩余下载个数: 剩余C币:593 剩余积分:0
为了良好体验,不建议使用迅雷下载
VIP下载
您今日下载次数已达上限(为了良好下载体验及使用,每位用户24小时之内最多可下载20个资源)

积分不足!

资源所需积分/C币 当前拥有积分
您可以选择
开通VIP
4000万
程序员的必选
600万
绿色安全资源
现在开通
立省522元
或者
购买C币兑换积分 C币抽奖
img

资源所需积分/C币 当前拥有积分 当前拥有C币
5 4 45
(仅够下载10个资源)
为了良好体验,不建议使用迅雷下载
确认下载
img

资源所需积分/C币 当前拥有积分 当前拥有C币
5 0 0
为了良好体验,不建议使用迅雷下载
C币充值 开通VIP
img

资源所需积分/C币 当前拥有积分 当前拥有C币
5 4 45
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
确认下载
下载

兑换成功

你当前的下载分为234开始下载资源
你还不是VIP会员
开通VIP会员权限,免积分下载
立即开通

你下载资源过于频繁,请输入验证码

您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:webmaster@csdn.net!

举报

若举报审核通过,可奖励5下载分

  • 举报人:
  • 被举报人:
  • 举报的资源分:
  • *类型:
  • *详细原因: