《精通Struts技術》word版_第1頁
《精通Struts技術》word版_第2頁
《精通Struts技術》word版_第3頁
《精通Struts技術》word版_第4頁
《精通Struts技術》word版_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第一章: Jakarta Struts 項目的介紹和它的支持組件作者:James Goodwill 翻譯:周海方我們所有的章節(jié)的Web服務器都是基于Jakarta Tomcat容器。在本章結束的時候,通過運行你建立的Struts應用程序,你可以對Struts的框架機制有個大致的了解The Jakarta Struts項目The Jakarta Struts項目是由Apache Software Foundation發(fā)起的開源項目,它在java服務器端實現(xiàn)了MVC(Model-View-Controller)設計模式。The Jakarta Struts項目最初是由Craig McClanaha

2、n在2000年五月創(chuàng)建的,但后來被開源組織所接收。The Jakarta Struts作為一個開源框架的主要意圖是為了在創(chuàng)建WEB應用時能比較容易的分離表示層和業(yè)務數(shù)據層。自從它誕生以來收到大量開發(fā)人員的支持,并很快的成為開源社區(qū)中一個重要的成員。理解MVC設計模式為了更深刻的理解Struts框架,你必須先理解MVC設計模式,Struts技術的就是基于MVC設計模式的。MVC設計模式起源于Smalltalk語言,它由以下三個部分組成:模型(model),視圖(view),控制器(Controller).表1.1定義了這些組件。組件描述模型(model)封裝數(shù)據對象。模型用來封裝和顯示數(shù)據對象。

3、視圖(view)作為模型的顯示,它表示數(shù)據對象的當前狀態(tài)控制器(Controller)定義對用戶的輸入執(zhí)行相應操作的接口,它用來操作模型(model)和數(shù)據對象使用MVC的好處包括如下:可靠性:表示層和業(yè)務層別分離,這樣就允許你更改你的表示層代碼而不用重新編譯你的模型(model)和控制器(Controller)代碼高重用和可適應性: MVC模式允許你使用各種不同樣式的視圖來訪問同一個服務器端的代碼。它包括任何WEB(HTTP)瀏覽器或則無線瀏覽器(WAP)。較低的生命周期成本:MVC使降低開發(fā)和維護用戶接口的技術含量成為可能??焖俚牟渴穑洪_發(fā)時間會得到相當大的縮減,它使程序員(java開發(fā)人

4、員)集中精力于業(yè)務邏輯,界面程序員(HTML和JSP開發(fā)人員)集中精力于表現(xiàn)形式上。 可維護性: 分離表示層和業(yè)務邏輯層也使得基于Struts的Web應用更易于維護和修改。The Struts架構圖在這章節(jié),我們簡要的畫出一幅和MVC模式對應的STRUTS框架圖1.1:圖1.1是Struts框架下應用程序請求流通過的路徑。這個處理過程由5個基本的步驟組成。下面是處理步驟的描述。1 由顯示視圖產生一個請求。2 請求被ActionServlet(控制器)接收,它在struts-config.xml文件中尋找請求的URI,找到對應的Action類后,Action類執(zhí)行相應的業(yè)務邏輯。3 Action

5、類執(zhí)行建立在模型組件基礎上的業(yè)務邏輯,模型組件是和應用程序關聯(lián)的。4 一旦Action類處理完業(yè)務邏輯,它把控制權返回給ActionServlet。,Action類提供一個鍵值作為返回的一部分,它指明了處理的結果。ActionServlet使用這個鍵值來決定在什么視圖中顯示Action的類處理結果。5 當ActionServlet把Action類的處理結果傳送到指定的視圖中,請求的過程也就完成了。模型(The Model)Struts框架沒有提供特定的模型組件,因此我們不會整章介紹模型組件,但我們會把它使用到我們的例子中去。視圖(The View)Struts框架中視圖組件對應于一個簡單的JS

