JSP实现页面静态化

  对于现在的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);
%>

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

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>
  1. 需要配置urlrewrite.xml文件来实现url静态化,下面将详细说明
    到这里相关的配置已经完成,下面看如何把动态地址静态化
  2. 普通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");
  1. 带参数的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");

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


» 本文链接:https://blog.java-zone.org/archives/644.html
» 转载请注明来源:Java地带  » 《JSP实现页面静态化》

» 本文章为Java地带整理创作,欢迎转载!转载请注明本文地址,谢谢!
» 部分内容收集整理自网络,如有侵权请联系我删除!

» 订阅本站:https://blog.java-zone.org/feed/

标签: JSP页面静态化, Java静态化

添加新评论