一、 什么是jsp
jsp(javaserver pages)是由sun microsystems公司倡導、許多公司參與一起建立的一種 動態網頁技術標準,其網址為http://www.javasoft.com/products/jsp。 在傳統的網頁html文件(*htm,*.html)中加入java程序片段(scriptlet)和jsp標記(tag),就構成了jsp網頁(*.jsp)。web服務器在遇到訪問jsp網頁的請求時,首先執行其中的程序片段,然后將執行結果以html格式返回給客戶。程序片段可以操作數據庫、重新定向網頁以及發送 email 等等,這就是建立動態網站所需要的功能。所有程序操作都在服務器端執行,網絡上傳送給客戶端的僅是得到的結果,對客戶瀏覽器的要求最低,可以實現無plugin,無activex,無java applet,甚至無frame。 本文將介紹利用jsp技術開發動態網頁的方法,還將簡要分析jsp技術和 microsoft 公司的 asp 技術的不同之處。
二、 如何安裝和啟動
為了實驗jsp技術,首先需要建立運行環境,這個過程相當簡單:
1、在 http://java.sun.com/jdk/處下載jdk(java 2 sdk、standard edition、v 1.2.2)。
2、在http://java.sun.com/products/jsp/處下載jswdk(javaserver web development kit 1.0.1)。linux用戶可以在ttp://jakarta.apache.org/處下載tomcat 3.0。
3、安裝 以windows nt環境為例,jdk的安裝是首先運行下載得到的jdk1_2_2-win.exe,然后修改系統環境參數,在path參數中加入[x:]/jdk1.2.2/bin以及增加新的環境參數 classpath=[x:]/jdk1.2.2/lib/tools.jar,其中[x:]是安裝jdk的硬盤符(c:、d: 等)。 jswdk的安裝僅需將jswdk1_0_1-win.zip帶目錄釋放到硬盤根目錄下(c:/、d:/ 等),然后就可以在硬盤上找到/jswdk-1.0.1/目錄。將來如果不想保留jswdk,刪除這個目錄就可以了,沒有任何系統文件和注冊表遺留問題。更詳細的安裝過程以及solaris/unix和linux下jdk、tomcat的安裝可以參考下載得到的文件包中的安裝說明。
4、啟動 以windows nt環境為例,在/jswdk-1.0.1/目錄下執行startserver.bat,就可啟動jswdk中一個支持jsp網頁技術的web服務器。為了不與現有的web服務器(例如iis、pws等)沖突,jswdk的web服務器使用了8080端口。 在瀏覽器的地址欄中鍵入http://localhost:8080或者http://127.0.0.1:8080后,如果能看到 jswdk 的歡迎頁就說明jsp實驗環境已經建成,可進入下一步實驗。 要關閉web服務器則運行stopserver.bat。
三、 jsp簡單示例
jswdk中包含的web服務器的文檔目錄在缺省狀態下為/jswdk-1.0.1/webpages,主文檔在缺省狀態下為index.html和index.jsp。也就是說訪問http://localhost:8080等于訪問/jswdk-1.0.1/webpages/index.html。 用文本編輯器,如windows中的記事本(notepad),創建一個文本文件hi.jsp,保存在/jswdk-1.0.1/webpages/目錄下,其內容如下:
在瀏覽器的地址欄中鍵入http://localhost:8080/hi.jsp,jswdk中的web服務器會執行jsp 文件中用<%以及%>括起來的java程序語句,其中out.print是將文字輸出到網頁,語句<%= 變量 | 表達式 %>的作用是將java scriptlet中變量或表達式的值輸出到網頁,執行結果如圖1。 圖1 將變量msg賦值為中文字符串,用<%= %>輸出,或者用out.print輸出中文字符串,則在英文版nt4及redhat 6.1下實驗運行結果正常,而在中文nt 4.0和中文98下,則反而會出現亂碼。
四、 統一的網站界面
jsp支持服務器端的文件包含,即可以在一個jsp文件中插入多個其他文件,用來實現統一的網站界面。修改上述hi.jsp并另存為mypage.jsp:
用可視化html編輯器,例如frontpage、dreamweave等設計網站的框架結構,將設計好的框架結構文件分割成兩個部分,上面一半保存為top.htm, 下面一半保存為bot.htm,代碼如下面所示:
在瀏覽器的地址欄中鍵入http://localhost:8080/mypage.jsp,得到結果如圖2。 圖2 這樣網站的界面就能統一起來,而設計者可以集中精力在功能模塊上處理用戶登錄、連接數據庫、發送email等等。每個
jsp文件都有如下結構:
五、 服務器參數設置
jswdk的web服務器參數保存在/jswdk-1.0.1/webserver.xml中,用windows寫字板打開并編輯這個文件就可以修改缺省設置值。本節內容主要針對jswdk,linux下tomcat的設置方法略有不同。 jswdk缺省的文檔目錄是/jswdk-1.0.1/webpages,在此目錄下可以建立子目錄,例如/jswdk-1.0.1/webpages/test,就能在瀏覽器中用http://localhost/test訪問這個目錄,為了使得這個子目錄能執行jsp程序,還必須在webserver.xml中的<service></service>節加入:
<webapplication id="test" mapping="/test" docbase="webpages/test" />
并且,還必須建立/jswdk-1.0.1/webpages/test/web-inf目錄,并從/jswdk-1.0.1/webpages/web-inf目錄中復制過來以下四個文件:mappings.properties、mime.properties、servlets.properties以及webapp.properties。完成這些過程,才能通知jswdk的web服務器執行http://localhost/test 中的jsp程序。
六、 javabean
jsp網頁吸引人的地方之一就是能結合javabean技術來擴充網頁中程序的功能。 javabean是一種java類 (class),通過封裝屬性和方法成為具有某種功能或者處理某個業務的對象。javabean被組織成為package(數據包)以便進行管理,實際上就是把一組javabean一起放在某某目錄中,每個類的定義前加上package某某,本例中為test。目錄test必須放在系統環境classpath包含的目錄下,系統才能找到其中的javabean。jswdk在缺省狀態下將/jswdk-1.0.1/webpages/web-inf/jsp/beans/ 加入classpath。建立自己的javabean和package時,就放在這個目錄中也不失為一種簡易的方法。 下面介紹一個簡單的javabean框架。用文本編輯器創建一個文本文件helloworld.java,并保存在/jswd
k-1.0.1/webpages/web-inf/jsp/beans/test目錄下,其內容如下:
javac helloworld.java
注意,java是區分大小寫的,在程序中,編譯命令行中字母的大小寫都不能寫錯。 編譯成功就表示建立了一個javabean。下面看如何在jsp中使用這個javabean。用文本編輯器創建一個文本文件hi-bean.jsp,并保存在/jswdk-1.0.1/webpages/test目錄下,其內容如下:
在jsp網頁中,使用 <jsp:usebean ... />語法來創建javabean對象,并命名為hellobean。讀者可從這個簡單的例子中看出設置、獲取javabean屬性,以及調用javabean方法的做法。在瀏覽器的地址欄中鍵入http://localhost:8080/test/hi-bean.jsp,得到結果如圖3所示。 注意,如果修改和重新編譯了javabean程序,則需要關閉和重新啟動jswdk的web服務器以后修改的結果才會有效。如果僅僅修改jsp文件,則不用重新啟動jswdk的web服務器. 雖然,這僅僅完成了一個非常簡單的javabean框架,但是遵循這個框架可以設計出多種多樣的javabean。例如,從jsp中訪問數據通常就是通過javabean來實現的。
七、 數據庫連接
數據庫連接對動態網站來說是最為重要的部分,java中連接數據庫的技術是jdbc(java database connectivity)。很多數據庫系統帶有jdbc驅動程序,java程序就通過jdbc驅動程序與數據庫相連,執行查詢、提取數據等等操作。sun公司還開發了jdbc-odbc bridge,用此技術java程序就可以訪問帶有odbc驅動程序的數據庫,目前大多數數據庫系統都帶有odbc驅動程序,所以java程序能訪問諸如oracle、sybase、ms sql server和ms access等數據庫。下面介紹如何用access實現一個動態faq(常見問題及答案)網站。
首先建立一個access數據庫faq.mdb,其中的表faqs有字段id(自動增量型,并設為主關鍵字)、subject(文字型,長度200)、answers(備注型)。這個表中可以存放一些編程知識的常見問題及答案,
如圖4。
圖 4
然后,在control panel(控制面板)的odbc datasource模塊中加入system dsn,取名faq,并指向faq.mdb。
創建一個javabean,名為faq.java,并保存在/jswdk-1.0.1/webpages/web-inf/jsp/beans/test目錄下。faq.java 的內容如下:
用上一節介紹的方法編譯faq.java以后,在/jswdk-1.0.1/webpages/test目錄下創建jsp文件faq.jsp,其內容如下:
在瀏覽器的地址欄中鍵入http://localhost:8080/test/faq.jsp,faq.jsp調用javabean,從數據庫中讀出內容并輸出,得到結果如圖5所示. 限于篇幅,本文不能列舉jsp-javabean-jdbc/odbc-數據庫的復雜例子,讀者可以從本文最后所推薦的網址中找到并下載到數據庫連接范例。
八、 技術分析
microsoft 公司的 asp 技術也是動態網頁開發技術。jsp和asp從形式上非常相似,asp程序員一眼就能認出<% %>以及<%= %>。但是深入探究下去會發現它們很多的差別,其中最主要的有以下三點:
1、 jsp的效率和安全性更高
asp以源碼形式存放,以解釋方式運行,每次asp網頁調用都需要對源碼進行解釋,運行效率不高。另外,iis的漏洞曾使得許多網站源程序大曝光,包括筆者以前用asp開發的網站,asp程序全部被人下載了去。 jsp在執行以前先被編譯成字節碼 (bytecode),字節碼由java虛擬機(java virtual machine)解釋執行,比源碼解釋的效率高;服務器上還有字節碼的cache機制,能提高字節碼的訪問效率。第一次調用jsp網頁可能稍慢,因為它被編譯成cache,以后就快得多了。同時,jsp源程序不大可能被下載,特別是
javabean程序完全可以放到不對外的目錄中。
2、 jsp的組件 (component) 方式更方便 asp通過com來擴充復雜的功能,如文件上載、發送email以及將業務處理或者復雜計算分離出來成為獨立可重復利用的模塊。jsp通過javabean實現了同樣的功能擴充。 在開發方面,com的開發遠比javabean復雜和繁瑣,學會asp不難,但學會開發com可不簡單。而javabean就簡單多了,從本文上述示例中可以看出開發javabean很方便。 在維護方面,com必須在服務器上注冊,如果修改了com程序,就必須重新注冊,甚至必須關機和重新啟動。javabean則不需要注冊,放在classpath包含的目錄中就行了。如果javabean進行了修改,則jswdk和tomcat現在還需要關閉和重新運行(但不是關機),但開發者已經許諾將在以后的版本中做到不需要關閉服務器。 另外javabean是完全的oop,可以針對不同的業務處理功能方便地建立一整套可重復利用的對象庫,例如用戶權限控制、email自動回復等等。
3、 jsp的適應平臺更廣
asp目前僅適用于nt和iis。雖然unix下有chilisoft的插件來支持asp,但是asp本身的功能有限,必須通過asp+com的組合來擴充,unix下的com實現起來非常困難。 jsp則不同,幾乎所有平臺都支持java,jsp+javabean可以在所有平臺下通行無阻。nt下iis通過一個插件,例如jrun(http://www3.allaire.com/products/jrun/)或者servletexec(http://www.newatlanta.
com/),就能支持jsp。著名的web服務器apache已經能夠支持jsp。由于apache廣泛應用在nt、unix和linux上,因此jsp有更廣泛的運行平臺。雖然現在nt操作系統占了很大的市場份額,但是在服務器方面unix的優勢仍然很大,而新崛起的linux更是來勢不小。 從一個平臺移植到另外一個平臺,jsp和javabean甚至不用重新編譯,因為java字節碼都是標準的與平臺無關的。筆者將在nt下實驗的jsp網頁原封不動地拿到linux下就運行起來了,感覺非常滿意。
九、 結論
綜上所述,jsp可謂是構建動態網站的一個利器,故推薦給讀者,祝愿你們掌握jsp,開發出優秀的網站。asp程序員也請試一下,jsp里也有session、request、response/out等對象,親自試試看如何。
附文
這里是關于jsp的重要參考資料,有興趣的讀者可以進一步閱讀。
http://java.sun.com/products/jsp/faq.html
http://www.esperanto.org.nz/jsp/jspfaq.html
http://www.zdnet.com/pcweek/stories/news/0,4153,410709,00.html
http://developer.netscape.com/viewsource/kuslich_jsp
/kuslich_jsp.html
http://web2.java.sun.com/products/jsp/jsp-asp.html
http://www.asptoday.com/articles/19991022.htm
歡迎光臨www.dukejava.com!
javaserver pages (jsp)是基于java的技術,用于創建可支持跨平臺及跨web服務器的動態網頁。 jsp可與微軟的active server pages (asp)相媲美,但jsp使用的是類似于html的標記和java 代碼片段而不是用vbscript。當你使用不提供asp本地支持的web服務器(例如 apache或netscape服務器)時,你就可以考慮使用jsp了。你雖然也可以為這些服務器弄一個asp附加軟件模塊,但是太昂貴了?,F在sun公司并不會因你使用jsp向你收費(雖然將來可能要收),況且用于solaris、 linux以及windows系統的組件都很容易獲得。 不要把jsp與服務器端的javascript語言搞混了。web服務器自動將通過jsp生成的java代碼片段轉換成java 片段(servlets)。 jsp也可自動控制許多功能,如過去用perl腳本編寫功能程序或像asp這樣的服務器專用api(應用編程接口).我們馬上就要開始幫助你建立一個使用jsp 技術的網站范例了。
準備好計算機以使用jsp 你需要java2軟件開發工具箱(j2sdk),過去稱之為java開發工具箱(jdk)、javaserver 網絡開發工具箱(jswdk)、tomcat,或者其它能支持jsp的web服務器。升陽公司為windows、solaris以及 linux平臺提供免費的j2sdk和jswdk。 如果你想在現有的web服務器上使用jsp,而此服務器本身不支持jsp和java 代碼片段,可以試用allaire公司的jrun。它可以為netscape的enterprise server和fasttrack server、微軟的internet information server(iis)和personal webserver(pws)、apache以及其他服務器充當web服務器附件。你也可以使用apache服務器的java版,其中包含最新的jswdk。 下載并安裝所需的軟件 目前,版本號為1.2.2-001的j2sdk可下載版以可安裝的歸檔文件形式出現。這個大約20mb的下載量軟件可提供一個徹底的java開發環境,讓你創造任何基于java并且利用了而標準核心api的解決方案。其實,你的web服務器使用jsp的唯一條件是要有java編輯器。要讓web服務器知道編輯器的位置,需要java_home 環境變量設置為j2sdk安裝目錄。如果你已經在windows系統中進行了安裝并且接受了默認目錄, 請將“set java_home=c:/1.2.2”添加到你的“autoexec.bat”文件中,然后重新啟動。 安裝j2sdk后,下載并安裝jswdk或者是tomcat β版,即基于java的apache web服務器的β版。你把jswdk放在什么地方是無關緊要的,只要你以后能找到它就行。通常,將其放在頂層目錄中,這樣你在替換jswdk或jsdk時無需刪除另一個軟件。安裝好這個文件后,準備工作已經就緒,你可以開始jsp開發工作了。 正確地安裝jswdk后,請運行“startserver”腳本程序,以啟動web服務器,使其按照默認情況監聽8080端口。你要在啟動服務器之后查看您是否已正確地安裝了此工具,請加載一個jsp樣本文件(http://locahost:8080/examples/jsp/)。如果你能成功地運行這些樣本文件,說明你已經正確地安裝了這個軟件。如果你在用來啟動服務器的控制臺窗口中看到報錯信息,你就需要做些修改。最經常發生的問題是沒有設置或不正確地設置了java_home環境變量。要看到當前環境變量設置情況,要請在dos提示符下鍵入“set”設置。 開始 在解釋 jsp語法前,創建一個快捷網頁,顯示目當前的日期和時間,并然后將之其保存為sample.jsp:
把這個文件以及你所有的html 和 jsp 頁面放在jswdk安裝目錄下的網頁目錄里。你可以從http://localhost:8080/sample.jsp加載此網頁。該網頁首次被訪問時,web服務器會把jsp編譯成java代碼片段,這樣你就能夠看到當前的日期和時間了。 你已經下載、安裝并配置好了開發環境,你可以開始學習jsp語法并創建自己的基于jsp的解決方案了。
jsp基本語法
講完安裝問題后,現在進入來討論jsp語法。一個投機取巧的辦法是下載語法卡片。如果你不熟悉java編程,也許你想看一下sun的指南 。然而網頁創建者并不需要進行太多的java開發。除了一些方法調用,在你的jsp網頁里應盡可能少用java代碼。 記住以上提示,我們首先來看一看jsp指令和腳本元素,之后我們會解釋javabeans和隱含對象。共有五種jsp指令和腳本元素。在jsp 1.0版中,大部分jsp被一個以“<%” 開頭和以“%>”結尾的的標記括在其中。在更新的jsp 1.1規范出臺后,就有了與xml兼容的版本。 jsp指令和腳本元素
指令
jsp指令是為jsp引擎而設計的。他們并不直接產生任何可見輸出,而只是告訴引擎如何處理其余jsp頁面。這些指令始終被括在 “<%@ ?%>”標記中。兩個最重要的指令是“pagepage”和“include”?!皌aglib”指令不在討論之列,但是在用jsp1.1創建自定義標記可以使用它。 幾乎在所有jsp頁面頂部都會看到“page”指令。盡管不是必須的,但它可以讓你指定: 到何處查找起支持作用的java類別:
出現java運行問題時,將網上沖浪者引向何處:
還有你是否需要管理用戶的會話級信息,這些信息可能來自多個網頁(在下面的javabeans一節將對此做進一步講)述:
“include”指令可以把你的內容分成更多可管理的元素,比如包括一個普通頁面頁眉或頁腳的元素。包含的網頁可以是一個固定的html 頁面或更多的jsp內容:
聲明
jsp聲明用來讓你定義頁面級變量,以保存信息或定義jsp頁面的其余部分可能需要的支持方法。如果你發現代碼太多,通常最好把它們寫成一個獨立的java類別。聲明一般都在“<%! ?%>”標記中。一定要以分號(;)結束變量聲明,因為任何內容都必須是有效的java語句:
表達式
有了jsp表達式,表達式評估結果會被轉換成一個字符串,并且被直接包括在輸出頁面之內。jsp 表達式包含在“<%= ?%>” 標記中,沒有分號,除非在加引號的字符串部分使用分號。
代碼片段/腳本片段
代碼片段/腳本片段(scriptlets) jsp代碼片段或腳本片段是嵌在“<% ?%>”標記中的。這種java代碼在web服務器響應請求時就會運行。在腳本片段周圍可能是原始的html或xml語句,在這些地方,代碼片段可以使你創建條件執行代碼,或要用到另外一段代碼的代碼。例如,以下的代碼組合使用表達式和代碼片段,顯示h1、h2、h3和h4標記中的字符串“hello”。代碼片段并不局限于一行源代碼:
注釋
最后一個主要的jsp元素是嵌入式注釋。盡管你始終可以在文件中加入html注釋,但用戶在查看頁面源代碼時會看到這些注釋。如果你不想讓用戶看到它,你就應該將其嵌入“<%-- ?--%>” 標記中:
要改變javabean屬性,你必須使用“<jsp:setproperty>”標記。對這個標記,你需要再次識別bean和屬性,以修改并額外提供新值。如果命名正確,這些值可以從一個已提交的表中直接獲得:參數獲得:
可以從一個參數獲得,但你必須直接命名屬性和參數:
或者直接用一個名字稱和值來設置:
關于javabean 的最后一件事: 為了web服務器能找到javabean,你需要將其類別文件放在一個特殊位置。用jswdk,最 方便的位置是安裝目錄下的類別目錄,如/jswdk-1.0.1/classes。
jsp隱含對象
與jsp語法相關的最后的元素是一些叫做“隱含對象”的東西。在jsp代碼片段中,你可以利用這些隱含對象與jsp頁面的代碼片段執行環境產生互動。應盡量少訪問這些內置隱含對象。但是,在一某些情況下,訪問隱含對象是可被接受的。若要充分利用隱含對象,就需了解最新的java servlet api。 下表列出可用的隱含對象集合。
隱含對象說明
request 客戶端請求,包括從get/post請求傳遞過來的參數
response 網頁傳回客戶端的反應
pagecontext 在此管理網頁屬性
session 與請求關聯的會話
application 代碼片段的運行環境
out 傳送響應的輸出流
config 代碼片段配置對象
page jsp網頁本身
exception 有錯的網頁中未被捕獲的例外
這些都是用來做什么的,你又如何來使用它們呢?基本上說,在你的腳本片段里,你可以用它們進入執行jsp代碼的代碼片段。用不著深入了解太多的servlet api細節,我們來看看能用它們來做到的某些事情: 你可以不用表達式,直接進入“out”隱含對象,將某些內容輸出到響應中:
用不著把一個參數直接送到javabean,你可以從請求對象獲取參數值:
在你用jsp進行開發的過程中,進行更多的開發的過程中,如果創建了javabeans或發現jsp文件中加入了太多的java源代碼,你就需要創建起支持作用的java分類(class)了,它可以協助你重復利用源代碼并減少jsp網頁編譯時間。當你需要創建java分類文件時,你必須: 將jdswk installation/bin目錄添加到path中。在autoexec.bat文件path行的末尾,加入“c:1.2.2/bin”。
用這個命令將jar文件復制到“/jre/lib/ext:”目錄中: copy c:/jswdk-1.0.1/lib/servlet.jar
c:/jdk1.2.2/jre/lib/ext.
創建一個jsp網站
現在該是把所有這些jsp語法派上用場的時候了。我們將創建一個網頁,它有一個輸入表單,可以使用戶輸入一個股票代號以獲得出當前股價(有20分鐘)。如果輸入有誤,則顯示報錯網頁。
quote.jsp
首先,用 這個代碼 創建一個quote.jsp網頁并將其保存在jswdk安裝目錄下的網頁目錄中。大多數的網頁是標準的html,其間散布著jsp代碼。第六行是一個網頁指示,表示將把所有錯誤發送到“errorpage.jsp”文中。第13到15行是一個腳本片段,主要說明只有提供“符號”參數才會顯示表格?!癷f”代碼段在
32到34行結束。第17行定義了要用的javabean,第18行從參數加載javabean的符號屬性。第27行到29行顯示bean的屬性。除了"if "代碼段,實際上并不涉及其它java代碼。
errorpage.jsp
下一步,將下列jsp源代碼保存到網頁目錄中的“errorpage.jsp”文件中?!斑@是一個錯誤網頁”的提示為第一行,它將iserrorpage網頁提示屬性設置為真。上一頁說了明錯誤網頁的位置,本頁則說明這就是錯誤網頁。其它jsp文件中的jsp專用代碼只有訪問隱含例外對象才用到。網頁只顯示其值:
你的第一個jsp網頁。
創建了這兩個jsp文件,建立了javabean資源文件并編輯了它后,你就可以從http://localhost:8080/quote.jsp加載“quote.jsp”文件以查看結果,假設你沒有更改jswdk安裝設置,轉而使用別的端口。這個網頁當然能做得更漂亮,但是它已實現了需要實現的功能,并且很好地展示了jsp的功能。
新聞熱點
疑難解答