原本的打算是在第二篇介紹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了嗎?我們看到如下的代碼:
1
package org.apache.jsp;
2
3
import javax.servlet.*;
4
import javax.servlet.http.*;
5
import javax.servlet.jsp.*;
6
7
public 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
null, true, 8192, true);
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 閱讀(1162)
評論(4) 編輯 收藏 所屬分類:
JSP/Servlet