高性能Java Web 页面静态化技术
package com.yancms.util; import java.io.*;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams; /**
* 静态页面引擎技术(突乱了乱码问题UTF-8)
* @author 吴彦文
*
*/
public class HtmlGenerator extends BaseLog {
HttpClient httpClient = null; //HttpClient实例
GetMethod getMethod =null; //GetMethod实例
BufferedWriter fw = null;
String page = null;
String webappname = null;
BufferedReader br = null;
InputStream in = null;
StringBuffer sb = null;
String line = null;
//构造方法
public HtmlGenerator(String webappname){
this.webappname = webappname; } /** 根据模版及参数产生静态页面 */
public boolean createHtmlPage(String url,String htmlFileName){
boolean status = false;
int statusCode = 0;
try{
//创建一个HttpClient实例充当模拟浏览器
httpClient = new HttpClient();
//设置httpclient读取内容时使用的字符集
httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"UTF-8");
//创建GET方法的实例
getMethod = new GetMethod(url);
//使用系统提供的默认的恢复策略,在发生异常时候将自动重试3次
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
//设置Get方法提交参数时使用的字符集,以支持中文参数的正常传递
getMethod.addRequestHeader("Content-Type","text/html;charset=UTF-8");
//执行Get方法并取得返回状态码,200表示正常,其它代码为异常
statusCode = httpClient.executeMethod(getMethod);
if (statusCode!=200) {
logger.fatal("静态页面引擎在解析"+url+"产生静态页面"+htmlFileName+"时出错!");
}else{
//读取解析结果
sb = new StringBuffer();
in = getMethod.getResponseBodyAsStream();
//br = new BufferedReader(new InputStreamReader(in));//此方法默认会乱码,经过长时期的摸索,下面的方法才可以
br = new BufferedReader(new InputStreamReader(in,"UTF-8"));
while((line=br.readLine())!=null){
sb.append(line+"\n");
}
if(br!=null)br.close();
page = sb.toString();
//将页面中的相对路径替换成绝对路径,以确保页面资源正常访问
page = formatPage(page);
//将解析结果写入指定的静态HTML文件中,实现静态HTML生成
writeHtml(htmlFileName,page);
status = true;
}
}catch(Exception ex){
logger.fatal("静态页面引擎在解析"+url+"产生静态页面"+htmlFileName+"时出错:"+ex.getMessage());
}finally{
//释放http连接
getMethod.releaseConnection();
}
return status;
} //将解析结果写入指定的静态HTML文件中
private synchronized void writeHtml(String htmlFileName,String content) throws Exception{
fw = new BufferedWriter(new FileWriter(htmlFileName));
OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream(htmlFileName),"UTF-8");
fw.write(page);
if(fw!=null)fw.close();
} //将页面中的相对路径替换成绝对路径,以确保页面资源正常访问
private String formatPage(String page){
page = page.replaceAll("\\.\\./\\.\\./\\.\\./", webappname+"/");
page = page.replaceAll("\\.\\./\\.\\./", webappname+"/");
page = page.replaceAll("\\.\\./", webappname+"/");
return page;
} //测试方法
public static void main(String[] args){
HtmlGenerator h = new HtmlGenerator("webappname");
h.createHtmlPage("http://localhost:8080/yanCms/three/three?parent_id=10&id=103&type=10","c:/a.html");
System.out.println("静态页面已经生成到c:/a.html"); } }
<li class="alt"><span><span class="keyword">package</span><span> com.yancms.util; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> java.io.*; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.apache.commons.httpclient.*; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.apache.commons.httpclient.methods.*; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.apache.commons.httpclient.params.HttpMethodParams; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="comment">/**</span> </span></li><li class="alt"><span><span class="comment"> * 静态页面引擎技术(突乱了乱码问题UTF-8)</span> </span></li><li class=""><span><span class="comment"> * @author 吴彦文</span> </span></li><li class="alt"><span><span class="comment"> *</span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> HtmlGenerator </span><span class="keyword">extends</span><span> BaseLog { </span></span></li><li class=""><span> HttpClient httpClient = <span class="keyword">null</span><span>; </span><span class="comment">//HttpClient实例</span><span> </span></span></li><li class="alt"><span> GetMethod getMethod =<span class="keyword">null</span><span>; </span><span class="comment">//GetMethod实例</span><span> </span></span></li><li class=""><span> BufferedWriter fw = <span class="keyword">null</span><span>; </span></span></li><li class="alt"><span> String page = <span class="keyword">null</span><span>; </span></span></li><li class=""><span> String webappname = <span class="keyword">null</span><span>; </span></span></li><li class="alt"><span> BufferedReader br = <span class="keyword">null</span><span>; </span></span></li><li class=""><span> InputStream in = <span class="keyword">null</span><span>; </span></span></li><li class="alt"><span> StringBuffer sb = <span class="keyword">null</span><span>; </span></span></li><li class=""><span> String line = <span class="keyword">null</span><span>; </span></span></li><li class="alt"><span> <span class="comment">//构造方法</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> HtmlGenerator(String webappname){ </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.webappname = webappname; </span></span></li><li class=""><span> </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">/** 根据模版及参数产生静态页面 */</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">boolean</span><span> createHtmlPage(String url,String htmlFileName){ </span></span></li><li class="alt"><span> <span class="keyword">boolean</span><span> status = </span><span class="keyword">false</span><span>; </span></span></li><li class=""><span> <span class="keyword">int</span><span> statusCode = </span><span class="number">0</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">try</span><span>{ </span></span></li><li class=""><span> <span class="comment">//创建一个HttpClient实例充当模拟浏览器</span><span> </span></span></li><li class="alt"><span> httpClient = <span class="keyword">new</span><span> HttpClient(); </span></span></li><li class=""><span> <span class="comment">//设置httpclient读取内容时使用的字符集</span><span> </span></span></li><li class="alt"><span> httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,<span class="string">"UTF-8"</span><span>); </span></span></li><li class=""><span> <span class="comment">//创建GET方法的实例</span><span> </span></span></li><li class="alt"><span> getMethod = <span class="keyword">new</span><span> GetMethod(url); </span></span></li><li class=""><span> <span class="comment">//使用系统提供的默认的恢复策略,在发生异常时候将自动重试3次</span><span> </span></span></li><li class="alt"><span> getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, <span class="keyword">new</span><span> DefaultHttpMethodRetryHandler()); </span></span></li><li class=""><span> <span class="comment">//设置Get方法提交参数时使用的字符集,以支持中文参数的正常传递</span><span> </span></span></li><li class="alt"><span> getMethod.addRequestHeader(<span class="string">"Content-Type"</span><span>,</span><span class="string">"text/html;charset=UTF-8"</span><span>); </span></span></li><li class=""><span> <span class="comment">//执行Get方法并取得返回状态码,200表示正常,其它代码为异常</span><span> </span></span></li><li class="alt"><span> statusCode = httpClient.executeMethod(getMethod); </span></li><li class=""><span> <span class="keyword">if</span><span> (statusCode!=</span><span class="number">200</span><span>) { </span></span></li><li class="alt"><span> logger.fatal(<span class="string">"静态页面引擎在解析"</span><span>+url+</span><span class="string">"产生静态页面"</span><span>+htmlFileName+</span><span class="string">"时出错!"</span><span>); </span></span></li><li class=""><span> }<span class="keyword">else</span><span>{ </span></span></li><li class="alt"><span> <span class="comment">//读取解析结果</span><span> </span></span></li><li class=""><span> sb = <span class="keyword">new</span><span> StringBuffer(); </span></span></li><li class="alt"><span> in = getMethod.getResponseBodyAsStream(); </span></li><li class=""><span> <span class="comment">//br = new BufferedReader(new InputStreamReader(in));//此方法默认会乱码,经过长时期的摸索,下面的方法才可以</span><span> </span></span></li><li class="alt"><span> br = <span class="keyword">new</span><span> BufferedReader(</span><span class="keyword">new</span><span> InputStreamReader(in,</span><span class="string">"UTF-8"</span><span>)); </span></span></li><li class=""><span> <span class="keyword">while</span><span>((line=br.readLine())!=</span><span class="keyword">null</span><span>){ </span></span></li><li class="alt"><span> sb.append(line+<span class="string">"\n"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">if</span><span>(br!=</span><span class="keyword">null</span><span>)br.close(); </span></span></li><li class=""><span> page = sb.toString(); </span></li><li class="alt"><span> <span class="comment">//将页面中的相对路径替换成绝对路径,以确保页面资源正常访问</span><span> </span></span></li><li class=""><span> page = formatPage(page); </span></li><li class="alt"><span> <span class="comment">//将解析结果写入指定的静态HTML文件中,实现静态HTML生成</span><span> </span></span></li><li class=""><span> writeHtml(htmlFileName,page); </span></li><li class="alt"><span> status = <span class="keyword">true</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> }<span class="keyword">catch</span><span>(Exception ex){ </span></span></li><li class=""><span> logger.fatal(<span class="string">"静态页面引擎在解析"</span><span>+url+</span><span class="string">"产生静态页面"</span><span>+htmlFileName+</span><span class="string">"时出错:"</span><span>+ex.getMessage()); </span></span></li><li class="alt"><span> }<span class="keyword">finally</span><span>{ </span></span></li><li class=""><span> <span class="comment">//释放http连接</span><span> </span></span></li><li class="alt"><span> getMethod.releaseConnection(); </span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">return</span><span> status; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//将解析结果写入指定的静态HTML文件中</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> </span><span class="keyword">synchronized</span><span> </span><span class="keyword">void</span><span> writeHtml(String htmlFileName,String content) </span><span class="keyword">throws</span><span> Exception{ </span></span></li><li class=""><span> fw = <span class="keyword">new</span><span> BufferedWriter(</span><span class="keyword">new</span><span> FileWriter(htmlFileName)); </span></span></li><li class="alt"><span> OutputStreamWriter fw = <span class="keyword">new</span><span> OutputStreamWriter(</span><span class="keyword">new</span><span> FileOutputStream(htmlFileName),</span><span class="string">"UTF-8"</span><span>); </span></span></li><li class=""><span> fw.write(page); </span></li><li class="alt"><span> <span class="keyword">if</span><span>(fw!=</span><span class="keyword">null</span><span>)fw.close(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//将页面中的相对路径替换成绝对路径,以确保页面资源正常访问</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String formatPage(String page){ </span></span></li><li class=""><span> page = page.replaceAll(<span class="string">"\\.\\./\\.\\./\\.\\./"</span><span>, webappname+</span><span class="string">"/"</span><span>); </span></span></li><li class="alt"><span> page = page.replaceAll(<span class="string">"\\.\\./\\.\\./"</span><span>, webappname+</span><span class="string">"/"</span><span>); </span></span></li><li class=""><span> page = page.replaceAll(<span class="string">"\\.\\./"</span><span>, webappname+</span><span class="string">"/"</span><span>); </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> page; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//测试方法</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args){ </span></span></li><li class=""><span> HtmlGenerator h = <span class="keyword">new</span><span> HtmlGenerator(</span><span class="string">"webappname"</span><span>); </span></span></li><li class="alt"><span> h.createHtmlPage(<span class="string">"http://localhost:8080/yanCms/three/three?parent_id=10&id=103&type=10"</span><span>,</span><span class="string">"c:/a.html"</span><span>); </span></span></li><li class=""><span> System.out.println(<span class="string">"静态页面已经生成到c:/a.html"</span><span>); </span></span></li><li class="alt"><span> </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>} </span></li>
高性能Java Web 页面静态化技术的更多相关文章
- 高性能Java Web 页面静态化技术(原创)
package com.yancms.util; import java.io.*; import org.apache.commons.httpclient.*; import org.apache ...
- php页面静态化技术;学习笔记
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 页面静态化技术Freemarker技术的介绍及使用实例.
一.FreeMarker简介 1.动态网页和静态网页差异 在进入主题之前我先介绍一下什么是动态网页,动态网页是指跟静态网页相对应的一种网页编程技术.静态网页,随着HTML代码的生成,页面的内容和显示效 ...
- java秒杀系列(2)- 页面静态化技术
前言 通过代码片段分别介绍服务端渲染.客户端渲染.对象缓存三种方式的写法. 代码片段仅供参考,具体实现需要根据业务场景自行适配,但思想都是一样. 一.服务端渲染方式 1.接口返回html页面的设置 @ ...
- Freemarker页面静态化技术,activemq监听页面变动
初步理解: 架构优化: 静态页面的访问速度优于从缓存获取数据的动态页面的访问速度: Freemarker: 导包 模板:hello.ftl <!DOCTYPE html> <html ...
- Freemarker 页面静态化技术使用入门案例
在访问 新闻.活动.商品 详情页面时, 路径可以是 xx[id].html, 服务器端根据请求 id, 动态生成 html 网页,下次访问数据时,无需再查询数据,直接将 html 静态页面返回.这样一 ...
- Thymeleaf页面静态化技术
Teymeleaf的使用 案例一:springboot搭建Thymeleaf 1.导入依赖 2.新建html页面模板 3.新建前端控制层Controller 4.新建启动类 1.导入依赖 <?x ...
- Django框架开发web网站的网页优化—页面静态化
网站优化-页面静态化 1)概念 提前将页面所用到的数据从数据库查询出来,然后生成一个静态页面,之后用户来访问的时候,直接返回静态页面. 举例:首页静态化:获取首页用到的数据表中的数据,生成静态首页in ...
- 大型网站提速关键技术(页面静态化,memcached,MySql优化)(三)
页面静态化的技术实现有两种方式 使用PHP自己的缓存机制 先说明一下OB缓存的机制. ob1.php 代码:说明的ob的各个用法->项目中 ☞ 如何打开ob缓存 ① 配置php.ini ...
随机推荐
- Microsoft Office 2007 Professional Plus+ 正版密钥
Microsoft Office 2007 Professional Plus+ 正版密钥 说微软原版,自有Microsoft官方MSDN网站有关下载的校验值为证(附后).密钥安装后 ...
- C#垃圾回收
析构方法: 我们知道引用类型都有构造方法(constructor),相对应的也有一个析构方法(destructor).顾名思义,构造方法,就是在创建这个对象时,要执行的方法.例如,我们可以通过构造方法 ...
- 启动mySQL安装出现1067错误
可能几种的办法: 删除data目录下的ib_logfile0和ib_logfile1 查看my.ini文件中的dir设置 查看err文件,如果是temp出现错误文件,则添加temp文件的路径
- 高放的c++学习笔记之函数基础
局部变量 函数里面的局部变量有普通的局部变量和局部静态变量两种. 普通局部变量变量就是正常定义在函数体内部的变量,如果返回局部变量的地址,以便于函数调用结束后还继续访问此变量的话,编译器会报warni ...
- libusb简介
概述 libusb是一个C库,它提供了通用的访问USB设备. 它的目的是供开发人员使用方便的生产与USB通信硬件的应用程序. 可移植的: 使用一个跨平台API,它提供了访问USB设备在Linux上,O ...
- Delphi之TreeView
TreeView是Delphi中使用频率比较高的一个控件,虽然使用次数很多,但总结不够.借着这次做GDW原型的机会总结一下,写的过程中也会参考网上的博文. TTreeView.TTreeNodes和T ...
- golang byte转string 字节数组转字符串的问题
golang语言本身就是c的工具集,开发c的程序用到的大部分结构体,内存管理,携程等,golang基本都有,他只是在这个基础上又加了一些概念这里说一个很小的问题,就是字节数组转string的问题,网上 ...
- Oracle数据库之创建表结构
Oracle数据库之创建表结构 主键与外键 主键:关系型数据库中的一条记录中有若干个属性,若其中的某一个属性组(可以是一个属性,也可以是多个)能唯一标识一条记录,那么该属性组就是主键. 外键:关系型数 ...
- js解决网页无法复制文字的问题
碰到有些网站,站长禁止了右键,或者用其它方法不让复制网页的文字,弄的好烦人啊,虽然这是小把戏,但多多少少造成了一些不方便,前几天发现这个解决不能复制问题的小方法,一行代码即搞定,就是下面这行: jav ...
- C# 实现将PDF转文本的功能
这篇文章最初只描述使用 PDFBox 来解析PDF文件.现在它已经被扩展到包括使用 IFilter 和 iTextSharp 的例程了. 这篇文章和对应的Visual Studio项目已经更新到目前 ...