6、P文件,這個JSP文件包含了Struts定義的標簽,下面的代碼片段是一個簡單的Struts視圖:User Id: Password: 如你看到的那樣,幾個JSP的標簽是JSP文件中的重點。這些標簽在Struts框架中定義,它使struts應用項目和控制器之間實現(xiàn)松耦合。在第三章我們會建立一個真正可運行的struts視圖,第五章中會對視圖進行更詳細的介紹??刂破鳎═he Controller)控制器是Struts框架中的中樞,它由org.apache.struts.action.ActionServlet這個servlet來貫徹和執(zhí)行的。這個org.apache.struts.action.Ac

7、tionServlet接收所有客戶端的請求,并把請求委派到指定的Action類(用戶擴展自org.apache.struts.action)。ActionServlet委派請求是基于客戶端傳入的URI。一旦Action類完成處理,ActionServlet根據Action返回的鍵值來決定在什么視圖中顯示Action的類處理結果。ActionServlet類似于一個創(chuàng)建Action對象的工廠,由Action對象去執(zhí)行應用中實際的業(yè)務邏輯??刂破魇荢truts框架中最重要的部分。我們會在第三章和第四章對控制器進行更詳細的探討。Web應用 (WebApplications)所有的Web應用被包含在一

8、個目錄結構中,首先你要在Web服務器下建立如下目錄:目錄內容wileyapp這是Web應用的根目錄,所有的JSP和HTML文件都在這個目錄下。/wileyapp/WEB-INF這個目錄包含了所有除根目錄外需要的資源,包括WEB應用部署信息。注意:WEB-INF目錄下的不是公共文件,無法直接服務于客戶端。/ wileyapp/WEB-INF/classes存放了所有的servlet類或實用類。/ wileyapp/WEB-INF/lib包含所有WEB應用中要用到的后綴為JAR的包文件圖1.2如果你實用的是Tomcat服務器,你的缺省根目錄為/webapps/,在/webapps/下建立圖1.2所

9、示目錄注意:WEB服務器允許你編譯你的類并存放到/WEB-INF/classes或/WEB-INF/lib下,但/WEB-INF/classes的類將被優(yōu)先載入,即若你編譯的類在兩個目錄下都存在,起作用的只有/WEB-INF/classes目錄下的類。Web應用的部署描述Web應用的核心是部署描述。部署描述存放在/applicationname/WEB-INF/下的web.xml文件中,它描述了所有Web應用要使用的組件。如果你使用圖1.2的目錄結構,那么你的部署描述位于/wileyapp /WEB-INF/web.xml文件中。部署描述中包括如下元素:?ServletContext init

10、 parameters?Localized content ?Session configuration?Servlet/JSP definitions?Servlet/JSP mappings ?Tag library references?MIME type mappings?Welcome file list?Error pages ?Security information?下面的代碼片段是部署描述的一個例子,它定義了一個簡單的servlet。SimpleServletcom.wiley.SimpleServlet打包Web應用標準的Web應用都被打包成后綴為war的文件,你可以使用J

11、ava打包命令來創(chuàng)建WAR文件:jar cvf wileyapp.war現(xiàn)在你就可以用wileyapp.war文件發(fā)布你WEB應用了。Tomcat容器Tomcat是是基于JAVA的開源WEB應用服務器,我們的例子都以Tomcat為WEB應用服務器。在開始我們的學習前你需要下載Tomcat4 地址:/builds/jakarta-tomcat-4.0/release/v4.0.6/src/jakarta-tomcat-4.0.6-src.zipJDK1.4地址:/webapps/download/Redirect/68949517/58474793772828070535056072460860

12、69333228071972022813600060132859339008063305596058473206-3865/j2sdk-1_4_1_02-s1studio_ce-4u1-bin-windows.exe操作系統(tǒng)為Win20002在系統(tǒng)變量中設置JAVA_HOME = root3在系統(tǒng)變量中設置CATALINA_HOME = root4在系統(tǒng)變量中設置CLASSPATH= root/lib/dt.jar;jar;root/lib/tools.jar;root/jre/rt.jar;6 在系統(tǒng)變量中PATH下添加 rootbin;注意:root為你的安裝目錄啟動binstartup.

