前几天由于公司需要、要求让我写一个类似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次访问同时生成。没有影响。
分享到:
相关推荐
在ASP.NET中,动态页面静态化主要有两种方式:预编译(Precompilation)和运行时静态化(Runtime Output Caching)。 1. 预编译: 预编译是ASP.NET提供的一种在部署前将所有ASPX页面转换为编译好的DLL文件的过程。...
### ASP.NET 动态页面静态化详解 #### 一、概念理解 动态页面静态化(Dynamic Page Staticization)是指将动态生成的网页内容转换为静态HTML文件的过程。这一技术广泛应用于提高网站性能、优化SEO(搜索引擎优化)...
以下是对动态页面静态化方案的详细解释: 1. **Java与JSP**: Java是一种广泛使用的后端编程语言,JSP(JavaServer Pages)是Java中用于创建动态网页的技术。在传统的JSP应用中,服务器接收到请求后,会解析JSP...
动态页面静态化技术,c#技术 动态页面静态化技术,c#技术
本文将深入探讨ASP.NET动态页面静态化的核心概念、实现方式以及URLRewriter工具的应用。 1. **核心概念**: - **动态页面**:基于ASP.NET的网页通常由服务器端的.NET Framework处理,根据用户请求动态生成HTML。 ...
动态页面静态化工具,其实就是用来实现动态网站的静态化处理,帮助大家定时刷新生成多个静态文件。动态页面静态化工具直接将网页转换成静态,加快网页浏览速度 动态页面静态化工具使用方法 1、点击并添加新的任务...
Java JSP页面静态化是一种常见的优化技术,其主要目的是通过将动态内容转化为静态HTML页面,以减少对数据库的访问次数,提高网站的响应速度和用户体验。以下是对这一主题的详细阐述: 1. **JSP页面静态化原理**: ...
.NET页面静态化是一种提高网站性能和搜索引擎优化(SEO)的技术,它通过将动态网页转换为HTML文件存储在服务器上,从而减少服务器处理时间并减轻数据库负载。这种技术尤其适用于那些内容相对固定、更新频率不高的...
Java页面静态化是一种提高Web应用性能的技术,它通过将动态生成的HTML页面转换为静态HTML文件,从而减少了服务器处理请求的负担,加快了用户访问速度。这种技术在高并发、大数据量的网站中尤其重要,因为它能显著...
在Web开发领域,动态JSP页面静态化是一种常见的优化策略,其主要目的是提高网站的性能和用户体验。这一过程涉及到将原本由服务器动态生成的JSP页面转换为纯HTML页面,从而减少服务器处理请求的压力,加快页面加载...
总的来说,C# 页面静态化软件为开发者提供了一种工具,帮助他们轻松实现动态网站的静态化,以提升网站性能和用户体验。同时,它也是SEO策略的重要组成部分,有助于提升网站在搜索引擎中的排名。对于运营大型动态网站...
在进行页面静态化时,我们还需要考虑一些问题,比如如何处理动态内容(如用户登录状态、个性化推荐)、如何同步静态文件和动态数据、以及如何清理过期的静态文件等。这些问题可以通过设计合理的缓存策略和定时任务来...
最简单的动态页面静态化的代码C#,输入动态页面的地址,要存放的静态页面的地址,搞定
本示例将带你入门ASP.NET中的动态页面静态化。 一、为什么需要动态页面静态化? 在Web开发中,动态页面可以处理复杂的业务逻辑和用户交互,但每次请求都需要服务器执行相关代码,消耗资源。而静态页面则可以直接由...
页面静态化分为全站静态化和部分页面静态化。全站静态化是将整个网站的所有页面都转换为静态HTML文件,用户请求时直接读取这些文件,无需服务器动态生成。部分页面静态化则只对经常访问或对性能要求高的页面进行静态...
本文将深入探讨如何将动态aspx页面静态化,以提升网站性能、降低服务器负载,并提高搜索引擎优化(SEO)的效果。 **一、动态aspx页面的原理** 动态aspx页面基于ASP.NET框架,它允许开发者使用C#、VB.NET等语言编写...
在动态生成静态页面的场景下,可能包含与静态化相关的设置或路由规则。 `binRuntimeError.log`可能是运行时错误日志,它记录了程序执行过程中遇到的问题,有助于调试和优化静态化过程。 `hhftohtml.sln`和`...
在IT行业中,静态化是一种常见的优化网站性能的...利用模板生成静态化页面,既保留了设计的一致性,又实现了数据的动态呈现与静态页面的快速加载之间的平衡。在实际应用中,可以根据网站的具体需求和资源状况灵活运用。
页面静态化分为两种:全静态化和部分静态化。全静态化是将整个网站的所有页面全部转换为HTML文件,服务器接收到请求后直接返回静态HTML,无需执行任何服务器端代码。这种方式能极大地提高网站的加载速度,但更新内容...
PHP页面静态化是一种常见的优化网站性能的技术,它将动态生成的网页内容转化为静态HTML文件,以便浏览器可以直接加载,而无需每次请求时都执行PHP脚本和查询数据库。这样可以显著提高页面加载速度,减轻服务器负担,...