动态页面静态化

前几天由于公司需要、要求让我写一个类似hao123一样的导航网站。当时一头雾水的,心想不就是导航网站吗?全的是些静态的html标签。一百年都不会换一下的。有什么写的,可是刚刚有这样的想法头就告诉我,不可能会让写静态的html标签的、必须做成动态的可以维护的。
这下我放心了、其实写静态的我会累死的。随便一个导航网站全部下来也是上百个html文件的。我做成了动态可以维护的,将页面分成了几个部分。一是头、内嵌搜索框、头广告。名站导航。常用工具、还有底部广告、常用网站。以及地方服务网站。行业网站等……
很快我做完了动态的网址导航了。可是我发现一个不可忽视的问题。那就是所有页面的显示和下级的显示全都是动态的。
天哪 这那能用、仅仅一个导航网站不可能用户每次请求都来提交请求、再让服务器返回吧。那我不丢大人了。
于是页面静态化就成了义不容辞的责任了。刚开始我有点心虚。赶紧谷歌百度一下。结果全是些垃圾信息。怎么办、静下心来想想。静态化不就是把访问好的动态页面存放成静态的html文件吗?不就是一个访问。一个存储。再把动态链接替换成静态链接吗?
于是就有了下面这些代码了

这是生成静态页面的类 因为是建的main方法测试的所以全都是用的静态方法。具体视自己的情况用
提醒:修改动态链接。首先一定要在动态访问地址时设定规则。比如我这里所有的动态链接都包括".jspa?path="
比如href="secondpage.jspa?path=jiaoyu&id=2291"建立的html文件地址即位 /secondpage目录下的jiaoyu.html所以在匹配动态链接时需要将动态的链接也改为href="secondpage/iaoyu.html"
package service;

