亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

一個在JSP下實現將動態頁面轉為靜態的方案

2024-09-05 00:20:15
字體:
來源:轉載
供稿:網友

  1.前言

  為了能深入淺出的理解這個框架的由來,我們首先來了解一下jsp解析器將我們寫的jsp代碼轉換成的java文件的內容。

  下面是一個jsp文件test.jsp

<%@ page language="java"  contenttype="text/html;charset=gb2312" %>
<%
out.write("<!--文件開始-->");
%>
<html>
<head>
<body>
<%= "輸出"%>
</body>
</head>
</html>

  經過tomcat轉換出的java文件test$jsp.java內容如下:

package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.jasper.runtime.*;
public class test$jsp extends httpjspbase {
    static {
    }
    public testoutredir$jsp( ) {
    }
    private static boolean _jspx_inited = false;
    public final void _jspx_init() throws org.apache.jasper.runtime.jspexception {
    }
    public void _jspservice(httpservletrequest request, httpservletresponse  response)
        throws java.io.ioexception, servletexception {
        jspfactory _jspxfactory = null;
        pagecontext pagecontext = null;
        httpsession session = null;
        servletcontext application = null;
        servletconfig config = null;
        jspwriter out = null;
        object page = this;
        string  _value = null;
        try {
            if (_jspx_inited == false) {
                synchronized (this) {
                    if (_jspx_inited == false) {
                        _jspx_init();
                        _jspx_inited = true;
                    }
                }
            }
            _jspxfactory = jspfactory.getdefaultfactory();
            response.setcontenttype("text/html;charset=gb2312");
            pagecontext = _jspxfactory.getpagecontext(this, request, response,
                            "", true, 8192, true);
            application = pagecontext.getservletcontext();
            config = pagecontext.getservletconfig();
            session = pagecontext.getsession();
            out = pagecontext.getout();
                //為了節省篇幅,我刪除了解釋器添加的注釋
                out.write("/r/n");
//上一句是由于<%@ page language="java"  contenttype="text/html;charset=gb2312" %>后面的換行產生的
                out.write("<!--文件開始-->");
                out.write("/r/n<html>/r/n<head>/r/n<body>/r/n");
                out.print( "輸出" );
                out.write("/r/n</body>/r/n</head>/r/n</html>/r/n");
        } catch (throwable t) {
            if (out != null && out.getbuffersize() != 0)
                out.clearbuffer();
            if (pagecontext != null) pagecontext.handlepageexception(t);
        } finally {
            if (_jspxfactory != null) _jspxfactory.releasepagecontext(pagecontext);
        }
    }
}

  從上面的代碼中可以清晰的看到jsp內建的幾個對象(out、request、response、session、pagecontext、application、config、page)是怎么產生的,懂servlet的朋友一看就能明白。

  下面重點理解一下out對象,它被聲明為jspwriter類型,jspwriter是一個抽象類,在包javax.servlet.jsp中可以找到它的定義。

abstract public class javax.servlet.jsp.jspwriter extends java.io.writer{
       final public static int no_buffer = 0;
       final public static int default_buffer = -1;
       final public static int unbounded_buffer = -2;
       protected int buffersize;
       protected boolean autoflush;
       protected javax.servlet.jsp.jspwriter(int arg1, boolean arg2);
    abstract public void newline() throws ioexception ;
    abstract public void print(boolean arg0) throws ioexception ;
    abstract public void print(char arg0) throws ioexception ;
    abstract public void print(int arg0) throws ioexception ;
    abstract public void print(long arg0) throws ioexception ;
    abstract public void print(float arg0) throws ioexception ;
    abstract public void print(double arg0) throws ioexception ;
    abstract public void print(char<> arg0) throws ioexception ;
    abstract public void print(string arg0) throws ioexception ;
    abstract public void print(object arg0) throws ioexception ;
    abstract public void println() throws ioexception ;
    abstract public void println(boolean arg0) throws ioexception ;
    abstract public void println(char arg0) throws ioexception ;
    abstract public void println(int arg0) throws ioexception ;
    abstract public void println(long arg0) throws ioexception ;
    abstract public void println(float arg0) throws ioexception ;
    abstract public void println(double arg0) throws ioexception ;
    abstract public void println(char<> arg0) throws ioexception ;
    abstract public void println(string arg0) throws ioexception ;
    abtract public void println(object arg0) throws ioexception ;
    abstract public void clear() throws ioexception ;
    abstract public void clearbuffer() throws ioexception ;
    abstract public void flush() throws ioexception ;
    abstract public void close() throws ioexception ;
    public int getbuffersize() ;
    abstract public int getremaining() ;
    public boolean isautoflush() ;
}

  我相信當我寫到這里你可能已經知道我想怎么做了。是的,來個偷天換日,繼承jspwriter類,然后實現其定義的虛函數,然后把out變量替換成你自己實現的類的實例就ok了。

  2.實現替換

  假設:

