伪静态与纯静态的使用区别

来源:互联网 发布:益盟sb软件公式 编辑:程序博客网 时间:2024/04/29 04:20

 

1、首先说说为什么要静态化。


对于现在的Web Application来说,动态页面是占有绝对高的地位的,正因为有了动态化,才有了现在Web的丰富多彩,但是如同所有别的事实一样,好处往往都是有 代价的。
为了产生出动态的效果,每一次对页面的请求都会要求服务器对页面进行编译或者执行,这些操作都很消耗系统资源。如果这期间还有和数据库的 通讯,那么代价将会更大。
如果一个页面在一定的时间内,其内容没有发生改变,那么就不必为每一次对它的访问进行一次“新”的编译或执行。我们可以 把它在这段没有发生改变的时间内的结果保存到一个静态的页面里面,然后每次访问这个页面时,就用刚才保存的静态页面进行回复。这样便能大大地减少系统资源 的消耗,并且提高对客户的响应速度。而这个过程就称之为页面静态化。

现在所面临的问题就是如何在JSP中将页面的内容保存下来。


在访问JSP页面的时候,服务器会先将JSP文件编译为Servlet文件,然 后对这个Servlet编译、执行,并最终把结果返回给客户端。而我们的任务就是要把这个最终生成的HTML静态页面保留下来,存放在服务器上。
解 决的方法其实很简单。普通的对于JSP的访问,最终的数据流是回写到客户端的,如果我们把它重定向,让它回写到服务器上一个本地的文件,这样就能把JSP 的执行结果保存起来,而这个文件就是我们想要得到的静态化的结果。

好了,说了那么多废话,现在说说具体怎么实现。


看过将JSP编译成的Servlet文件以后,可以知道这个Servlet是通过一 个"JspWriter"类型的对象将数据回写给客户端的,而这个对象正是JSP里面的内置对象"out",现在我们只需要定义一个自己的类,让它继 承"JspWriter"类,覆盖里面的输出相关函数,让数据都输出到一个指定的文件就可以了。

 


例如(省略了部分重载函数):

程序代码

import java.io.*;
import javax.servlet.jsp.*;
public class ConstPageWriter extends JspWriter {
     private PrintWriter pw;
     public ConstPageWriter(String fileName){
         super(JspWriter.DEFAULT_BUFFER, false);
         try{
             pw = new PrintWriter(fileName, "UTF-8");
         }catch(Exception e){
             e.printStackTrace();
         }
     }    
     @Override
     public void print(String arg0) throws IOException {    
         pw.print(arg0);
     }
     ......
     @Override
     public void println() throws IOException {
         pw.println();
     }
     @Override
     public void println(Object arg0) throws IOException {
         pw.println(arg0);
     }
     ......
     @Override
     public void write(char[] arg0, int arg1, int arg2) throws IOException {
         pw.write(arg0, arg1, arg2);
     }
}


然后将需要静态化的页面写成如下形式:

 

程序代码

<%
String fileName = "ConstPageName";   // 生成的静态页面文件名
if (notNeedUpdate){                 // 判断是否需要更新
     response.sendRedirect(fileName);
     return;
}
out = new ConstPageWriter(pageContext.getServletContext().getRealPath(fileName));
%>
<%
     // Build this page,更新页面
%>
<%
out.close();
response.sendRedirect(fileName);
%>

 

 


这样页面静态化基本上就算完成了,余下的操作就是处理何时需要更新。至于何时更新是跟特定的应用程序相关的,这里就不详细分析了。

 

 

2、JSP使用URLRewirte实现url地址伪静态化

在网上找了很多关于URLRewirte的使用,基本都是关于asp的,jsp的相关文档很少,而且大多写的很模糊,看了之后也是不清不楚,而且在 项目中无法使用成功,鉴于此,自己整理了关于URLRewirte的用法.该方法只是实现了url的伪静态化,并不是真正的静态化.

工作环境:Eclipse3.2.2+MyEclipse_5.5.1+Tomcat5.0.28

URLRewirte版本:urlrewrite-2.6.0.jar

前提条件:有一个可以正常使用的web应用项目

 

URLRewirte的用处:

1.满足搜索引擎的要求

2.隐藏技术实现,提高网站的移植性

3.满足美感的要求(个人感觉这个用处太牵强)

 

项目部署

 

1.首先在http://tuckey.org/urlrewirte/下 载urlrewirtefilter

 

2.解压所下载的文件,把urlrewrite-2.6.0.jar复制到项目的WebRoot/WEB-INF/lib/目录下,然后编译

 

3.把urlrewrite.xml复制到项目的WebRoot/WEB-INF/目录下

 

4.在web.xml文件中加入以下:

<!-- 动态地址静态化 -->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
   <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
   <init-param>
    <param-name>logLevel</param-name>
    <param-value>WARN</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>UrlRewriteFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

 

