<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    博學而篤志,好問而近思

    關于JSP的隱式對象的使用(供初學者參考)

    ?一、JSP中的隱藏對象????????
    ??????? 由于JSP是嵌入式的語言,不能顯式的把一些必須的參數傳遞進來,比如Request對象,Response對象等,所以在JSP規范中提供了幾個隱含的對象來實現折椅功能。所謂隱含的對象,就是大家約定好使用一個名字來指代某個特定的對象,在編寫JSP的時候不用顯式的聲明就能使用,由JSP引擎負責在解釋的時候把隱含對象加入到解釋完的.java文件中。常用的隱含對象有application,?session,?request,?response,?out,?page,?exception,?pageContext

      1.session對象

      2.application對象

      3.request對象

      4.respose對象

      5.out對象

      6.page對象

      7.exception對象

      8.pageContext對象

     1.session對象

      前面在Servlet部分已經提到,過當客戶第一次訪問Web服務器發布目錄(一個Web服務器有一個或多個"發布目錄")下的網頁文件時,Web服務器會自動創建一個session對象,并為其分配唯一的ID號,客戶可以將其需要的一些信息保存到該session對象,以便需要時使用。session對象就是指通過getSession法辦法得到的對象,在JSP中是隱含對象,關于session對象的使用讀者可以參見Servlet?API

     2.application對象

      當Web服務器啟動時,Web服務器會自動創建application對象。Application對象一旦創建,它將一直存在,直到Web服務器關閉。因此,application對象可以實現多客戶間的數據共享。

      一個Web服務器常常有多個發布目錄,當Web服務器啟動時,它自動為每個發布目錄都創建一個application對象,這些application對象各自獨立,而且和發布目錄一一對應。

      application的生命周期:從Web服務器啟動到Web服務器關閉。

      application在生命周期內的作用范圍:在同一個發布目錄A下的所有網頁文件中,都可以對"和發布目錄A對應"的application對象進行操作,而且訪問發布目錄A的所有客戶都共用一個application對象。因此,當在該application中存放數據信息時,所有訪問該發布目錄A的客戶都能夠對其進行訪問,實現了多客戶之間的數據共享。?

      application對象的基類是:javax.servlet.ServletContext類。可以用該類中的getServletContext()方法取得application。具體的使用方法參見Servlet?API。

     3.request對象

      request對象主要用于取得客戶在表單中提交的數據信息及多個網頁之間數據信息傳遞等。同時通過它也可以取得Web服務器的參數。跟Servlet參數中的Request對象是相對應的。

      request對象的基類為:javax.servlet.ServletRequest?

      如果傳輸協議是http,則是javax.servlet.HttpServletRequest
      
      具體的使用方法參見Servlet?API。

     4.?respose對象

      respose對象主要用于向客戶端輸出信息,響應客戶端的請求。跟Servlet參數中的Response對象是相對應的。

      respose對象的基類是:javax.servlet.ServletResponse

      如果傳輸協議是http.則為javax.servlet.HttpServletResponse.

      具體的使用方法參見Servlet?API。

     5.out對象

      out對象用于向客戶端輸出數據。

      out對象基類是:javax.servlet.JspWriter類,跟Servlet中由HttpServletResponse得到的PrintWriter略有不同,但是都是從
    Writer繼承而來,所以基本上還是一樣的。

      具體的使用方法參見Servlet?API。

     6.page對象

      page對象是當前JSP頁面本身的一個實例。它的類型是:java.lang.Object。

      其方法就是Object類中的方法。如:Class?getClass()返回一個對象在運行時所對應的類的表示,從而可以得到相應的信息。String?toString()返回當前對象的字符串表示。page對象在當前頁面中可以用this代替。

      具體的使用方法參見Java?2?API。

     7.exception對象

      當JSP頁面在執行過程中發生例外或錯誤時,會自動產生exception對象。

      在當前頁面用設置后,就可以使用該exception對象,來查找頁面出錯信息。
      exception對象的類型是:java.lang.Exception類.

      exception對象的常用方法為:?

      String?getMessage()?
      返回頁面的出錯信息,如果沒有則返回null?

      void?printStackTrace()
      以標準錯誤輸出流的形式,打印并顯示當前exception對象及其執行軌跡.

      具體的使用方法參見Java?2?API。

     8.pageContext對象

      pageContext對象相當于當前頁面的容器,可以訪問當前頁面的所有對象。
      pageContext對象的基類是:javax.servlet.jsp.PageContext類。
      pageContext對象的常用方法:
      HttpSession?getSession()?取得當前頁面的session對象。
      ServletRequest?getRequest()?取得當前頁面的request對象。
      ServletResponse?getResponse()?取得當前頁面的response對象。
      ServletContext?getServletContext()?取得當前頁面的application對象。
      ServletConfig?getServletConfig()?取得當前頁面的config對象。
      Object?getPage()?取得當前頁面的page對象。
      JspWriter?getOut()?取得當前頁面的out對象。
      Exception?getException()?取得當前頁面的exception對象。
      void?setAttribute(String?variabelName,?Object?objectName)?
      將對象objectName保存到pageContext中。
      Object?getAttribute(String?variableName)

      取得pageContext對象中保存的數據。如果參數variableName在當前session中不存在,則返回null.
      void?removeAttribute(String?variableName)

      刪除pageContext中指定名字variableName的對象。如果該對象名不存在,則不執行任何操作。

      具體的使用方法參見Servlet?API。
    ?

    ?二、JSP中的隱藏對象

      下面舉一個簡單例子來說明JSP的基本的編寫方法,具體的應用技巧還需要讀者到實踐中去體會。這個例子就是用JSP來實現我們在講解Servlet的時候給出的從表單獲取數據并打印到客戶客戶端的例子,原來的例子中用到的靜態HTML文件,只需把form的action改成我們新的響應文件JSPtest.jsp即可,讀者主要查看JSP文件和原來的Java文件的區別。

      1.靜態HTML文件ourform..html

      2.JSP文件:JSPtest.jsp

     1.靜態HTML文件ourform.html

    Our?Form  ?
        ??
      你的姓名:?
          ???    ??
      你的性別:男?    ??

     2.JSP文件:JSPtest.jsp  ?

    Data?You?Posted

      ?你的姓名:?

      ?你的性別:?男

      這個例子的執行結果和前面是一摸一樣的。在以前Servlet分析的基礎上,讀者看懂這個例子應該沒什么問題,這里就不對語法做過多分析了。下面我們來分析一下這個例子的幾個特點。

      首先最明顯的一點就是,使用JSP之后文件變得更短,格式更清晰了,這也是要使用JSP的一個最主要的原因,使用Servlet來打印大量的HTML語句是很費事的,而JSP的主體是HTML,嵌入的Java語句只負責動態效果,所以使用比Servlet方便的多。在下面我們會分析如何使Servlet和JSP互相配合,取長補短,獲得更好的應用效果。

      另外一個就是JSP使用的時候不需要單獨配置每一個文件,只要是擴展名為jsp,JSP引擎會自動識別。而Servlet是必須進行配置后才能投入使用的,這也是處于安全性的考慮,直接訪問.class文件是不允許的,因為不能保證它是一個合法的Servlet。而JSP是沒有經過編譯的文本,即使是編譯成了Servlet,也肯定是符合Servlet規范的,盡管可能不符合HTML語法,所以它是安全的。

      還有就是中文問題在這里的到了簡化,本地的中文字符串不需要編碼轉換就能夠正常在客戶端顯示。這里關鍵的一點是在頭部設置頁屬性,其中charset=gb2312就是告訴JSP引擎本地編碼是gb2312,然后JSP引擎就會自動進行轉換,不需要手工轉了。但是,并不是說就這么一勞永逸了,中文問題在JSP頁面之間傳參的時候還是存在的,讀者只要掌握了編碼的轉換方式,應付任何中文問題就是轉來轉去的問題,因此讀者應該從根本上理解中文問題,這才是一勞永逸的辦法。

      這時候如果我們把靜態頁面的GET改成POST會是什么后果呢?我們會發現,不象HttpServlet,這個JSP還是能夠正常工作的,這是因為JSP的實現在最低層是Servlet,但跟HttpServlet又是有所區別的,所以它不存在客戶端請求的分類問題,它只有一個_jspService(HttpServletRequest?request,?HttpServletResponse?response)方法由JSP引擎實現,所以寫JSP不必象Servlet那樣關心那么多雜碎的事情。

      下面是Resin生成的臨時Java文件,是上面的例子轉換成Servlet之后的樣子,有興趣的讀者可以讀一下,如果真正讀通懂了,一定會受益匪淺的。

      //?Resin(tm)?generated?JSP
      package?_jsp;
      import?java.io.*;
      import?javax.servlet.*;
      import?javax.servlet.jsp.*;
      import?javax.servlet.jsp.tagext.*;
      import?javax.servlet.http.*;

      public?class?_JSPtest__jsp?extends?com.caucho.jsp.JavaPage{
        
        public?void
        _jspService(javax.servlet.http.HttpServletRequest?request,
            javax.servlet.http.HttpServletResponse?response)
         throws?IOException,?javax.servlet.ServletException
        {
         javax.servlet.jsp.PageContext?pageContext?=?com.caucho.jsp.QJspFactory.create().getPageContext(this,?request,?response,?null,?true,?8192,?true);
         javax.servlet.jsp.JspWriter?out?=?(javax.servlet.jsp.JspWriter)?pageContext.getOut();
         com.caucho.jsp.ByteWriteStream?_jsp_raw_out;
         _jsp_raw_out?=?(com.caucho.jsp.ByteWriteStream)?out;
         javax.servlet.ServletConfig?config?=?getServletConfig();
         javax.servlet.Servlet?page?=?this;
         javax.servlet.http.HttpSession?session?=?pageContext.getSession();
         javax.servlet.ServletContext?application?=?pageContext.getServletContext();
      try?{
         _jsp_raw_out.write(_jsp_string0,?0,?_jsp_string0.length);

         String?name?=?request.getParameter("Name");
         String?sex?=?request.getParameter("Sex");
         _jsp_raw_out.write(_jsp_string1,?0,?_jsp_string1.length);
           out.print((name));
           _jsp_raw_out.write(_jsp_string2,?0,?_jsp_string2.length);
            if(sex.equals("1"))?out.print("男");
            else?out.print("女");_jsp_raw_out.write(_jsp_string3,?0,?_jsp_string3.length);
        }?catch?(Exception?e)?{
         pageContext.handlePageException(e);
        }?finally?{
          JspFactory.getDefaultFactory().releasePageContext(pageContext);
        }
      }

      private?java.util.ArrayList?_caucho_depends;
      private?java.util.ArrayList?_caucho_cache;
      private?com.caucho.java.LineMap?_caucho_line_map;

      public?boolean?_caucho_isModified()
      {
       if?(com.caucho.util.CauchoSystem.getVersionId()?!=?-1983231406)
        return?true;
       for?(int?i?=?0;?i?<?_caucho_depends.size();?i++)?{
        com.caucho.jsp.Depend?depend;
        depend?=?(com.caucho.jsp.Depend)?_caucho_depends.get(i);
        if?(depend.isModified())
          return?true;
      }
      return?false;
      }

      public?long?_caucho_lastModified()
      {
       return?0;
      }

      public?com.caucho.java.LineMap?_caucho_getLineMap()
      {
       return?_caucho_line_map;
      }

      public?void?_caucho_init(HttpServletRequest?req,?HttpServletResponse?res)
      {
       res.setContentType("text/html;?charset=GB2312");
      }

      public?void?init(ServletConfig?config,
          com.caucho.java.LineMap?lineMap,
          com.caucho.vfs.Path?pwd)
      throws?ServletException
      {
       super.init(config);
       _caucho_line_map?=?new?com.caucho.java.LineMap("_JSPtest__jsp.java",?"/JSPtest.jsp");
       _caucho_line_map.add(1,?1);
       _caucho_line_map.add(1,?28);
       _caucho_line_map.add(9,?29);
       _caucho_line_map.add(16,?33);
       _caucho_line_map.add(20,?35);
       _caucho_depends?=?new?java.util.ArrayList();
       _caucho_depends.add(new?com.caucho.jsp.Depend(pwd.lookup("/D:/gzf@WeiHai/Resin/doc/JSPtest.jsp"),?
       996991110000L));
      }

      private?static?byte?[]_jsp_string0;
      private?static?byte?[]_jsp_string1;
      private?static?byte?[]_jsp_string2;
      private?static?byte?[]_jsp_string3;
      static?{
      ? try?{
          _jsp_string0?=?"\r\n\r\n\r\n?\r\n\r\n\r\n\r\n?

    Data?You?Posted
    \r\n".getBytes("GB2312");
          _jsp_string1?=?"\r\n?\r\n??\r\n??你的姓名:?\r\n??".getBytes("GB2312");
          _jsp_string2?=?"?\r\n?
    \r\n??\r\n??你的性別:?\r\n??".getBytes("GB2312");
          _jsp_string3?=?"?\r\n?
    \r\n?\r\n\r\n\r\n".getBytes("GB2312");
        }?catch?(UnsupportedEncodingException?e)?{
         e.printStackTrace();
        }
      }
    }

    注意:JSP文件實際上是先被服務器轉化成Servlet文件后才執行的。

    posted on 2006-06-27 09:52 冰川 閱讀(1080) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2006年6月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    導航

    統計

    常用鏈接

    留言簿(14)

    隨筆檔案

    BlogJava的幫助

    朋友的博客

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    快樂工作—享受生活
    主站蜘蛛池模板: 亚洲乱亚洲乱淫久久| 一个人免费观看在线视频www | 亚洲色成人WWW永久在线观看 | 国产美女被遭强高潮免费网站| 亚洲午夜精品一区二区麻豆| 无人在线观看免费高清视频| 亚洲精品国产精品国自产网站| 久久久高清免费视频| 亚洲伊人久久大香线焦| 在线观看免费高清视频| 亚洲国产最大av| 午夜私人影院免费体验区| 亚洲精品宾馆在线精品酒店| 精品国产精品久久一区免费式| 亚洲Av无码国产一区二区| 免费大黄网站在线观| 国产伦精品一区二区免费| 亚洲老妈激情一区二区三区| 香蕉成人免费看片视频app下载| 4444亚洲国产成人精品| 97人妻无码一区二区精品免费| 亚洲精品综合在线影院| 天堂亚洲免费视频| a级黄色毛片免费播放视频| 亚洲天天在线日亚洲洲精| 18勿入网站免费永久| 亚洲AV无码一区二区三区电影| 亚洲成A人片在线观看无码3D| 国产在线精品免费aaa片| 亚洲人成伊人成综合网久久| 四虎影视精品永久免费网站| 黄色网址免费在线观看| 亚洲va在线va天堂va手机| 亚洲精品国产高清嫩草影院| 一区二区三区观看免费中文视频在线播放| 亚洲最新黄色网址| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲国产一级在线观看| 香港a毛片免费观看 | 免免费国产AAAAA片| 四虎成人精品国产永久免费无码|