<%@ page language="java"  contenttype="text/html;charset=gb2312"
import="jwb.util.htmlintofile,jwb.util.tempsinglet,java.io.file"%><%
jspwriter out_bak = out;
string arg1="argument1";
string filepath = "/cache/根據參數生成文件名_" + arg1 + ".html";
//首先判斷文件是否已經存在,如果不存在則執行本頁面,否則跳轉到靜態頁面就ok了
file f = new file(pagecontext.getservletcontext().getrealpath(filepath));
if(f.exists())
{
 out_bak.clear();
 pagecontext.forward(filepath);
 system.out.println("直接轉到靜態頁面");
 return;
}
out = new htmlintofile(pagecontext.getservletcontext().getrealpath(filepath));
out.write("<!--文件開始-->");
%>
<html>
<head>
<body>
<%= "看吧,這就是輸出被重定向到文件的實現,很簡單吧^_^"%>
</body>
</head>
</html>
<%
out.close();//關閉生成的靜態文件
out_bak.clear();
pagecontext.forward(filepath);
system.out.println("執行本頁面后再轉到靜態頁面");
return;
%>

  3.更新問題

  下面就討論一下如何更新生成靜態文件,其實從上面實現中你可以看到,很簡單的就是將生成的靜態文件刪除即可,至于什么時候刪除,要看你的需求了。我能想到的幾種情況如下:

  當用來生成頁面的數據更新時
  如果不需要很提供時時的數據可以定時更新
  永遠不更新

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频一区二区| 国产精品一区=区| 欧美激情18p| 富二代精品短视频| 欧美日本高清一区| 国产深夜精品福利| 9.1国产丝袜在线观看| 国产91热爆ts人妖在线| 1769国产精品| 国产日韩欧美一二三区| 欧洲美女7788成人免费视频| 亚洲视频在线观看免费| 亚洲激情视频在线| 欧美另类在线播放| 97成人精品区在线播放| 日韩av电影在线免费播放| 国产99视频在线观看| 亚洲美女视频网站| 国产精品视频不卡| 国产欧美亚洲视频| 欧美精品手机在线| 成人激情视频免费在线| 精品日韩视频在线观看| 国产欧美最新羞羞视频在线观看| 日韩精品视频在线观看网址| 日韩电视剧免费观看网站| 日韩av日韩在线观看| 亚洲欧美在线免费| 亚洲毛片在线免费观看| 国产福利视频一区| 久久久久北条麻妃免费看| 国产成人综合av| 国产97在线|日韩| 日韩h在线观看| 欧美精品亚州精品| 亚洲一区二区三区四区在线播放| 国产精品黄色影片导航在线观看| 久久精品久久久久久国产 免费| 国产精品高清在线| 国内精品久久久| 亚洲免费伊人电影在线观看av| 久久久国产精品x99av| 国产欧美日韩精品专区| 91精品久久久久久综合乱菊| 久久网福利资源网站| 久久久91精品国产| 97视频在线观看网址| 久久久久久久久久婷婷| 久国内精品在线| 欧美成人一区在线| 国产精品久久久久久影视| 国产精品自产拍高潮在线观看| 亚洲欧美激情在线视频| 国产精品96久久久久久又黄又硬| 久久天天躁狠狠躁夜夜躁2014| 欧美福利小视频| 国产成人精品免费久久久久| 精品免费在线观看| 久久视频国产精品免费视频在线| 精品欧美激情精品一区| 国产精品户外野外| 亚洲午夜未满十八勿入免费观看全集| 在线午夜精品自拍| 亚洲国产精久久久久久久| 色视频www在线播放国产成人| 日韩亚洲成人av在线| 精品高清美女精品国产区| 久久久久久久久久国产精品| 欧美理论片在线观看| 日韩欧美亚洲国产一区| 日韩av色综合| 亚洲黄页网在线观看| 一区二区三区亚洲| 欧美第一淫aaasss性| 91视频国产高清| 亚洲国产日韩欧美在线动漫| 亚洲三级 欧美三级| 欧美激情图片区| 91精品国产91久久久久久吃药| 亚洲视频在线播放| 久久福利视频网| 中文字幕日韩专区| 97视频在线观看成人| 最近2019免费中文字幕视频三| 91精品在线一区| 国产精品久久久久久久美男| 在线播放亚洲激情| 国产精品美女久久久久久免费| 欧美成aaa人片免费看| 国产成人福利网站| 欧美日韩一区二区三区在线免费观看| 国产成人av网址| 国产精品久久激情| 亚洲午夜未满十八勿入免费观看全集| 国产做受69高潮| 亚洲香蕉成视频在线观看| 日韩在线观看高清| 久久人人爽人人爽人人片av高清| 亚洲国产成人精品一区二区| 亚洲欧美一区二区三区四区| 亚洲电影中文字幕| 亲爱的老师9免费观看全集电视剧| 久久久亚洲国产天美传媒修理工| 亚洲在线观看视频网站| 九九视频这里只有精品| 亚洲性无码av在线| 亚洲在线第一页| 97视频在线看| 亚洲欧美制服综合另类| 成人黄色免费在线观看| 国产精品成人播放| 欧美日韩国产综合新一区| 亚洲天堂男人天堂| 亚洲电影在线观看| 性欧美在线看片a免费观看| 一区二区成人精品| xvideos国产精品| 亚洲成人av在线| 国产日韩精品视频| 欧美一乱一性一交一视频| 亚洲欧美日韩网| 久久亚洲国产精品| 亚洲精品色婷婷福利天堂| 国产香蕉精品视频一区二区三区| 欧美激情在线狂野欧美精品| 欧美成人剧情片在线观看| 国产欧美精品va在线观看| 怡红院精品视频| 91亚洲国产成人久久精品网站| 国产成+人+综合+亚洲欧洲| 一区二区三区天堂av| 久久av资源网站| 国产精品久久久久久久电影| 在线视频亚洲欧美| 欧亚精品在线观看| 日韩在线观看免费全集电视剧网站| 日韩三级影视基地| 亚洲激情视频在线播放| 国产精品99久久久久久久久| 日韩久久午夜影院| 久久久久国产精品一区| 国产亚洲综合久久| 国产97在线播放| 日本一区二区三区四区视频| 欧美日韩免费在线| 一本色道久久综合狠狠躁篇怎么玩| 亚洲人成亚洲人成在线观看| 国产亚洲精品久久| 欧美一级成年大片在线观看| 国产亚洲激情视频在线| 成人免费视频网| 亚洲片在线观看| 色偷偷88888欧美精品久久久| 精品中文字幕久久久久久| 欧美美女操人视频| 亚洲人成在线观看| 日韩最新在线视频| 国产精品99久久久久久白浆小说| 国产ts一区二区| 国产精品黄色影片导航在线观看| 成人一区二区电影| 精品网站999www| 亚洲成人性视频| 久久久久成人精品|