13、bat,在瀏覽器中輸入http:/localhost:8080,你若是能看到缺省的Tomcat 主頁面,表明你的配置成功了。如果未成功請查看你的JDK是否已經安裝,或者JDK路徑是否設置正確。下一章將大致講述JSP和servlets,若你對于這方面的技術已經了解,你可以跳過下一章節(jié)。作者:James Goodwill 翻譯:鳳鳴高崗本文的版權屬于筆者本人,但歡迎轉載,前提是注明出處和原作者?第二章:Servlet和JSP結構在這章我們討論兩個問題JSP和servlets技術,它們是Struts框架的基礎。我們描述的servlet結構包括它的生命周期,上下文環(huán)境(ServletContext)及

14、WEB應用之間的關系。一旦你對Servlet有了比較透徹的了解,我們將集中討論Struts框架中的視圖即JSP頁面。本章的目的是讓你對JSP和Servlet技術有個大致的了解。在本章結束的時候你會清楚的知道為何Servlet和JSP技術適合于WEB開發(fā)。Java Servlet 結構Java servlet是平臺獨立的WEB應用組件,Servlets和客戶端協(xié)作是通過request/response來進行處理的。圖2.1為處理圖servlet結構有兩個包組成:javax.servlet 和 javax.servlet.http。javax.servlet包含了被用來實現(xiàn)和擴展的通用接口和類。j

15、avax. servlet.http是被用于特定的HTTP協(xié)議的。Servlet接口被定義了五個方法。其中比較重要的有三個:1init()方法,用于初始化一個Servlet;2service方法,用于接受和響應客戶端的請求。3destroy()方法,執(zhí)行清除占用資源的工作。這些是servlet生命周期方法。我們會在后面的章節(jié)解說這些方法。所有的servlet都必須實現(xiàn)javax.servlet.Servlet接口,不管是直接或者是間接的。圖2.2是對象圖,給出了servlet的層次框架圖GenericServlet和HttpServlet類HttpServlet從GenericServlet擴

16、展而來,GenericServlet實現(xiàn)了Servlet接口。當開發(fā)你的servlets時,你通常需要擴展GenericServlet的子類。你必須實現(xiàn)service()方法。GenericServlet.service()方法已經被定義為抽象方法,定義的原型如下:public abstract void service(ServletRequest request,ServletResponse response) throws ServletException, IOException;ServletRequest,ServletResponse這兩個參數(shù)通過service()方法來傳遞。

