博學(xué)而篤志,好問而近思

          關(guān)于JSP的隱式對象的使用(供初學(xué)者參考)

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

            1.session對象

            2.a(chǎn)pplication對象

            3.request對象

            4.respose對象

            5.out對象

            6.page對象

            7.exception對象

            8.pageContext對象

           1.session對象

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

           2.a(chǎn)pplication對象

            當(dāng)Web服務(wù)器啟動時,Web服務(wù)器會自動創(chuàng)建application對象。Application對象一旦創(chuàng)建,它將一直存在,直到Web服務(wù)器關(guān)閉。因此,application對象可以實(shí)現(xiàn)多客戶間的數(shù)據(jù)共享。

            一個Web服務(wù)器常常有多個發(fā)布目錄,當(dāng)Web服務(wù)器啟動時,它自動為每個發(fā)布目錄都創(chuàng)建一個application對象,這些application對象各自獨(dú)立,而且和發(fā)布目錄一一對應(yīng)。

            application的生命周期:從Web服務(wù)器啟動到Web服務(wù)器關(guān)閉。

            application在生命周期內(nèi)的作用范圍:在同一個發(fā)布目錄A下的所有網(wǎng)頁文件中,都可以對"和發(fā)布目錄A對應(yīng)"的application對象進(jìn)行操作,而且訪問發(fā)布目錄A的所有客戶都共用一個application對象。因此,當(dāng)在該application中存放數(shù)據(jù)信息時,所有訪問該發(fā)布目錄A的客戶都能夠?qū)ζ溥M(jìn)行訪問,實(shí)現(xiàn)了多客戶之間的數(shù)據(jù)共享。?

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

           3.request對象

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

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

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

           4.?respose對象

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

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

            如果傳輸協(xié)議是http.則為javax.servlet.HttpServletResponse.

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

           5.out對象

            out對象用于向客戶端輸出數(shù)據(jù)。

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

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

           6.page對象

            page對象是當(dāng)前JSP頁面本身的一個實(shí)例。它的類型是:java.lang.Object。

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

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

           7.exception對象

            當(dāng)JSP頁面在執(zhí)行過程中發(fā)生例外或錯誤時,會自動產(chǎn)生exception對象。

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

            exception對象的常用方法為:?

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

            void?printStackTrace()
            以標(biāo)準(zhǔn)錯誤輸出流的形式,打印并顯示當(dāng)前exception對象及其執(zhí)行軌跡.

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

           8.pageContext對象

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

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

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

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

          ?二、JSP中的隱藏對象

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

            1.靜態(tài)HTML文件ourform..html

            2.JSP文件:JSPtest.jsp

           1.靜態(tài)HTML文件ourform.html

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

           2.JSP文件:JSPtest.jsp  ?

          Data?You?Posted

            ?你的姓名:?

            ?你的性別:?男

            這個例子的執(zhí)行結(jié)果和前面是一摸一樣的。在以前Servlet分析的基礎(chǔ)上,讀者看懂這個例子應(yīng)該沒什么問題,這里就不對語法做過多分析了。下面我們來分析一下這個例子的幾個特點(diǎn)。

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

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

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

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

            下面是Resin生成的臨時Java文件,是上面的例子轉(zhuǎn)換成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文件實(shí)際上是先被服務(wù)器轉(zhuǎn)化成Servlet文件后才執(zhí)行的。

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


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


          網(wǎng)站導(dǎo)航:
           
          <2006年6月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(14)

          隨筆檔案

          BlogJava的幫助

          朋友的博客

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          快樂工作—享受生活
          主站蜘蛛池模板: 长岭县| 诸城市| 辉南县| 赞皇县| 甘南县| 子长县| 胶州市| 耿马| 北川| 扎囊县| 江西省| 贡嘎县| 新蔡县| 潮州市| 凯里市| 奈曼旗| 乌拉特后旗| 襄汾县| 赤水市| 封开县| 呼伦贝尔市| 桓台县| 伊金霍洛旗| 垫江县| 崇仁县| 射洪县| 莱芜市| 永福县| 娄底市| 应城市| 同江市| 长葛市| 顺平县| 洛隆县| 象山县| 响水县| 德江县| 达日县| 遂宁市| 昌黎县| 莆田市|