5.需要配置urlrewrite.xml文件来实现url静态化,下面将详细说明

 

 

到这里相关的配置已经完成,下面看如何把动态地址静态化

 

1.普通url静态化

例如:要把http://localhost/prjtest/user/list.jsp转 换成http://localhost/prjtest/user/list.html

这种是最简单的,当一个servlet跳转到list.jsp页面列出user列表时,在urlrewrite.xml中这样配置:

<rule>
<from>^/user/list.html</from>
   <to>/user/list.jsp</to>
</rule>

当请求/user/list.html这个页面时,实际上相当于请求/user/list.jsp页面

在servlet的跳转要这样写:

response.sendRedirect("./user/list.html");

 

2.带参数的url静态化

例如:要把http://localhost/prjtest/user/view.jsp?cid=1&cname=admin转 换成

       http://localhost/prjtest/user/view/1_admin.html

在urlrewrite.xml中这样配置:

<rule>
<from>^/user/view/([0-9]+)_([a-z]+).html$</from>
<to>/user/view.jsp?cid=$1&amp;cname=$2</to>
</rule>

当请求/user/view/1_admin.html这个页面时,实际上相当于请求/user/list.jsp?cid=1& cname=admin页面

在servlet的跳转要这样写(cid,cname为变量):

response.sendRedirect("./user/view/"+ cid +"_"+ cname +".html");

注意:配置文件中用"&amp;"来代替"&"

 

 

【案例2】:

 

   第一步:下载urlrewrite-2.6.0.现在最新版本是3.1的。(http://tuckey.org/urlrewrite/dist/urlrewritefilter-2.6.zip
http://urlrewritefilter.googlecode.com/files/urlrewritefilter-3.1.0.zip把urlrewrite-2.6.0.jar拷到classpath下。
   第二步:在WEB-INF目录下建一个urlrewrite.xml文件。
   第三步:在web.xml中初始化。加上下面的代码:
   <!-- Set URL Rewrite-->
<filter>
  <filter-name>UrlRewriteFilter</filter-name>
  <filter-class>
   org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
  </filter-class>
</filter>
<filter-mapping>
  <filter-name>UrlRewriteFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
    最后我要简单的讲一下常用的两个配置规则.以下就是简单的urlrewrite.xml配置片段。不要习惯Java的命名法把它写成urlRewrite.xml,这样即使你加上
<init-param>
   <param-name>confPath</param-name>
   <param-value>/WEB-INF/urlRewrite.xml</param-value>
</init-param>
  在启动的服务器的时候还是会报错的,因为源码中必须是全小写的(urlrewrite.xml)且只能放到WEB-INF下面。
     <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
        "http://tuckey.org/res/dtds/urlrewrite2.6.dtd">
<urlrewrite>
  <rule>
  <from>^/(/w+)/(/w+)/page_(/d+)/.html$</from>
  <to type="forward">/$1.htm?category=$2&amp;page=$3</to>
</rule>
  <rule>
     <from>^/rss/yahoo/.html$</from>
       <to type="redirect">    [url]http://add.my.yahoo.com/rss? url=http://feed.feedsky.com/W3CSSiteFeed[/url]
      </to>
</rule>
</urlrewrite>
   所有的规则配置都写在这里。第一个常用个规则就是站内的简单重写。
<rule>
  <from></from>
  <to type="forward></to>
</rule>
  <from></from>写上你自己定义的访问地址,<to type="forward></to>就是实际的访问地址。比如我们实际的访问地址是:http://yousite.com/entity.htm ?category=user&page=2.而我们想把它重写为http://yousite.com/entity/uesr/page_2.html。这样看起来比我们实际的要好看的多。我们就应该这样的写:  
<rule>
  <from>^/(/w+)/(/w+)/page_(/d+)/.html$</from>
  <to type="forward">/$1.htm?category=$2&amp;page=$3</to>
</rule>
   简单的介绍一下常用的正规表示式: 
代码 说明 
. 匹配除换行符以外的任意字符 
/w 匹配字母或数字或下划线或汉字 
/s 匹配任意的空白符 
/d 匹配数字 
/b 匹配单词的开始或结束 
^ 匹配字符串的开始 
$ 匹配字符串的结束 

常用的&要用  &amp;来表示。$1,$2代表与你配置正规表达式/(/w+)/(/w+)/相对应的参数。<to type="forward">默认的是 type="forward".
  另一个常用的规则就是连接外部的网站。就要用到。<to type="redirect">
<rule>
     <from>^/rss/yahoo/.html$</from>
       <to type="redirect">    [url]http://add.my.yahoo.com/rss? url=http://feed.feedsky.com/MySiteFeed[/url]
      </to>
</rule>
   我们的网站用到最多的无非就这两种规则。至于正规表达式的写法很多种。希望对有感兴趣的朋友,可以试试。

 

原创粉丝点击