您的位置:首页 > 编程语言 > Java开发

高性能Java Web 页面静态化技术

2016-02-15 14:33 567 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: