`

网站的静态页面生成方案 .

阅读更多

  提升网站性能的方式有很多,例如有效的使用缓存,生成静态页面等等。今天要说的就是生成静态页面的方式。这个也是我近期一直在搞的一个问题,近期在做使用html + servlet做个人网站,为什么是这2个东西呢?

1、直接用servlet是为了保证网站能以最快的速度执行命令..个人总感觉像Struts hibernate spring之类的虽然方便但是效能带来的损耗不太能接收

2、使用html同样是为了保证最快的反应速度,毕竟html 比jsp少了一层服务器执行.速度上要快的多

一、在这里要先说一下什么是页面静态化:


   简单的说,我们如果访问一个链接 http://abc.com/test.do,服务器对应的模块会处理这个请求,转到对应的jsp界面,最后生成我们想要看到的数据。

    这其中的缺点是显而易见的:因为每次请求服务器都会进行处理,如果有太多的高并发请求,那么就会加重应用服务器的压力,弄不好就把服务器 搞down 掉了。那么如何去避免呢?如果我们把对 test.do 请求后的结果保存成一个 html 文件,然后每次用户都去访问 http://abc.com/test.html ,这样应用服务器的压力不就减少了?

那么静态页面从哪里来呢?总不能让我们每个页面都手动处理吧?这里就牵涉到我们要讲解的内容了,静态页面生成方案... 我们需要的是自动的生成静态页面,当用户访问 http://abc.com/test.do,会自动生成 test.html ,然后显示给用户。


二、下面我们在简单介绍一下要想掌握页面静态化方案应该掌握的知识点

1、 基础— URL Rewrite
  什么是 URL Rewrite 呢 ? URL 重写。用一个简单的例子来说明问题:输入网址http://www.abc.com/test.do ,但是实际上访问的却是 http://www.abc.com/test.action,那我们就可以说 URL 被重写了。这项技术应用广泛,有许多开源的工具可以实现这个功能。

2、 基础— Servlet web.xml
   如果你还不知道 web.xml 中一个请求和一个 servlet 是如何匹配到一起的,那么请搜索一下 servlet 的文档。这可不是乱说呀,有很多人就认为 /xyz/*.do 这样的匹配方式能有效。
如果你还不知道怎么编写一个 servlet ,那么请搜索一下如何编写 servlet。这可不是说笑呀,在各种集成工具漫天飞舞的今天,很多人都不会去从零编写一个 servlet了。

三、基本的方案介绍



其中,对于 URL Rewriter的部分,可以使用收费或者开源的工具来实现,如果 url不是特别的复杂,可以考虑在 servlet 中实现,那么就是下面这个样子:?
?

三、实现一个servlet生成html的基本功能,包含了URL 重定向功能。
现在我们来看看一个普通的url分页请求怎么生成静态页面。

  假如现在要显示第一页的数据信息 ,那么通常的链接会是这个样子 : http://abc.com/xx.do?pageNumber=1 。
我们说一下这个最简单的方式,打个比方:当我们访问 http://abc.com/xx_pageNumber_1.shtml 的时候 ,就是在访问 http://abc.com/xx.do?pageNumber=1 。规律就是请求的 action(动作),和参数的名称,参数的值,都用下滑线分开,而且请求的网页的最终后缀是 .shtm 。然后呢?我们需要编写一个servlet,去处理 .shtm 的请求:

<servlet>
   <servlet-name>creatorHtmlServlet</servlet-name>
   <servlet-class>com.jlins.CreatorHtmlServlet</servlet-class>
   <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
   <servlet-name>creatorHtmlServlet</servlet-name>
   <url-pattern>*.shtm</url-pattern>
</servlet-mapping>

下面就是 servlet 的内容了:

import javax.servlet.http.*;
import java.io.*;
import org.apache.log4j.*;
import javax.servlet.*;
public class CreatorHtmlServlet extends HttpServlet { 
    private Logger logger=Logger.getLogger(CreatorHtmlServlet.class);  
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
           throws ServletException, IOException {
             doPost(request, response);  
    }  
   public void doPost(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException, IOException {   
             String encoding = "UTF-8"; 
           //获得请求address 
             String templatePath = URLReWrite(request); 
           //获得相对路径 
           String realPath= request.getSession().getServletContext().getRealPath("/"); 
          //获得要生成的静态html文件的名字 
           String htmlName = getHtmlFileName(request); 
          //获得详细路径的 html文件的名字
           String cachhtmlFileName = realPath + File.separator + htmlName; 
             File cacheFile = new File(cachhtmlFileName); 
             boolean load = true;  
          
          //文件存在的话就可以直接返回了,不需要做任何处理 
          if(cacheFile.exists()) {
              load = false;  
            } 
          if(load) {
               final ByteArrayOutputStream os = new ByteArrayOutputStream(); 
               final ServletOutputStream stream = new ServletOutputStream(){
                  public void write(byte[] data,int offset, int length){
                          os.write(data,   offset,   length); 
                      } 
                  public void write(int b) throws IOException{ 
                         os.write(b);
                      } 
                   };  
              final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, encoding)); 
              HttpServletResponse rep =  new HttpServletResponseWrapper(response){
                  public ServletOutputStream getOutputStream() { 
                       return stream; 
                   } 
                  public PrintWriter getWriter() {  
                        return pw;  
                  } 
                };  
              logger.debug("HtmlCreatorServlet RequestDispatcher = " + templatePath);  
 
              //  使用 RequestDispatcher转发请求,请求真是的地址   
              //  例如 index.shtm ,则转发到 index.do     
             RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(templatePath);
             dispatcher.include(request, rep); 
               pw.flush(); 
               FileOutputStream fos = null; 
               try { 
                     if(os.size() == 0) { 
                       // 验证一下用户转发的地址是否有效,无效的话就提示错误  
                       response.sendError(HttpServletResponse.SC_NOT_FOUND, ""); 
                     }  
                    else { 
                  // servlet调用其他命令在相应的目录生成html文件,并且把文件返回给客户端 
                  fos = new FileOutputStream(cachhtmlFileName); 
                  os.writeTo(fos); 
                  dispatcher = getServletContext(). getRequestDispatcher("/"+htmlName); 
                        dispatcher.include(request, response); 
                  }  
               } finally {  
                   if(fos != null) { 
                      fos.close(); 
                   }  
               } 
 
         } else {  
                 RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/"+htmlName);  
                dispatcher.include(request, response); 
        }  
    } 
     // 主要的功能就是把http://abc.com/xx_pageNumber_1.shtm 
     // 转换成 http://abc.com/xx.do?pageNumber=1  形式 
     protected String URLReWrite(HttpServletRequest request) throws ServletException, IOException { 
               String uri = request.getRequestURI();
               String contextPath = request.getContextPath(); 
               logger.debug("HtmlCreator contextPath = " + contextPath); 
               if (contextPath != null && contextPath.length() > 0) 
                   uri = uri.substring(contextPath.length()); 
                   uri = uri.substring(0, uri.length()-5); 
                   String[] urls = uri.split("_"); 
                   uri = urls[0] + ".do"; 
                   if(urls.length > 1) {  
                     for(int i = 1; i < urls.length; i += 2) { 
                      if(i==1) {
                          uri += "?" + urls[i] + "=" + urls[i+1];
                      } else {  
                       uri += "&" + urls[i] + "=" + urls[i+1]; 
                      }  
                 }  
               }   
              logger.debug("HtmlCreatorServlet get uri = " + uri); 
                return uri; 
          }  
   // 主要功能根据 http://abc.com/xx_pageNumber_1.shtm  
   // 来得到即将要生成的html文件名字,也就是 xx_pageNumber_1.html 
   private String getHtmlFileName(HttpServletRequest request)
             throws ServletException, IOException{
              String uri = request.getRequestURI(); 
              String contextPath = request.getContextPath(); 
              if (contextPath != null && contextPath.length() > 0) 
              uri = uri.substring(contextPath.length()); 
                 uri = uri.substring(1, uri.length()-5);  
             uri += ".html"; 
              return uri;    
   } 
 }

 

上面就是整个代码了,非常的简单吧

我们这章要讨论一下如何让用户遵守访问方式和如何更新生成的html文件

四、如何让用户遵守访问方式
  前面我们已经通过代码讲解,用户访问 xx_pageNumber_1.shtm,那么我们可以直接返回已经存在的html文件给用户,大大的减轻应用服务器的压力。可是如果客户直接访问 xx.do?pageNumber=1 呢?浏览器是客户的,如果他们要想恶意的请求你的网站你是没有办法控制的,难道我们要在页面上告诉访问者“请遵守访问方式,否则您将被如何如何”吗?

  针对上面这种情况,我们需要在 index.do 中做点手脚。简单的说就是在我们自己转发请求的时候设置一个变量告诉被请求的地址我们是合法的,例如:xx.do?pageNumber=1后面追加一个 &my=true,这样的话就可以在被请求的action中检测是否有my这个变量,如果有说明合法,该怎么操作都行,如果没有就是违法的,直接跳转到错误页面。这样就能用最简单的方式控制用户的非法请求了.


接着我们讲解一下如何刷新这些html

  因为是一次性的生成Html,如果对应的数据发生变化,比如update或者delete情况,我们就应该更新相应的html文件,那如何对html文件进行更新呢?

大体上有几个方式

1、最笨的方式,手动刷新.
例如:网站首页,当管理员更新一个功能之后,手动点击后台的一个按钮直接更新对应的html文件

2、定时刷新。
每隔一段指定的时间去更新所有已经存在的html文件,当然前提是你要先验证哪些已经生成了html文件.至于怎么验证?你可以在每生成一个文件的时候往内存的某个list或者某个文件,或者某个表写入当前生成的文件名..

3、智能刷新
先说一下,这个不好做,但是做好了很牛方便。
管理员在后台的每个操作 增删改查,都进行监听,并在操作完成后去验证一下对应的文件是否存在,存在就更新,不存在就不操作. (要想实现这种方式,在进行框架设计的时候就要把这一模块考虑好,让后台的每一步操作都实现一个已经公共的被观察的对象.--可以查考一下观察者模式)

分享到:
评论

相关推荐

    易语言网站静态生成器源码.rar

    该压缩包中的核心文件“网站静态生成器.e”是易语言编译后的执行文件,它实现了将动态网站内容转化为静态HTML页面的功能。动态网站通常依赖服务器端脚本处理请求,而静态网站则直接提供预生成的HTML文件,无需数据库...

    网站生成静态页面的方案和工具

    在本篇文章中,我们将探讨几种主流的静态页面生成方案和工具,并详细介绍FreeMarker模板引擎在其中的应用。 一、静态页面生成的优势 1. 提升性能:静态页面直接由服务器发送,无需执行服务器端脚本,减少了服务器...

    java解决网站静态页面生成方案(源码)

    在这个特定的场景中,"java解决网站静态页面生成方案(源码)" 提供了一个利用Java实现的解决方案,旨在提高网站性能和用户体验。静态页面通常加载更快,对搜索引擎友好,且在高并发访问时能更好地处理负载。 生成...

    生成静态页面技术解决方案

    生成静态页面技术解决方案是指通过某种技术手段将动态网页转换为静态网页,从而提高网站的访问速度和减少服务器的负载量。本文将对生成静态页面技术解决方案进行详细的介绍。 生成静态页面技术解决方案的优点: 1....

    JavaScript_极简主义的静态站点生成器.zip

    JavaScript_极简主义的静态站点生成器.zip这个压缩包很可能包含了一套基于JavaScript的静态站点生成工具,如VuePress,它能够帮助开发者快速地创建和部署静态网页。 VuePress是一个由Vue.js驱动的静态站点生成器,...

    静态页面生成方案

    在现代网站开发中,静态页面生成方案是一种常见的优化策略,用于提高网站性能和减少服务器负担。本文将深入探讨静态页面生成的概念、原理及其实现方法,帮助读者理解其背后的逻辑和技术细节。 #### 一、何为静态...

    企业网站管理系统(支持静态生成).

    这款系统的核心特点在于支持静态页面生成,这是一个关键的技术特性,对提升网站性能和SEO优化具有显著作用。 1. **企业网站管理**:企业网站管理系统是企业进行线上业务展示、宣传和运营的重要平台。它包括内容管理...

    c#生成静态页(中小型网站模板技术(生成静态页)示例)

    功能:中小型网站模板技术(生成静态页)示例; 实现了主明细表; 实现了全局标签; 实现了简单的Repeat控件; 类型:免费开源; 网站文件: Index.aspx : 首页 (同时处理生成静态页逻辑) Static.htm : 静态模板...

    静态页面生成系统

    总的来说,"静态页面生成系统"是一种提升Web性能的技术,而"xiaokongzi_51aspx"可能是一个基于C#和ASP.NET实现的解决方案,提供了快速部署和定制的可能性。通过理解和利用这个系统,开发者可以为他们的网站带来更快...

    ASP.NET源码——利用handler生成静态页面的完整解决方案.zip

    在这个"ASP.NET源码——利用handler生成静态页面的完整解决方案.zip"压缩包中,我们可以看到一个利用ASP.NET Handler(HttpHandler)来生成静态HTML页面的实践案例。 Handler在ASP.NET中扮演着处理特定HTTP请求的...

    kakyll,Kotlin的静态站点生成器.zip

    Kakyll,一个基于Kotlin的静态站点生成器,是开发人员用来构建高效、自托管且易于维护的网站的工具。它借鉴了其他知名项目,如Hakyll(用Haskell编写)和Jekyll(用Ruby编写),但采用现代编程语言Kotlin进行实现,...

    生成静态页面的完整解决方案程序源码.rar

    标题中的“生成静态页面的完整解决方案程序源码”正是针对这一需求,提供了一种将动态网站转换为静态HTML的工具。 该压缩包包含的资源可能是一个基于ASP(Active Server Pages)的软件,它能够帮助开发者或者网站...

    CMS生成静态网页简单原理

    ### CMS生成静态网页简单原理深度解析 在当前的互联网时代,内容管理系统(Content Management System,简称CMS)成为构建网站的...因此,在选择是否采用静态网页生成方案时,还需要综合考虑网站的具体需求和业务特点。

    通用静态页面生成系统

    总的来说,通用静态页面生成系统结合了参数化数据获取、JSP分页技术,旨在提供一个高效、可定制的解决方案,以生成静态网页,提升网站性能。无论是开发还是运维,都能从中获益,实现更优质的网站管理和用户体验。

    通用静态页面生成系统(Engineer) v.1

    《通用静态页面生成系统(Engineer) v.1》是一款高效能、低成本的网页生成工具,旨在优化企业网站性能,减轻服务器压力,从而降低企业运营成本。Engineer系统的核心功能在于将动态内容转换为静态HTML页面,使得用户...

    织梦伪静态地图xml1.0.zip

    总的来说,"织梦伪静态地图xml1.0.zip" 提供了一套完整的解决方案,旨在帮助织梦用户优化网站的SEO性能,通过伪静态URL和XML网站地图,提高搜索引擎对网站的友好度,进而提升网站的在线可见性和排名。用户在使用这个...

    动态页面生成静态页面实例

    动态页面生成静态页面是一种常见的网站优化技术,它将原本由服务器动态生成的HTML内容转换为预先编译好的静态HTML文件,以提高网站的访问速度和搜索引擎优化(SEO)。本实例将探讨这一技术,并通过提供的文件列表来...

    生成静态文件..

    综上所述,生成静态文件是ASP.NET中一种重要的性能优化策略,通过自定义的解决方案,可以定时定量地生成这些文件,从而提高网站的加载速度,减轻服务器压力,并提升SEO效果。在实际操作中,需要根据具体需求调整生成...

Global site tag (gtag.js) - Google Analytics