- 浏览: 436129 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
adaylee:
貌似好久没上了
用iptables 实现本地端口转发 -
adaylee:
鲫鱼?哈哈,居然Google到你了
用iptables 实现本地端口转发 -
yflxc:
com.sun.jimi.core.raster.JimiRa ...
java对图片进行等比例缩放 -
bo_hai:
等比例压缩的算法是不是可以改进呢?
java对图片进行等比例缩放 -
Mr.TianShu:
http://www.cppblog.com/deercode ...
java 遍历目录下的文件
一、从数据库中取相应数据并替换掉模板中的对应标签,下面是一个简单的示例
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### </td> </tr> <tr> <td>###content###</td> </tr> </table> </body> </html>
二、从动态页的URL获取相应页面内容并写入到文件
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>Preferences>Java>Code Generation>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 /1000 +"秒"); } 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相关,需要登陆或用户定制的页面不能用这种方法缓冲。
发表评论
-
JS类型转换以及类型判断
2010-07-11 19:25 2055在Java中,基本类型之间的强制转换也不是这样的,比如,整数要 ... -
JS刷新父窗口的几种方式
2009-03-26 08:58 5887用iframe、弹出子页面刷新父页面iframe Js代码 ... -
关闭窗口避免弹出确认框!
2009-03-23 00:25 1765<INPUT TYPE="button&quo ... -
深入浅出URL编码
2009-02-05 18:57 946深入浅出URL编码 出处 ... -
使用Javascript操作DOM的一些方法--元素的访问/复制等
2008-12-17 22:06 2286使用Javascript操作DOM的一些方法--元素的访问/复 ... -
jsp中alert()失效的几种情况
2008-12-15 19:38 4016没想到就这么一个小问题,居然折腾了半天,现总结一下! jsp中 ... -
servlet-api文档(中文)
2008-12-02 14:44 1422软件包:javax.servlet.http ... -
23种页面特效
2008-11-26 17:11 1219进入页面<meta http-equiv="P ... -
求一个新闻列表上下排序的代码
2008-11-17 14:28 1429我的新闻发布系统是先将新闻生成静态页面,然后 ... -
jsp各种分页
2008-10-25 08:42 1493前言 在使用数据库的过程中,不可避免的需要 ...
相关推荐
本文档主要讲述的是JSP生成静态HTML页面的几种方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
在JSP中,可以通过几种方式实现静态页的生成: 1. **使用JSP的`<jsp:include>`标签:** 这个标签可以包含一个静态的HTML文件,这样在请求JSP时,实际被发送到浏览器的是HTML内容。例如: ```jsp <jsp:include ...
JSP动态生成HTML静态页面的核心思路是,当一个动态页面被首次访问或者内容更新时,服务器不直接返回JSP生成的HTML,而是先将其转换为一个静态HTML文件,然后将这个静态文件返回给客户端。后续的相同请求就直接返回这...
在IT行业中,动态网站开发是常见的应用场景,而“查询数据库,由JSP生成静态页面”是一种优化网站性能的策略。这种技术旨在通过将频繁访问的数据转换为静态HTML页面,从而减轻服务器的压力,提高用户访问速度,提升...
综上所述,利用JSP生成静态HTML页面是一种实用且高效的Web开发策略,尤其适用于那些需要高性能和良好SEO表现的大型网站。通过合理设计模板和优化数据处理流程,可以实现既保持网站动态特性又兼顾静态页面优点的目标...
JSP静态化主要有以下几种实现方式: 1. **页面缓存**:当一个JSP页面被请求时,服务器会将其转换成HTML并存储在缓存中。下次相同请求到来时,直接从缓存中读取HTML,不再解析JSP,降低了服务器的计算开销。 2. **...
实现JSP页面静态化的方法主要有以下几种: 1. 手动静态化:开发者在发布新内容时,手动将JSP页面转换为HTML并上传到服务器。这种方式简单易行,但维护成本高,不适合频繁更新的站点。 2. 自动静态化:通过编程实现...
页面静态化是Web开发中一种优化技术,主要目的是减少服务器负担和提高网页加载速度,尤其对于高访问量的网站,效果显著。本实例是关于如何将JSP(Java Server Pages)页面转换为HTML静态页面的过程,这对于提升用户...
### JSP结合JavaBean生成静态页面的技术要点及...综上所述,JSP结合JavaBean生成静态页面是一种简单而有效的方法,不仅可以减轻服务器负担,还能提高用户体验。通过进一步的功能扩展,可以更好地满足实际应用的需求。
7. **定期更新**:系统需要定期检查内容是否有变化,并在必要时重新生成静态页面,确保内容的实时性。 使用【通用静态页面生成系统】带来的优势主要包括: - **性能提升**:静态页面减少了服务器的计算和数据库...
总的来说,"JSP版PowerDiamond生成静态wap wml页面"涉及的是早期移动互联网时代的网页开发技术,它结合了JSP的动态性与WAP/WML的适应性,为移动设备提供了访问互联网内容的方式。随着技术的进步,现在的移动应用和...
以上两种方法分别介绍了如何在Action层和JSP页面内部生成静态HTML页面。在Action层生成页面的优点在于可以更好地控制生成过程,并方便地与其他业务逻辑集成;而在JSP页面内部生成则更便于快速响应用户的请求,实现...
Java 生成静态HTML页面是一种常见的优化网站性能的技术,它可以减轻服务器和数据库的负载,提高页面加载速度,并且有利于搜索引擎优化(SEO)。以下是一些关于如何使用Java实现这一目标的方法: 1. **动态页面到...
FreeMarker是一个强大的、开源的模板引擎,常用于生成动态HTML、XML或其他格式的文本,比如在JSP(JavaServer Pages)应用中生成静态页面。它将业务逻辑与表现层分离,提高了开发效率和代码可维护性。在Java Web开发...
在Java/JSP环境中,实现伪静态主要有以下几种方法: 1. **URL重写**:使用Apache的mod_rewrite模块或者Tomcat的RewriteFilter,通过配置规则将动态URL重定向到对应的JSP页面。例如,将`/article.html`映射到实际的`...
转换JSP到HTML的方法主要有以下几种: 1. **预渲染**:在发布到服务器之前,可以先在服务器端运行JSP,生成HTML文件并保存。这种方法适用于内容不常更新的页面,例如关于我们、联系我们等静态内容页。 2. **使用...
在IT行业中,生成静态网页是一种常见的优化网站性能和提高安全性的方法。动态网站与静态网站是两种不同的构建方式,它们各自具有独特的优缺点。本文将深入探讨“动生静态”这一概念,以及如何利用源码生成静态的企业...
在Web开发领域,JavaServer Pages(JSP)是一种常见的技术,用于创建动态网页。JSP允许开发者将HTML代码与Java代码相结合,以实现服务器端的逻辑处理。然而,随着前端技术的发展,更多的应用倾向于采用单页应用(SPA...