`
wt75037
  • 浏览: 10783 次
  • 性别: Icon_minigender_2
  • 来自: 湖南
社区版块
存档分类
最新评论

动态页面静态化

阅读更多
前几天由于公司需要、要求让我写一个类似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 动态页面静态化

    ASP.NET动态页面静态化是一种优化网站性能的技术,它将原本由服务器实时生成的动态网页转换为HTML静态页面,从而减少服务器处理和数据库查询的工作量,加快网页加载速度,提高用户体验。这种技术尤其适用于内容更新...

    ASP.NET 动态页面静态化

    动态页面静态化(Dynamic Page Staticization)是指将动态生成的网页内容转换为静态HTML文件的过程。这一技术广泛应用于提高网站性能、优化SEO(搜索引擎优化)、降低服务器负担等方面。在ASP.NET中实现动态页面静态...

    动态页面静态化汇总--页面静态化方案

    6. **关于网页静态化.zip**: 这个压缩包可能包含了关于静态化过程的更多详细资料,如最佳实践、案例分析等,可以帮助理解并实施静态化策略。 总的来说,动态页面静态化是一个涉及前端、后端以及服务器配置的综合...

    ASP.NET动态页面静态化代码

    ASP.NET动态页面静态化是一种优化网站性能的技术,它将原本由服务器动态生成的HTML页面转换为静态HTML文件,从而减少服务器处理请求的负担,提高页面加载速度,改善用户体验。这在高流量或需要快速响应时间的网站中...

    动态页面静态化技术,c#技术

    动态页面静态化技术,c#技术 动态页面静态化技术,c#技术

    动态页面静态化工具 v3.0.zip

    动态页面静态化工具直接将网页转换成静态,加快网页浏览速度 动态页面静态化工具使用方法 1、点击并添加新的任务 2、然后直接修改循环时间 3、最后直接点击【启动】就行了 动态页面静态化工具截图

    最简单的动态页面静态化的代码C#

    最简单的动态页面静态化的代码C#,输入动态页面的地址,要存放的静态页面的地址,搞定

    asp.net+动态页面静态化数据库版.rar

    总的来说,"asp.net+动态页面静态化数据库版"案例提供了如何在ASP.NET环境中结合数据库实现动态页面静态化的实例。通过学习此案例,开发者可以理解如何提升网站性能,降低服务器负载,并提高用户体验。同时,对于SEO...

    将动态页面静态化的一个程序

    动态页面静态化是一种优化网站性能的技术,它将动态生成的网页转换为静态HTML文件,从而提高页面的加载速度和搜索引擎的友好性。动态页面通常需要服务器端脚本(如JSP、ASP.NET等)来处理请求并生成内容,而静态页面...

    asp.net+动态页面静态化简单示例(入门)

    通过静态化动态页面,我们可以平衡性能和功能的需求。 二、ASP.NET动态页面静态化的实现原理 ASP.NET动态页面静态化主要通过两种方式实现:预渲染(Pre-rendering)和输出缓存(Output Caching)。 1. 预渲染:在...

    动态网页静态化 v11.0.zip

    动态网页静态化软件是一款动态转换静态网页定时HTML生成器,可定时把需要的ASP、.NET、PHP等动态网页自动生成HTML页面。 动态网页静态化软件功能: 可以生成任何网页! 优化软件核心文件,排除软件假死现象! 可以...

    动态网站静态化的实现方法

    动态网站静态化的主要目的是通过将动态生成的网页内容转换成静态页面,从而提高网站访问速度、降低服务器负载,并增强对搜索引擎的友好度。具体来说,该过程涉及以下几个关键步骤: 1. **捕获动态页面内容**:首先...

    动态页面静态化.pdf

    动态页面静态化是一种常见的优化网站性能和提升搜索引擎友好度的技术。在ASP.NET环境中,动态页面(如ASPx)可以通过多种方式转化为静态HTML页面。这里主要介绍两种主流方法,这两种方法都是基于模板转换来实现的。 ...

    动态页面静态化!!!!!!

    动态页面静态化是一种优化网站性能和提升搜索引擎友好度的技术手段。传统的动态网页是通过服务器端脚本(如ASPX)生成的,每次访问时都会执行相应的数据库查询和逻辑处理,生成实时的内容。这种方式对服务器资源消耗...

    动态JSP页面静态化,html输出

    在Web开发领域,动态JSP页面静态化是一种常见的优化策略,其主要目的是提高网站的性能和用户体验。这一过程涉及到将原本由服务器动态生成的JSP页面转换为纯HTML页面,从而减少服务器处理请求的压力,加快页面加载...

    .net页面静态化

    .NET页面静态化是一种提高网站性能和搜索引擎优化(SEO)的技术,它通过将动态网页转换为HTML文件存储在服务器上,从而减少服务器处理时间并减轻数据库负载。这种技术尤其适用于那些内容相对固定、更新频率不高的...

    java JSP页面静态化总结_动态页面变为静态页面以减少访问数据库的次数提高速度.zip

    Java JSP页面静态化是一种常见的优化技术,其主要目的是通过将动态内容转化为静态HTML页面,以减少对数据库的访问次数,提高网站的响应速度和用户体验。以下是对这一主题的详细阐述: 1. **JSP页面静态化原理**: ...

    asp转成静态页面(网页静态化)

    网页静态化是将动态页面转换为静态HTML页面的过程,以提高网站的访问速度和搜索引擎优化(SEO)效果。 在ASP环境中,将动态页面静态化主要涉及以下几个步骤和技术: 1. **内容生成**:首先,需要编写ASP脚本来获取...

    有关Java页面静态化

    Java页面静态化是一种提高Web应用性能的技术,它通过将动态生成的HTML页面转换为静态HTML文件,从而减少了服务器处理请求的负担,加快了用户访问速度。这种技术在高并发、大数据量的网站中尤其重要,因为它能显著...

    c# 页面静态化软件

    C# 页面静态化软件是一种基于C#编程语言开发的应用程序,用于将动态网页转换为静态HTML页面,以提高网站的加载速度和搜索引擎优化(SEO)。动态网页在服务器端执行脚本,每次请求都需要与服务器交互,而静态HTML页面...

Global site tag (gtag.js) - Google Analytics