posts - 4,comments - 15,trackbacks - 0

          原本的打算是在第二篇介紹JSP的基本語法,逛了一些壇子,這類的文章實在是太多了。就在blogjava里面,都有博友正在推出系列的講座。我一一翻閱過,所以覺得這里應該講一些他們沒有講到的地方。如果您還不了解JSP的語法,并且對這個部分比較關注,您可以去alecwen的博客 看看,那里有alecwen博友有關JSP基本語法&用法的文章,比較簡潔實用。

          選擇什么樣的題材來寫第二篇呢?我在第一篇里面有提到“JSP需要經過轉譯成servlet”,那干脆就在這里講講這個轉譯過程。對于網頁設計人員來說,這個部分的知識比較多余,也不適合沒有程序設計基礎的人看,對于程序設計人員來說,應該可以加深您對JSP&Servlet的理解,最最重要的,我認為有了這個部分的知識,可以方便你進行JSP的相關調試。從我現在的經驗來講,在不借助于大型的IDE的情況下(只為學習目的的話,我是不喜歡用大型IDE的,比如Netbean,Eclipse等等,一是太占資源,偶的本本跑起比較慢:(;二是對于新手往往會在太多的菜單選項里面迷失方向,甚至花很大精力在建立工程、添加\刪除工程文件等等事情上,難以專注于要學習的東西),JSP的調試是比較難的。雖然運行方式非常的簡單,您只需要在瀏覽器地址欄輸入您發布的jsp文件路徑,回車即可測試,但如果JSP包含有錯誤(包括編譯式錯誤&運行時異常),都會輸出一堆看不太懂的調用堆棧。堆棧里面往往會提及xxx.java文件的xxx行,但對于JSP開發來說,看不到這些文件,甚至不知道有這些文件的存在。所以,大多數情況下,JSP里面是不提倡寫太過復雜的java代碼的。

          好了,正式開始研究JSP到Servlet的轉換過程。接著上篇講的例子。在/webapp/hello.jsp(http://localhost:8080/tianlinux/hello.jsp)里邊有如下的代碼:

           

          1<% out.println("Hello, JSP/Servlet"%> 

           

          簡單的,只有一句代碼。我們在初學java的時候,寫一個hello world應該都遠遠不止這點代碼,里面一定有文章。并且,您發現了嗎:第一次訪問hello.jsp,瀏覽器停頓了一下下,才顯示出了"Hello, JSP/Servlet"這句話,后面再次訪問,就不會再停頓了。是的,這正是因為第一次訪問jsp的時候,JSP有個轉譯的過程。這個過程包括以下幾個步驟:

          1、根據jsp文件生成java文件;

          2、調用編譯器對java文件進行編譯;

          3、如果編譯通過,載入JVM運行;

          4、將執行結果返回。

          我們先看第一個步驟。由jsp轉化而成的java文件在什么位置呢?我們在Tomcat的安裝目錄下搜索一下,比如剛才的hello.jap,%tomcat%表示tomcat的安裝目錄,則在如下的路徑%tomcat%\work\Catalina\localhost\tianlinux\org\apache\jsp\找到了hello_jsp.java文件。打開看看。這里我們偏偏題,看看大家一般用什么文本編輯器?不要告訴我說您寫一個簡單的java文件都要用IDE哦,也不要告訴我您還在使用寒磣的notepad哦^_^,我推薦使用notepad++。功能跟UltraEdit基本類似,但UE是付費的(雖然在偉大的祖國,基本上沒有需要真正付費的,但誰知道這種天堂般的日子什么時候會到頭呢?),notepad++是完全免費的,并且加入了sourceforge,遵從GPL,作者是臺灣人侯今吾,侯工可是學法國文學出生的哦~。在臺灣企業工作了2年多,跟很多臺灣籍工程師有所接觸,別的不說,感覺在敬業精神&技術能力上,大陸工程師還是普遍落后于海峽那邊的同胞的,這跟受到的教育&經濟水平是有直接聯系的。扯遠了,反正為了一句話,為了民族xxx產業,為了實現自我xxx,也為了大把的銀子,大家一起努力了~。好了,打開那個hello_jsp.java了嗎?我們看到如下的代碼:

           1package org.apache.jsp;
           2
           3import javax.servlet.*;
           4import javax.servlet.http.*;
           5import javax.servlet.jsp.*;
           6
           7public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
           8    implements org.apache.jasper.runtime.JspSourceDependent {
           9
          10  private static java.util.List _jspx_dependants;
          11
          12  public Object getDependants() {
          13    return _jspx_dependants;
          14  }

          15
          16  public void _jspService(HttpServletRequest request, HttpServletResponse response)
          17        throws java.io.IOException, ServletException {
          18
          19    JspFactory _jspxFactory = null;
          20    PageContext pageContext = null;
          21    HttpSession session = null;
          22    ServletContext application = null;
          23    ServletConfig config = null;
          24    JspWriter out = null;
          25    Object page = this;
          26    JspWriter _jspx_out = null;
          27    PageContext _jspx_page_context = null;
          28
          29
          30    try {
          31      _jspxFactory = JspFactory.getDefaultFactory();
          32      response.setContentType("text/html");
          33      pageContext = _jspxFactory.getPageContext(this, request, response,
          34         nulltrue8192true);
          35      _jspx_page_context = pageContext;
          36      application = pageContext.getServletContext();
          37      config = pageContext.getServletConfig();
          38      session = pageContext.getSession();
          39      out = pageContext.getOut();
          40      _jspx_out = out;
          41
          42 out.println("Hello, JSP/Servlet"); 
          43    }
           catch (Throwable t) {
          44      if (!(t instanceof SkipPageException)){
          45        out = _jspx_out;
          46        if (out != null && out.getBufferSize() != 0)
          47          out.clearBuffer();
          48        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
          49      }

          50    }
           finally {
          51      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
          52    }

          53  }

          54}

          55
          56


          以目前的情況,我們并沒有必要把代碼一句一句的都去搞懂。因為大部分的代碼所有jsp文件轉換出來都是相同,是JSP容器已經設定好的。所以我們只關注其中的部分。

          首先是import語句組。這里import了javax.servlet,注意這個包并不是JDK里面默認包含的包,所以現在如果在cmd里面輸入javac hello_jsp.java(當然要在這個文件的路徑下輸入!)可能會出現下面的畫面

           

          出現了找不到javax.servlet這個包的情況,我的機機上就是這種情況。怎么辦呢?趕緊google一下解決辦法。

          1、在環境變量設置里面找到classpath,然后把%tomcat%/common/lib添加進去。注意Tomcat的版本更新十分頻繁,如果版本不是5.5.12,可能文件名或者路徑稍有不同,請注意變通。還有需要提醒的是,完成環境變量的設置以后,需要重新開啟cmd哦。

          2、運氣好的GGMM現在已經可以正確編譯了吧^_^,但偶不是。目前沒有搞清楚是什么原因,我將/common/lib加入到classpath后仍然找不到servlet等包,所以我采用了笨辦法,將/common/lib下的這三個文件:servlet-api.jar,jsp-api.jar,jasper-runtime.jar都手動加到了classpath里面,就OK了~各位有沒有更好的方法或者知道1不能成功的原因的,還望不吝賜教哦。

          不知道您發現沒有,我在寫這篇博客的時候正在聽林憶蓮的《我坐在這里》,一首很好聽的,快節奏的歌,翻唱自Lene Martin的《Sitting down here》。我喜歡在工作的時候聽歌,這里推薦給大家這兩首:)。

          接著我們會關注的是_jspService這個函數,這個函數源自javax.servlet.Servlet的HttpJSPPage,對于JSP/Servlet創建者,不用重新定義,只需要重載,如果是JSP創建的,那么重載的過程由JSP容器來完成了。這個函數大家可以把它看作是一個callback,由用戶編寫,但由系統來調用。

          最后我們來看看那句在JSP里面的"out.println"在java代碼里面再次出現了。out對實質是JSPWriter的實例,這個對象負責將字符串等等發送到客戶端顯示。

          步驟3&4不屬于本文的范疇,不過我想在將來對這個部分做進一步的解釋,因為我對JVM還蠻有興趣的哦。

          以上就是今天的分享,包括jsp到java文件的轉換&javax包的import方法。希望大家覺得有用。
          PS:有朋友留言在第一篇,要求介紹一些其他的JSP容器,由于這個部分我目前只用過Tomcat,所以將在未來對其他的JSP容器有了使用經驗再向大家介紹。

          posted on 2007-05-31 21:28 tianlinux 閱讀(1166) 評論(4)  編輯  收藏 所屬分類: JSP/Servlet

          FeedBack:
          # re: JSP-Servlet學習筆記(二)——JSP到Servlet
          2007-05-31 22:05 | java夜未眠
          寫的聽好,挺喜歡,加油  回復  更多評論
            
          # re: JSP-Servlet學習筆記(二)——JSP到Servlet
          2007-06-11 19:12 | 凌宇清輝♂毐
          比較細節,提到一些其他講座或者教程沒有提到的東西,這些對實踐來說還是很重要的,贊一個。  回復  更多評論
            
          # re: JSP-Servlet學習筆記(二)——JSP到Servlet
          2009-02-19 23:57 | 飯粒
          很好啊,又懂了一點,我是一個沒有學過JAVA的人。
          謝謝  回復  更多評論
            
          # re: JSP-Servlet學習筆記(二)——JSP到Servlet
          2009-02-20 00:00 | 飯粒
          怎么沒有了呢,我還想再看看呢,真是吊人胃口...
          你寫的很好,我希望還能看你的大作。  回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 北川| 吉安县| 漯河市| 安福县| 乃东县| 鲜城| 临沭县| 贵德县| 莲花县| 新蔡县| 徐闻县| 资阳市| 秦安县| 涿州市| 邢台县| 论坛| 香河县| 鲁甸县| 剑河县| 巴南区| 金门县| 井陉县| 阳春市| 北安市| 自贡市| 尚志市| 凤庆县| 永年县| 衡阳市| 鄯善县| 三穗县| 凤台县| 揭东县| 玉龙| 葫芦岛市| 苍梧县| 金沙县| 扎囊县| 贵阳市| 龙门县| 永川市|