import java.io.*;
import java.net.URL;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* 动态页面静态化
*/
public class StaticHTMLFile {
/**
* @param dir 存放静态页面的本地文件路径
* @param page 生成html文件需要保存的绝对路径
* @param url_addr 所要生成的静态页的URL地址
* @return
*/
public static boolean PrintPage(String dir, String page, String url_addr) {
URL url;
String rLine = null;
PrintWriter fileOut = null;
InputStream ins = null;
try {
url = new URL(url_addr);
ins = url.openStream();
BufferedReader bReader = new BufferedReader(new InputStreamReader(ins, "UTF-8"));// 获取编码为UTF-8的文件
File destFileDir = new File(dir);
if(!destFileDir.exists()){
destFileDir.mkdirs();
}

FileOutputStream out = new FileOutputStream(page);

OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
fileOut = new PrintWriter(writer);
// 循环取取数据,并写入目标文件中
while ((rLine = bReader.readLine()) != null) {
String tmp_rLine = rLine;
//System.out.println(rLine);
int str_len = tmp_rLine.length();
if (str_len > 0) {
fileOut.println(tmp_rLine);
fileOut.flush();
}
tmp_rLine = null;
}

url = null;
return true;
} catch (IOException e) {
System.out.println("error: " + e.getMessage());
e.printStackTrace();
return false;
} catch (Exception es) {
System.out.println(es.getMessage());
return false;
} finally {// 关闭资源
fileOut.close();
try {
ins.close();
} catch (IOException ex) {
// 关闭输入流出错
ex.printStackTrace();
}
}

}

public static void main(String[] args) {
// 生成首页
//静态页面要存放的根目录
String savepath="D:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps/daohang/";
//生成首页html的绝对路径
String filename ="D:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps/daohang/index.html";
//需要生成首页的访问地址
String forurl = "http://localhost:7001/daohang/index.jspa";
//生成二级和三级页面的跟url
String baseurl = "http://localhost:7001/daohang/";
boolean saveindex = saveHtml(savepath, filename, forurl);
if(saveindex){
saveSecondPage(filename,savepath,baseurl);
}
boolean bb = updHtmlhref(filename,"1");
if(bb){
System.out.println("首页链接已修改成功");
}


//String indexFile = "D:/daohang/index.html";

}

/**
* 生成二级页面
* @param indexfilename
* @return
*/
public static boolean saveSecondPage(String indexfilename,String basePath,String baseurl){
List<String> hreflist = ReadFromFile.readFileByChars(indexfilename);//获取到动态链接集合
System.out.println(hreflist.size());
if(hreflist.size()>0){
for(String href : hreflist){//访问动态链接 生成新的静态html文件
System.out.println(href);
Pattern p = Pattern.compile("(\\w+?)[.]jspa[?]path=(\\w+)&");//匹配 目录名 和 文件名
Matcher m = p.matcher(href);
String dir = null,sfilename = null,url = href;
while (m.find()) {
System.out.println(href+"\t"+m.group(1)+"\t"+m.group(2));
dir = m.group(1);
sfilename = m.group(2);
}
Pattern p2 = Pattern.compile("\"([^\"]+)\"");//匹配要访问的url
Matcher m2 = p2.matcher(href);
while(m2.find()){
System.out.println(m2.group(1));
url = m2.group(0);
}
String ssavepath = basePath+dir+"/";
String flname = ssavepath + sfilename+ ".html";
String sforurl = baseurl+url;
System.out.println("文件保存目录:"+basePath+dir+"/");
System.out.println("文件绝对地址:"+flname);
System.out.println("访问的url: "+baseurl+url);

boolean ssbb = saveHtml(ssavepath, flname, sforurl);//生成二级页面 保存页面成功后调用执行 更改连接
if(ssbb){
System.out.println("二级页面生成成功");
List<String> shreflist = ReadFromFile.readFileByChars(flname);//如果页面
if(shreflist.size()>0){//如果二级页面中存在动态链接
for(String thref : shreflist){//读取二级页面 根据二级页面的动态链接生成 静态html文件
System.out.println("三级链接");
Pattern p3 = Pattern.compile("(\\w+?)[.]jspa[?]path=(\\w+)&");//匹配 目录名 和 文件名
Matcher m3 = p3.matcher(thref);
String tdir=null,tfilename = null,turl = thref;
while(m3.find()){//匹配正则表达式 然后得到保存文件路径 和 文件名称
System.out.println("要访问的url:"+thref+"\t"+m3.group(1)+"\t"+m3.group(2));
tdir = m3.group(1);
tfilename = m3.group(2);
}

Pattern p4 = Pattern.compile("\"([^\"]+)\"");
Matcher m4 = p4.matcher(thref);
while(m4.find()){
System.out.println(m4.group(1));
turl = m4.group(0);
}
String thtmlpath = basePath+dir+"/";
String tflname = thtmlpath+tfilename+".html";
String tfwurl = baseurl+turl;
boolean tsavehtml = saveHtml(thtmlpath, tflname, tfwurl);
if(tsavehtml){
System.out.println("&&&&&&&&&&&&&&&&&&&三级页面生成成功");
}
}

boolean updsherf = updHtmlhref(flname,"0");
if(updsherf){
System.out.println(flname+"二级页面链接已经修改成功");
}
}
}
}
return true;
}else
return false;



}

public static boolean saveHtml(String savepath,String filename,String forurl){
String msg ="";
boolean rs = PrintPage(savepath,filename, forurl);
if(rs){
msg="文件已保存,地址为:"+filename;
System.out.println(msg);
return true;
}else{
msg="文件保存失败,请检查地址:"+forurl;
System.out.println(msg);
return false;
}


}
/**
* 生成首页静态页面
*/
public static void saveIndexPage(String savepath,String filename,String forurl){
saveHtml(savepath, filename, forurl);
}
/**
* 修改生成页面的 动态链接
* @param filepath
* @return
*/
public static boolean updHtmlhref(String filepath,String isindex){
File file = new File(filepath);
if(file.exists()){
StringBuilder sb = new StringBuilder();
try {
BufferedReader bin;
bin = new BufferedReader(new InputStreamReader(new FileInputStream(filepath), "UTF-8"));

String s = null;
if(isindex.equals("1")){//如果是读取的首页则生成的动态链接改为“xxx/xxx.html”
while((s=bin.readLine())!=null){
System.out.println(s);
Pattern p = Pattern.compile("href=\"([a-zA-z0-9]+)[.]jspa[?]path=([a-zA-z0-9]+)[^\"]*\"");
Matcher m = p.matcher(s);
if(m.find()){
System.out.println(s);
System.out.println(m.group(1)+"\t"+m.group(2));
s = s.replaceAll("href=\"[^\"]*\"", "href=\""+m.group(1)+"/"+m.group(2)+".html\"");
System.out.println(s);
}
sb.append(s).append("\n");
}
}else if(isindex.equals("0")){//如果不是首页//动态链接则改为xxx.html
while((s=bin.readLine())!=null){
System.out.println(s);
Pattern p = Pattern.compile("href=\"([a-zA-z0-9]+)[.]jspa[?]path=([a-zA-z0-9]+)[^\"]*\"");
Matcher m = p.matcher(s);
if(m.find()){
System.out.println(s);
System.out.println(m.group(1)+"\t"+m.group(2));
s = s.replaceAll("href=\"[^\"]*\"", "href=\""+m.group(2)+".html\"");
System.out.println(s);
}
sb.append(s).append("\n");
}
}

bin.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
BufferedWriter bw;
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filepath), "UTF-8"));
try {
bw.write(sb.toString());
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return true;
}else

return false;
}


}


读取存放的html文件并且返回动态链接集合
package com.xinhuanet.news.edman.action;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class ReadFromFile {

/**
* 读取指定的html文件 并且返回动态的链接集合
*/
public static List<String> readFileByChars(String fileName) {
File file = new File(fileName);
Reader reader = null;
List<String > herflist = new ArrayList<String>();
try{
FileReader readerline = new FileReader(file);
BufferedReader br = new BufferedReader(readerline);
String s1 = null;

while((s1 = br.readLine()) != null) {
Pattern p2 = Pattern.compile("=\"([^\"]+)\"");
Matcher m2 = p2.matcher(s1);
while(m2.find()&&s1.contains("jspa?path")){
System.out.println(m2.group(1));
herflist.add(m2.group(1));
break;
}

}
br.close();
readerline.close();

}catch(Exception e){
e.printStackTrace();
}


finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
return herflist;
}

}


在整个静态化过程中最重要的是根据自己的动态链接写出相应的正则表达式
我的正则是我同事帮写的。改改应该可以通用吧。
完成后可以做个压力测试
再写一个小程序,一边访问一边生成静态页面。
我的做过每妙100次访问同时生成。没有影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值