17、ServletRequest對象用來把得到的信息傳送到servlet,ServletResponse對象用來把servlet產生的數(shù)據傳送回到客戶端。對比GenericServlet和HttpServlet,HttpServlet不需要實現(xiàn)service()方法,HttpServlet類已經為你實現(xiàn)了service()方法。方法原型如下:protected void service(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException;當HttpServlet.s

18、ervice()方法被執(zhí)行,它讀取存儲在request中的方法類型的值來決定哪個方法被執(zhí)行。這里是你想重載的方法:如果方法類型為GET,就調用doGet()方法。如果為POST就調用doPost()方法。主要使用的就是這兩個方法。另外的五個方法不是經常使用。因此我們比較關注的也就是這兩個方法。Servlet生命周期Servlet生命周期有一個合理的邏輯順序。javax.servlet.Servlet接口聲明了周期方法。這些方法就是init(), service(),destroy()。執(zhí)行順序分為三個處理步驟:1 init()方法用來把servlet導入和初始化。這個方法在servlet被預加

19、載或在第一次請求時執(zhí)行。2 Servlet處理0個或多個請求。Servlet對每個請求都用service()方法來處理。3 當WEB應用聲明Servlet被關閉,Servlet被銷毀,垃圾收集器對資源進行收集。用destory方法來關閉Servlet。init() 方法init()方法是servlet生命周期的開始。這個方法在servlet被實例化后立即執(zhí)行,它只被調用一次,用來創(chuàng)建和初始化請求中用到的資源。 init() 方法的顯示如下:public void init(ServletConfig config) throws ServletException;ServletConfig參數(shù)

20、對象是成員變量,它在后面會被用到。一個比較通用的做法是調用超類的init()方法super.init()。如果因為一些原因servlet不能初始化請求所要求的資源就會拋出ServletExceptionservice() 方法service()方法 處理來自客戶端的所有請求。service()方法表示如下:public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;service()方法有兩個參數(shù):ServletRequest:封裝來自客戶端的請求信息Servl

21、etResponse:返回客戶端的信息 通常情況下你不會實現(xiàn)這個方法,除非你擴展GenericServlet抽象類。經常實現(xiàn)service()這個方法的是HttpServlet類。HttpServlet通過擴展GenericServlet來實現(xiàn)Servlet接口。HttpServlet支持HTTP/1.1。destroy()方法這個方法用于結束servlet生命周期。當一個WEB應用被關閉,destroy()方法被執(zhí)行,這時在init()方法中被創(chuàng)建的資源被釋放。下面是destroy()方法的代碼片段:public void destroy();創(chuàng)建一個Servlet現(xiàn)在我們已經基本了解ser

22、vlet是如何工作了,我們將創(chuàng)建一個非常簡單的servlet應用。它的主要功能是為了處理客戶端請求,并在客戶端輸出客戶地址。在完成代碼后我們將編譯代碼并部署它。下面為SimpleServlet.java類的源代碼:package chapter2;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;public class SimpleServlet extends HttpServlet public void init(ServletConfig config)thro

23、ws ServletException / Always pass the ServletConfig object to the super classsuper.init(config);/Process the HTTP Get requestpublic void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException doPost(request, response);/Process the HTTP Post requestpublic v

24、oid doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException response.setContentType(text/html);PrintWriter out = response.getWriter();out.println();out.println(Simple Servlet);out.println();/ Outputs the address of the calling clientout.println(Your addres

25、s is + request.getRemoteAddr()+ n);out.println();out.close();現(xiàn)在我們可以查看SimpleServlet代碼的細節(jié)部分了。我們來看它的三個覆蓋方法:init() doGet() doPost() 每個方法的細節(jié):init()方法SimpleServlet類首先定義了init()方法,它以ServletConfig對象為參數(shù)調用父類的init()方法:super.init(config)注意:由SimpleServlet的父類GenericServlet來實際處理ServletConfig 對象,你可能也注意到了init()方法并沒有創(chuàng)

26、建任何資源,這也是為什么SimpleServlet中不執(zhí)行destroy()方法的原因了。doGet() 和 doPost() 方法所有的業(yè)務邏輯都在這兩個方法中執(zhí)行。在這個例子中doGet()方法只是簡單的調用doPost()方法。doGet()方法只在GET請求時被執(zhí)行,doPost()方法也一樣,只在Post請求時被執(zhí)行。兩個方法的傳入參數(shù)是HttpServletRequest和HttpServletResponse對象。HttpServletRequest對象包含的是來自客戶端的信息,HttpServletResponse包含的是返回客戶端的信息。在doPost()方法中第一步是設置返

27、回的內容類型:代碼片段如下:response.setContentType(text/html);在輸出流中它必須被最先設置,在例子中我們設置為text/html.下一步獲取PrintWriter對象,這是通過ServletResponse對象的getWriter()方法得到的。PrintWriter對象可以讓我們寫入輸出流后發(fā)送到客戶端顯示,這個步驟代碼片段如下:PrintWriter out = response.getWriter();一旦你獲取了PrintWriter對象后,我們將往客戶端輸出信息,信息包含HTML標記,這是輸出到客戶端的格式,下面的幾行代碼顯示了如何處理輸出:out.

28、println();out.println(Simple Servlet);out.println();/ Outputs the address of the calling clientout.println(Your address is + request.getRemoteAddr()+ n);前面部分代碼說明你的輸出格式為HTML,下面這段代碼你可能會有些疑問:/ Outputs the address of the calling clientout.println(Your address is + request.getRemoteAddr() + n);這段代碼調用了Htt

29、pServletRequest對象的getRemoteAddr()方法來獲取客戶端的IP地址,并將它發(fā)送到客戶端。HttpServletRequest對象可以獲取許多HTTP協(xié)議下的客戶端的信息。如果你想更深入的了解HttpServletRequest和HttpServletResponse對象,可以訪問SUN公司的網站:/products/servlet/創(chuàng)建和部署Servlet我們需要創(chuàng)建一個WEB應用來存放Servlet,并且編譯和部署Servlet到WEB應用中去。步驟描述如下:1創(chuàng)建名稱為wileyapp的WEB應用,如我們在第一章中所說的那樣。.2編譯SimpleServlet.j

30、ava文件,拷貝SimpleServlet.class文件到/webapps/wileyapp/WEB-INF/classes/chapter2/目錄4你可以啟動你的WEB Server,執(zhí)行SimpleServlet并查看結果。在瀏覽器中輸入如下地址http:/localhost:8080/wileyapp/servlet/chapter2.SimpleServlet你可以看到輸出:Your address is 127。0。0。1注意:在地址中包含了“/servlet”是為了告訴webServer你要執(zhí)行的是一個servletServletContextServletContext是定義在

31、javax.servlet包中的對象。它定義了用于WEB應用中的服務器端組件關聯(lián)servlet容器的方法集合。ServletContext經常被用于存儲對象的區(qū)域,這些對象在WEB應用中的所有的服務器端組件中使用。你可以把ServletContext當作在WEB應用中共享的存儲區(qū)域。把一個對象放置到ServletContext中時,它存在于WEB應用的整個生命周期中,除非它被明確的刪除或替換。在ServletContext中定義了四個方法來實現(xiàn)存儲區(qū)的共享功能。表2.1描述了四個方法:方法名描述setAttribute(String name,Object obj)通過名稱綁定一個對象并存儲對

32、象到當前ServletContext。如果指定的名稱已經被使用過,這個方法會刪除舊對象綁定為新對象。getAttribute(String name)返回指定名稱的對象,如果名稱不存在返回null。removeAttribute(String name)從ServletContext中刪除指定名稱的對象getAttributeNames()返回在ServletContext中的指定名稱的對象集合Web 應用和ServletContext的關系:ServletContext 在WEB應用中充當容器的角色。在WEB應用中只有一個ServletContext 實例,Java Servlet規(guī)范指定S

33、ervletContext作為所有servlet 的容器。The ServletContext acts 為了了解它在WEB組件中的關系,我們將使用一個Servlet和一個JSP來說明。在這個Servlet中。我們可以看到在ServletContext中存儲的一個對象,這個對象在所有的服務端組件中都可使用。列表2.2顯示了servlet的源代碼:Listing 2.2 ContextServlet.java.package chapter2;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import ja

34、va.util.*;public class ContextServlet extends HttpServlet private static final String CONTENT_TYPE = text/html;public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException doPost(request, response);public void doPost(HttpServletRequest request,HttpSe

35、rvletResponse response)throws ServletException, IOException / Get a reference to the ServletContextServletContext context = getServletContext();/ Get the userName attribute from the ServletContextString userName = (String)context.getAttribute(USERNAME);/ If there was no attribute USERNAME, then crea

36、te/ one and add it to the ServletContextif ( userName = null ) userName = new String(Bob Roberts);context.setAttribute(USERNAME, userName);response.setContentType(CONTENT_TYPE);PrintWriter out = response.getWriter();out.println();out.println(Context Servlet);out.println();/ Output the current value

37、of the attribute USERNAMEout.println(The current User is : + userName +.);out.println();public void destroy() 如你看到的ContextServlet,你注意到它執(zhí)行了下面的步驟:1首先通過getServletContext()方法得到ServletContext的一個引用。ServletContext context = getServletContext();2一旦你得到了ServletContext的引用,它將通過getAttribute()方法去獲取綁定的名稱的對象。綁定名稱為U

38、SERNAME:.String userName =(String)context.getAttribute(USERNAME);3檢驗返回的對象是否正確,如果getAttribute()方法返回null,說明沒有對象綁定到名稱USERNAME上。如果對象沒有找到,它將創(chuàng)建一個,并添加到ServletContext中。綁定名稱USERNAME,使用setAttribute()方法/ If there was no attribute USERNAME, then create/ one and add it to the ServletContextif ( userName = null )

39、 userName = new String(Bob Roberts);context.setAttribute(USERNAME, userName);4通過PrintWriter.println(),傳送獲取的數(shù)據到輸出流中。/ Output the current value of the attribute USERNAMEout.println(The current User is : +userName + .);編譯你的servlet,并把編譯后的class文件放到/webapps/wileyapp/WEB-INF/classes/chapter2/目錄下,這樣servlet被

40、部署到WEB應用中了。在我們即將寫的JSP中會和上面的servlet有很多相似之處,但是有兩個不同的地方:?ServletContext是在JSP腳本中本訪問(這個問題我們將在本章稍后討論)。?如果JSP中沒有發(fā)現(xiàn)USERNAME屬性,它不能添加一個新的。代碼實現(xiàn)的功能在本質上是一樣的,只不過在JSP中。你可以查看源代碼:列表 2.3: Context.jsp.Context%/ Try to get the USERNAME attribute from the ServletContextString userName = (String)application.getAttribute(

41、USERNAME);/ If there was no attribute USERNAME, then create/ one and add it to the ServletContextif ( userName = null ) / Dont try to add it just, say that you cant find itout.println(Attribute USERNAME not found);else out.println(The current User is : + userName +);%注意:Context.jsp中,我們使用了兩個固有對象,appl

42、ication(用于引用ServletContext),out(用于輸出流到客戶端)。在這章的后面我們將討論這兩個對象?,F(xiàn)在復制Context.jsp文件到/webapps/wileyapp/,重新啟動Tomcat;在瀏覽器中輸入地址:http:/localhost:8080/wileyapp/Context.jsp你會看到輸出:Attribute USERNAME not foundContext.jsp沒有發(fā)現(xiàn)USERNAME屬性。如果你輸入如下地址:http:/localhost:8080/wileyapp/servlet/chapter2.ContextServlet會輸出:The c

43、urrent User is Bob Roberts運行servlet后,一個對象被綁定到ServletContext 中的屬性USERNAME上,查看WEB應用的變化,打開前面的Context.jsp文件,地址為:http:/localhost:8080/wileyapp/Context.jspUSERNAME已經不為空。注意:從ServletContext中刪除一個對象的方法:重起JSP/Servlet容器或者使用ServletContext.removeAttribute()方法。Using Servlets to Retrieve HTTP Data在這一節(jié),我們將實現(xiàn)servlet如

44、何查找從客戶端傳送過來的信息。有三個方法被用來查找:getParameter(), getParameterValues(), 和 getParameterNames()。每個方法的定義如下:public String ServletRequest.getParameter(String name);public String ServletRequest.getParameterValues(String name);public Enumeration ServletRequest.getParameterNames ();getParameter()方法返回單個字符串或者null(如果參

45、數(shù)不存在),使用這個方法你確保只返回單個值。如果返回多個值,你必須使用getParameterValues()方法,它將返回一個字符串數(shù)組或返回null。getParameterNames()返回請求的參數(shù)名稱的集合或者空集合。為了了解如何使用這些方法查找數(shù)據,讓我們來看servlet的Post方法,它是如何查找參數(shù)的,并把取得的值返回到客戶端。列表2.4: ParameterServlet.java.package chapter2;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.

46、util.*;public class ParameterServlet extends HttpServlet public void init(ServletConfig config)throws ServletException / Always pass the ServletConfig object to the super classsuper.init(config);/ Process the HTTP GET requestpublic void doGet(HttpServletRequest request,HttpServletResponse response)t

47、hrows ServletException, IOException doPost(request, response);/ Process the HTTP POST requestpublic void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException response.setContentType(text/html);PrintWriter out = response.getWriter();out.println();out.pri

48、ntln();out.println(Parameter Servlet);out.println();out.println();/ Get an enumeration of the parameter namesEnumeration parameters = request.getParameterNames();String param = null;/ Iterate over the paramater names,/ getting the parameters valueswhile ( parameters.hasMoreElements() ) param = (Stri

49、ng)parameters.nextElement();out.println(param + : +request.getParameter(param) +);out.println();out.close();首先要注意的是servlet通過request的getParameterNames()方法取得所有的參數(shù)名。一旦取得參數(shù)集合后,它執(zhí)行while循環(huán)來取得參數(shù)名和通過getParameter()來取得參數(shù)名對應的參數(shù)值,并打印。創(chuàng)建一個HTML頁面訪問來ParameterServlet,如下:列表 2.5: Form.html.Parameter Servlet FormName:

50、 SSN:Age:email: 這個HTML文件包含了一個簡單的HTML form,它用來遞交到ParameterServlet的請求。編譯servlet,復制class文件到:/webapps/ wileyapp/WEB-INF/classes/chapter2目錄下把HTML文件放到:/webapps/wileyapp/ 目錄下?,F(xiàn)在打開瀏覽器,輸入如下地址:http:/localhost:8080/wileyapp/Form.html輸入數(shù)據,點擊提交按鈕,輸出結果。JavaServer PagesJavaServer Pages能產生強大的動態(tài)HTML頁面。JSPs是直接從Java s

51、ervlets擴展的,這可以讓開發(fā)人員在JSP中嵌入JAVA邏輯代碼。JSP文件必須以后綴.jsp結尾。下面的代碼是一個簡單的JSP文件,如下:看起來和HTML文件差不多,只是添加了標記來包含.JAVA代碼。源代碼的文件為hello.jsp,把文件復制到WEB應用中進行部署。當請求一個JSP文件時,JSP引擎會進行處理。當JSP文件第一次被請求時,它被解析成servlet,被編譯后駐留于內存。用這個生成的servlet來處理客戶端的請求,并返回結果到客戶端。對于以后的請求,服務器會檢驗JSP文件是否被改變。如果沒有改變,服務器調用已經生成的servlet對象。如果JSP文件被修改,JSP引擎會

52、重新編譯JSP文件以生成新的Servlet。注意:實質上JSP就是由HTML和JAVA代碼組成的。因此它們可獲得servlet一樣的資源和功能。JavaServer Page的組成這節(jié)我們討論JSP的組成,包括:標簽,腳本,隱含對象和標準活動。(directives, scripting, implicit objects, and standardactions.)JSP標簽(Directives)JSP標簽是JSP頁面中提供全局信息的元素。標簽的一個例子導入JAVA類列表到JSP中。JSP標簽的語法如下:page 指令表示如下:表2.2定義了page指令的屬性。Table 2.2 defi

53、nes the attributes for the page directive.屬性說明language=”scriptingLanguage”告訴服務器什么語言會被編譯,目前只支持JAVAextends=”className”當你擴展JSP時,指明JSP的父類。這么做會限制JSP/Servlet的自由度,因此不推薦。import=”importList”定義導入到JSP中的JAVA類包,用分號來分隔不同的類包。session=”true|false”定義是否在JSP中使用session。缺省值為true。buffer=”none|size in kb”是否對輸出流進行緩沖。缺省值為8KB

54、.autoFlush=”true|false”定義輸出流是否會被自動輸出,不管緩沖是否已滿。缺省值為true。isThreadSafe=”true|false”告訴JSP引擎這個頁面同時可為多個請求服務。缺省值為true。如果設置為false,只能被用于單線程。info=”text”通過調用Servlet.getServletInfo()方法訪問JSP頁面的表示信息errorPage=”error_url”表示相應地址的JSP頁面來處理拋出的JSP異常。isErrorPage=”true|false”表明JSP頁面是否有一個錯誤處理頁面,缺省值為false。contentType=”ctinf

55、o”表示發(fā)送到客戶端的網際協(xié)議和字符集。下面的代碼片段包含了page指令,導入了java.util包 include指令include指令被用來插入文本或者JSP文件。語法如下:這個file屬性通常為HTML文件或者JSP文件。被引用的文件必須為本WEB應用中的。例子如下:注意:因為include指令在載入時只轉換一次。因此,如果包含的資源改變,這個改變不會體現(xiàn)出來。即如果例子中header.jsp文件改變,當前頁(包含header.jsp的頁面)顯示時并不會改變。.taglib指令taglib指令用來包含自定義標簽庫,通過URI和關聯(lián)的前綴來唯一的區(qū)分自定義標簽。注意:如果不熟悉JSP自定義

56、標簽,你可以學習作者的另一本書“Mastering JSP Custom Tags and Tag Libraries”。taglib指令顯示如下:taglib在表2.3中描述:屬性定義uriURI是自定義標簽的唯一名prefix前綴被用來區(qū)分自定義標簽的實例下面是taglib的例子:JSP腳本JSP中的腳本是直接綁定到HTML中的JAVA代碼片段。在JSP中有三種腳本語言組件可被調用,每種組件出現(xiàn)于相應的位置。聲明聲明用于定義JAVA變量和方法。JSP聲明必須有聲明語句。當JSP頁第一次被載入時,JSP聲明被初始化。初始化后,它們被用于同一JSP頁面中的聲明,表達式,腳本。語法如下:一個簡單

57、的變量聲明:一個簡單的方法聲明:為了更好的理解聲明,讓我們把聲明放到JSP文件中。這個簡單的文件代碼如下:當文件被載入時,JSP被轉換成servlet代碼,聲明放在servlet的聲明區(qū)域內。它在所有的JSP組件中均可使用,相當于類的成員變量。注意:所有的JSP聲明定義為類水平的,因此JSP的所有表達式和腳本中均有效。表達式JSP表達式在容器中計算。它在請求時進行計算,計算結果插入到JSP文件的表達式位置上。如果表達式結果不能被轉換成字符串,translation-time錯誤會產生。表達式語法如下:表達式代碼片段:Hello JPS文件中的表達式:Hello 腳本腳本用來把所有的JSP元素放

58、在一起,它們在請求時被執(zhí)行。他們在所有的JSP組件中使用。腳本語法如下:Scriptlets are the JSP components that bring all the JSP elements together. 當JSP腳本代碼被轉換成servlet代碼時,它生成servlet的service()方法。下面的JSP代碼片段用來向客戶端打印出“Hello Bob”。你會注意到JSP腳本功能非常強大,在JSP中使用腳本來實現(xiàn)你的邏輯會使你的WEB應用很難管理。因為這個原因,導致了我們要創(chuàng)建定義的標簽庫。JSP錯誤處理象所有的開發(fā)方法一樣,JSP需要一種比較完善的錯誤處理機制。JSP體系

59、結構中提供了一種錯誤處理解決方案,它通過在JSP中專門指明處理錯誤的JSP文件來實現(xiàn)。JSP錯誤出現(xiàn)最多的是運行時錯誤,它通常由JSP頁面或則是被JSP頁面調用的一些對象所引起的。請求時錯誤(Request-time errors)是因為異常拋出的,它可以在被調用的JSP頁面中捕獲和處理。異常若未被處理會被傳送到客戶端。創(chuàng)建 JSP錯誤頁面下面創(chuàng)建的JSP錯誤頁面只進行很簡單的處理:創(chuàng)建簡單的JSP頁,告訴JSP引擎這是一個錯誤處理頁面,你需要設置屬性isErrorPage=true。代碼如下:列表2.6 errorpage.jsp.Error: has been reported.第一行JS

60、P代碼告訴編譯器,這個JSP頁面是一個錯誤處理頁面。代碼片段如下:第二段JSP代碼使用了隱含異常對象來輸出未在JSP頁面中被捕獲異常消息,這個隱含的異常對象在所有的JSP錯誤處理頁面都可以使用。使用JSP錯誤處理頁面為了查看錯誤處理頁面是如何工作的,讓我們來創(chuàng)建JSP頁面,它包含一個未捕獲的異常。JSP頁面如下:列表2.7: testerror.jsp.注意:第一行代碼設置isErrorPage=”errorpage.jsp”,是為了指明如果JSP頁面出現(xiàn)異常,將由errorpage.jsp來處理異常。本例中JSP拋出Exception,將由errorpage.jsp來處理。把testerro

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論