隨筆-3  評論-26  文章-41  trackbacks-0

          1.前言

          為了能深入淺出的理解這個框架的由來,我們首先來了解一下 JSP 解析器將我們寫的 JSP 代碼轉(zhuǎn)換成的 JAVA 文件的內(nèi)容。

          下面是一個 JSP 文件 test.jsp

          <%@ page language="java"? contentType="text/html;charset=GB2312" %>

          <%

          out.write("<!-- 文件開始 -->");

          %>

          <html>

          <head>

          <body>

          <%= " 輸出 "%>

          </body>

          </head>

          </html>

          經(jīng)過 TOMCAT 轉(zhuǎn)換出的 JAVA 文件 test$jsp.java 內(nèi)容如下:

          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();

          ??????????????? // 為了節(jié)省篇幅,我刪除了解釋器添加的注釋

          ??????????????? out.write("\r\n");

          // 上一句是由于 <%@ page language="java"? contentType="text/html;charset=GB2312" %> 后面的換行產(chǎn)生的

          ??????????????? 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 內(nèi)建的幾個對象( out request response session pageContext application config page )是怎么產(chǎn)生的,懂 servlet 的朋友一看就能明白。

          下面重點(diǎn)理解一下 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() ;

          }

          我相信當(dāng)我寫到這里你可能已經(jīng)知道我想怎么做了。是的,來個偷天換日,繼承 JspWriter 類,然后實(shí)現(xiàn)其定義的虛函數(shù),然后把 out 變量替換成你自己實(shí)現(xiàn)的類的實(shí)例就 ok 了。

          2.實(shí)現(xiàn)替換

          假設(shè)

          <%@ 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/根據(jù)參數(shù)生成文件名_" + arg1 + ".html";
          //首先判斷文件是否已經(jīng)存在,如果不存在則執(zhí)行本頁面,否則跳轉(zhuǎn)到靜態(tài)頁面就OK了
          File f = new File(pageContext.getServletContext().getRealPath(filePath));
          if(f.exists())
          {?
          ? out_bak.clear();?
          ? pageContext.forward(filePath);?
          ? System.out.println("直接轉(zhuǎn)到靜態(tài)頁面");?
          ? return;
          }
          out = new HtmlIntoFile(pageContext.getServletContext().getRealPath(filePath));
          out.write("<!--文件開始-->");

          %>
          <html>
          <head>
          <body>
          <%= "看吧,這就是輸出被重定向到文件的實(shí)現(xiàn),很簡單吧^_^"%>
          </body>
          </head>
          </html>
          <%
          ??out.close();//關(guān)閉生成的靜態(tài)文件
          ? out_bak.clear();
          ? pageContext.forward(filePath);

          ? System.out.println("執(zhí)行本頁面后再轉(zhuǎn)到靜態(tài)頁面");
          ? return;
          %>

          3.更新問題

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

          • 當(dāng)用來生成頁面的數(shù)據(jù)更新時
          • 如果不需要很提供時時的數(shù)據(jù)可以定時更新
          • 永遠(yuǎn)不更新

          待更新……

          code source:http://www.zahui.com/html/6/11558.htm

          posted on 2006-06-22 10:26 百年 閱讀(213) 評論(0)  編輯  收藏 所屬分類: Jsp Article
          主站蜘蛛池模板: 门头沟区| 保德县| 汝州市| 凤翔县| 湘乡市| 建昌县| 灌阳县| 苏州市| 会同县| 九龙坡区| 崇礼县| 江源县| 新津县| 石首市| 丰原市| 隆林| 古交市| 灵寿县| 韩城市| 卫辉市| 法库县| 鲜城| 巴楚县| 连州市| 舞钢市| 德令哈市| 大足县| 荃湾区| 庆城县| 夏邑县| 阿坝| 北票市| 青阳县| 伽师县| 平和县| 洛阳市| 得荣县| 新邵县| 稻城县| 慈利县| 大邑县|