版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第2章學(xué)習(xí)JSPJSP完全來以Java語言開發(fā),是純Java的應(yīng)用。JSP經(jīng)服務(wù)器轉(zhuǎn)換后與一般的Java類完全相同,而這一特性也使JSP具有了Java所具備的所有優(yōu)勢,如面向?qū)ο?、簡單性、跨平臺等等。J2EE提供了良好的框架和指南,在此標(biāo)準(zhǔn)中開發(fā)程序?qū)哟胃忧宄_發(fā)更有效率,產(chǎn)品的可用性、可移植性更好。本章將詳細(xì)介紹JSP的工作原理和如何使用JSP。2.1環(huán)境準(zhǔn)備這一節(jié)里主要介紹如何安裝一個JSP運(yùn)行環(huán)境,包括安裝JDK和安裝運(yùn)行JSP的服務(wù)器Tomcat以及安裝開發(fā)工具M(jìn)yEclipse。2.1.1安裝JDKJDK(JavaDevelopmentKit)java開發(fā)包,又叫做J2SE(Java2SDKStandardEdition),是SUN公司免費(fèi)提供的,可以從SUN的Java網(wǎng)站上下載到,地址:/j2se/downloads.html,JDK當(dāng)前最新的版本是J2SDK1.6,載頁面中列出了符合多種操作系統(tǒng)的JDK,這里應(yīng)該選擇Windows平臺的JDK。下載好的JDK是一個可執(zhí)行安裝程序,可以自定義安裝路徑選擇只安裝某些組件,推薦全部按默認(rèn)值安裝。2.1.2安裝TomcatTomcat是一個免費(fèi)并且開源的JSP服務(wù)器,它是Apache軟件基金會的Jakarta項(xiàng)目中的一個核心項(xiàng)目,由Apache、SUN和其他一些公司及個人共同開發(fā)而成。由于有了SUN的參與和支持,最新的Servlet和JSP規(guī)范總是能在Tomcat中得到體現(xiàn)。因?yàn)門omcat技術(shù)先進(jìn)、性能穩(wěn)定,簡單易用,成為目前應(yīng)用最廣泛的JSP服務(wù)器。本書所有例子都將以Tomcat為JSP服務(wù)器。2.1.3安裝MyEclipseEclipse是一種可擴(kuò)展的開放源代碼集成開發(fā)環(huán)境。是一款非常受歡迎的Java開發(fā)工具,使用它開發(fā)人員是最多的。Eclipse的最大特點(diǎn)是它能接受各種開放源代碼插件。而MyEclipse是對Eclipse的擴(kuò)展,集成了很多常用的經(jīng)典插件,支持HTML,Struts,JSF,CSS,Javascript,SQL,Hibernate利用它可以在數(shù)據(jù)庫和J2EE的開發(fā)、發(fā)布,極大的提高工作效率。2.2第一個JSP程序本節(jié)介紹如何在Tomcat服務(wù)器上創(chuàng)建和發(fā)布JSP程序。這里首先講解Tomcat的目錄結(jié)構(gòu)以及Web應(yīng)用的目錄結(jié)構(gòu),接著介紹如何將JSP部署到Web應(yīng)用中,運(yùn)行第一個JSP程序并測試它。2.2.1JSP的工作原理JSP服務(wù)器管理JSP頁面有兩個階段:轉(zhuǎn)換階段(translationphase)和執(zhí)行階段(executionphase)。當(dāng)有一個客戶請求到來時,JSP服務(wù)器檢驗(yàn)JSP頁面的語法是否正確,將JSP頁面轉(zhuǎn)換為Servlet(Servlet就是用Java語言實(shí)現(xiàn)的CGI程序,后面章節(jié)將詳細(xì)介紹)源文件,然后調(diào)用javac工具類編譯Servlet源文件生成class文件,這一階段是轉(zhuǎn)換階段。2.2.2JSP目錄結(jié)構(gòu)在Tomcat上發(fā)布Web應(yīng)用之前,首先要了解Tomcat的目錄結(jié)構(gòu),參見這些目錄都是的子目錄,Tomcat6.0與以前的版本相比較對目錄結(jié)構(gòu)做了很大改動,合并和簡化了一些目錄,現(xiàn)在的結(jié)構(gòu)簡單而且清晰。2.2.3解讀web.xmlJavaWeb應(yīng)用通過一個基于XML的發(fā)布描述符文件來配置其發(fā)布信息,這個文件名為web.xml,它存放于WEB-INF子目錄下。在web.xml文件中可主要包含如下配置信息:(1)Servlet的定義。(2)Servlet的初始化參數(shù)。(3)Servlet以及JSP的映射。(4)Filter的定義。(5)安全域配置參數(shù)。(6)welcome文件清單。(7)資源引用。(8)環(huán)境變量的定義。2.2.4編寫第一個JSP創(chuàng)建兩個JSP文件,其中一個是login.jsp如代碼2-2,它顯示登錄頁面,要求輸入用戶名和口令,這個頁面鏈接到另一個JSP文件是welcome.jsp如代碼2-3,顯示歡迎頁面。JSP的語法將在以后的章節(jié)詳細(xì)討論,本節(jié)側(cè)重于介紹JSP的發(fā)布過程。這兩個JSP文件都應(yīng)放在應(yīng)用jsp_example自己的目錄下。2.2.5發(fā)布與測試按上一節(jié)中表2-2Web應(yīng)用的目錄結(jié)構(gòu)表,在Tomcat的webapps目錄下創(chuàng)建目錄jsp_example,將寫好兩個jsp文件和web.xml文件放入指定目錄,重新啟動tomcat。訪問jsp可以看到結(jié)果。2.3JSP基本的語法JSP網(wǎng)頁主要分為腳本與網(wǎng)頁數(shù)據(jù)兩部分。網(wǎng)頁數(shù)據(jù)就是JSP服務(wù)器不處理的部分,例如:HTML的內(nèi)容,會直接送到客戶端端執(zhí)行。腳本必須經(jīng)由JSP服務(wù)器處理的部分,而大部分腳本都以XML作為語法基礎(chǔ),并且大小寫必須要一致。腳本有4種類型:編譯指令、JSP腳本、動作標(biāo)簽和表達(dá)式語言(ExpressionLanguage),其中表達(dá)式語言又簡稱為EL是JSP2.0新增的功能,將在后文的Struts2篇來介紹。2.3.1給JSP加注釋一般批注可分為兩種:一種為在客戶端顯示的批注;另外一種就是客戶端看不到,只給開發(fā)程序員專用的批注。(1)客戶端可以看到的批注,以“<!--”開頭以“-->”結(jié)尾,如:<!--comment[<%=expression%>]-->(2)開發(fā)程序員專用的批注,以“<%--”開頭以“--%>”結(jié)尾,如:<%--comment--%>2.3.2在JSP中聲明變量和函數(shù)在JSP程序中聲明是為了在JSP中聲明變量或者函數(shù),是以“<%!”開頭以“--%>”結(jié)尾,如:<%!declaration;[declaration;]+...%>2.3.3用JSP表達(dá)式輸出結(jié)果JSP表達(dá)式是以“<%=”為起始以“%>”為結(jié)尾,其中間內(nèi)容包含一段合法的表達(dá)式,如:<%=expression%>前面章節(jié)中曾經(jīng)使用JSP表達(dá)式:<fontsize=<%=i%>>讀者,您好!</font>歡迎:<%=request.getParameter("username")%>2.3.4用JSP腳本實(shí)現(xiàn)程序邏輯JSP腳本又稱為scriptlet是包含一個有效的程序段。是以“<%”開頭以“%>”結(jié)尾,如:<%codefragment%>前面章節(jié)中您好,讀者的例子就兩次用到JSP腳本<HTML><BODY><!—嵌入JSP代碼--><%for(inti=3,i<5,i++){%>//jsp腳本
<fontsize=<%=i%>><strong>讀者,您好!</strong></font><%}%>//jsp腳本<%--這里所在的東西不會被編譯,客戶端的原文件中也不會出現(xiàn)--%></BODY></HTML>2.4編譯指令和動作標(biāo)簽編譯指令主要用來提供整個JSP網(wǎng)頁相關(guān)的信息,并且用來設(shè)定JSP網(wǎng)頁的相關(guān)屬性,例如:網(wǎng)頁的編碼方式、語法、信息等。起始符號為“<%@”,終止符號為“%>”中間部分就是一些指令和一連串的屬性設(shè)定。JSP有3編譯指令:page、include和taglib。動作標(biāo)簽又稱為動作元素、動作指令,也可以理解為JSP自帶的標(biāo)準(zhǔn)標(biāo)簽庫。動作標(biāo)簽利用XML語法格式的標(biāo)記來控制JSP服務(wù)器的行為。利用動作標(biāo)簽可以動態(tài)地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼。起始符號為<jsp:xxx>,終止符號為</jsp:xxx>。2.4.1使用page指令page指令是最復(fù)雜的編譯指令,它的主要功能為設(shè)定整個JSP網(wǎng)頁的屬性和相關(guān)功能。page指令的基本語法如下:<%@pageattribute1="value1"attribute2="value2"attribute3=…%>如:<%@pageimport="java.util.*java.lang.*"%><%@pagebuffer="5kb"autoFlush="false"%><%@pageerrorPage="error.jsp"%>2.4.2用include指令插入其他JSPInclude指令是在JSP中包含一個靜態(tài)的文件,同時解析這個文件中的JSP語句。Include指令只有一個參數(shù)就是要插入文件的相對路徑,語法如下:<%@includefile="relativeURL"%>include指令將會在JSP編譯時插入一個包含文本或代碼的文件,當(dāng)使用include指令時,這個包含的過程是靜態(tài)的。也可以理解為不管要插入的文件內(nèi)容是什么,簡單的把其中所有的內(nèi)容拷貝過來合并成一個新文件,然后提交給JSP服務(wù)器做接下來的工作。由此可以看出,如果兩個文件中有重復(fù)的Java變量或函數(shù)定義,那么合并之后編譯要出錯,html的標(biāo)簽也同樣會相互影響,要避免片段文件中有<html><body>之類的全局標(biāo)簽出現(xiàn)。2.4.3用taglib指令引入標(biāo)簽庫taglib指令能夠讓用戶自定義新的標(biāo)簽。這里只是先做一個簡單介紹,在后面的章節(jié)再詳細(xì)介紹如何自定義標(biāo)簽和如何使用標(biāo)簽。taglib指令的語法如下:<%@tagliburi="tagLibraryURI"prefix="tagPrefix"%>2.4.4用forward標(biāo)簽跳轉(zhuǎn)頁面forward動作把請求轉(zhuǎn)到另外的頁面。<jsp:forward>標(biāo)簽只有一個屬性page。page屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態(tài)計(jì)算,如下面的例子所示:<jsp:forwardpage="/utils/errorReporter.jsp"/><jsp:forwardpage="<%=someJavaExpression%>"/>2.4.5動態(tài)插入文件<jsp:include>標(biāo)簽把指定文件插入正在生成的頁面。其語法如下:<jsp:includepage="relativeURL"flush="true"/>所謂動態(tài)插入正是相對于前面已經(jīng)介紹過靜態(tài)include指令,它是在JSP文件被轉(zhuǎn)換成Servlet的時候引入文件,而這里的<jsp:include>動作不同,插入文件的時間是在頁面被請求的時候。這里被插入的文件是一個完整的JSP文件而非片段,把兩個JSP輸出到客戶端的結(jié)果結(jié)合在一起,他們分別被JSP服務(wù)器轉(zhuǎn)化為兩個不同Java類,因此不存在變量定義方面的沖突。用<jsp:include>標(biāo)簽引入文件的效率要稍微差一點(diǎn),而且被引用文件不能包含某些JSP代碼(例如不能設(shè)置HTTP頭),但它的靈活性卻要好得多。2.4.6用標(biāo)簽操作JavaBean本節(jié)將涉及3標(biāo)簽,<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>。<jsp:useBean>標(biāo)簽用來裝載一個將在JSP頁面中使用的JavaBean。這個功能非常有用,因?yàn)樗沟瞄_發(fā)人員既可以發(fā)揮Java組件重用的優(yōu)勢,同時也避免了損失直接在JSP實(shí)例化對象的復(fù)雜操作。<jsp:useBean>標(biāo)簽最簡單的語法為:<jsp:useBeanid="name"class="package.class"/>2.4.7其他動作標(biāo)簽<jsp:plugin>標(biāo)簽用來根據(jù)瀏覽器的類型,插入通過Java插件運(yùn)行JavaApplet所必需的OBJECT或EMBED元素。當(dāng)JSP網(wǎng)頁被編譯后送往瀏覽器執(zhí)行時,<jsp:plugin>將會根據(jù)瀏覽器的版本替換成<object>標(biāo)簽或者<embed>標(biāo)簽。一般來說,<jsp:plugin>會指定對象Applet或Bean,同樣也會指定類的名字和位置,另外還會指定將從哪里下載這個Java組件。<jsp:fallback>一段文字用于:當(dāng)不能啟動Applet或Bean時,那么瀏覽器會有一段錯誤信息。2.5JSP的內(nèi)置對象內(nèi)置對象也稱內(nèi)建對象、隱含對象是不需要聲明,直接可以在JSP中使用的Java對象。JSP基于Java語言,面向?qū)ο笠彩撬囊淮筇厣SP的內(nèi)置對象就是把最常用最重要的幾個對象直接創(chuàng)建然后內(nèi)置了,用戶無需再顯示的用代碼聲明,用好JSP內(nèi)置對象是JSP編程的精髓。JSP有以下九個內(nèi)置對象:request、response、out、pageContext、session、application、config、page、exception本節(jié)將分別講述如何使用這些對象。2.5.1使用request對象獲取請求request是最常用的內(nèi)置對象。表示javax.servlet.http.HttpServletRequest對象request對象包含所有請求的信息,如請求的來源、標(biāo)頭、cookies和請求相關(guān)的參數(shù)值等。比較常用的方法:(1)ObjectgetAttribute(Stringname):返回由name指定的屬性值,該屬性不存在時返回null。(2)voidsetAttribute(Stringname,Objectvalue):在屬性列表中添加/刪除指定的屬性。(3)StringgetParameter(Stringname):獲取客戶端發(fā)送給服務(wù)器端的參數(shù)值。(4)String[]getParameterValues(Stringname):獲得請求中指定參數(shù)的所有值。(5)StringgetProtocol():返回請求使用的協(xié)議。可以是HTTP1.1或者HTTP1.0。(6)StringRequestURI():返回發(fā)出請求的客戶端地址,但是不包括請求的參數(shù)字符串。(7)StringgetRemoteAddr():獲取發(fā)出請求的客戶端IP地址。(8)HttpSessiongetSession():獲取session。2.5.2使用response對象做應(yīng)答response表示HttpServletResponse對象,并提供了幾個用于設(shè)置送回瀏覽器的響應(yīng)的方法,如比較常見的方法:(1)sendRedirect(URL):可以將用戶重定向到一個不同的頁面(URL)。(2)setContenType(Stringtype):響應(yīng)設(shè)置內(nèi)容類型頭。(3)addHeader(Stringname,Stringvalue):添加String類型的值到HTTP文件頭2.5.3在session對象中保存用戶會話session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態(tài)信息。session在第一個JSP頁面被裝載時自動創(chuàng)建,完成會話期管理。從一個客戶打開瀏覽器并連接到服務(wù)器開始,到客戶關(guān)閉瀏覽器離開這個服務(wù)器結(jié)束,被稱為一個會話。當(dāng)一個客戶訪問一個服務(wù)器時,可能會在這個服務(wù)器的幾個頁面之間反復(fù)連接,反復(fù)刷新一個頁面,服務(wù)器應(yīng)當(dāng)通過某種辦法(比如cookie)知道這是同一個客戶,這就需要session對象。2.5.4application對象、pageContext對象和JSP的Scope服務(wù)器啟動后就產(chǎn)生了這個application對象,當(dāng)客戶再所訪問的網(wǎng)站的各個頁面之間瀏覽時,這個application對象都是同一個,可以理解為在一個應(yīng)用中applications對象是一個全局的Map。pageContext與application對象類似有setAttribute()和getAttribute()方法來保存對象只是它的范圍只限于本網(wǎng)頁內(nèi)。這里提到JSP的范圍(scope),分別為Page、Request、Session、Application。在這4個范圍分別有pageContext,request,session,appliaction4個內(nèi)置對象對應(yīng)用來保存對象,方法名都是setAttribute()和getAttribute()。范圍的概念十分重要,很多配置都有范圍這一屬性。2.5.5使用out對象輸出out對象是javax.jsp.JspWriter的一個實(shí)例,是一個輸出流,用來向客戶端輸出數(shù)據(jù)。out對象用于各種數(shù)據(jù)的輸出。常用方法如下:(1)out.print():輸出各種類型數(shù)據(jù)。(2)out.newLine():輸出一個換行符。(3)out.close():關(guān)閉流。2.5.6在exception對象中處理異常Exception對象用作處理JSP文件執(zhí)行時發(fā)生的錯誤和異常只有在錯誤頁面里才可以使用,前提是:在頁面指令里要有isErrorPage=true的頁面中;如:<%@pagecontentType="text/html;charset=gb2312"isErrorPage="true"%>則:在此頁面中頁面中便可使用exception內(nèi)置對象,用法如下:<%=exception.getMessage()%>2.5.7page對象和config對象page表示從該頁面產(chǎn)生的一個Servlet實(shí)例,相當(dāng)于這個JSP產(chǎn)生Servlet類的this,可以通過page對象訪問實(shí)例的屬性和函數(shù)config表示一個javax.servlet.ServletConfig對象。該對象用于存取Servlet實(shí)例的初始化參數(shù)。常用方法如下:(1)StringgetInitParameter(Stringname):返回名稱為name的促使參數(shù)的值。(2)EnumerationgetInitParameters():返回這個JSP所有的促使參數(shù)的名稱集合。(3)ServletContextgetContext():返回執(zhí)行者的Servlet上下文。(4)StringgetServletName():返回Servlet的名稱。2.6Servlet就當(dāng)時功能來說,Servlet所提供的功能就是一個Java版本的CGI。它依舊是一個具有跨平臺特性、100%純Java的Server-Side程序。JavaServletAPI定義了Servlet和服務(wù)器之間的一個標(biāo)準(zhǔn)接口,這使得Servlet具有跨服務(wù)器平臺的特性。2.6.1Servlet簡介Servlet通過創(chuàng)建一個框架擴(kuò)展服務(wù)器的能力,采用請求-響應(yīng)模式提供Web服務(wù)。當(dāng)客戶機(jī)發(fā)送請求至服務(wù)器時,服務(wù)器將請求信息發(fā)送給Servlet,Servlet生成響應(yīng)內(nèi)容并將其傳給Server服務(wù)器,然后再由Server服務(wù)器將響應(yīng)返回給客戶端。圖展示了Servlet的生命周期,定義了一個Servlet如何被加載、初始化,以及它怎樣提供服務(wù)和最后銷毀的過程。2.6.2創(chuàng)建Servlet所有的Servlet必須直接或間接地實(shí)現(xiàn)javax.servlet.Servlet接口,這樣才能在Servlet服務(wù)器或稱為Servlet容器、Servlet引擎上運(yùn)行,更簡單的方法是繼承HttpServlet類。功能是在用戶請求中獲取name參數(shù),然后向客戶端輸出一個HTML網(wǎng)頁。2.6.3過濾器(Filter)一個過濾器是一個可以傳送請求或修改響應(yīng)的對象。過濾器并不是Servlet,他們并不實(shí)際創(chuàng)建一個請求。他們是請求到達(dá)一個Servlet前的預(yù)處理程序,在響應(yīng)離開Servlet后的后處理程序。就像你將在后面的例子中看到的,一個過濾器能夠做如下工作。(1)在一個Servlet被調(diào)用前截獲該調(diào)用。(2)在一個Servlet被調(diào)用前檢查請求。(3)修改在實(shí)際請求中提供了可定制請求對象的請求頭和請求數(shù)據(jù)。(4)修改在實(shí)際響應(yīng)中提供了可定制響應(yīng)對象的響應(yīng)頭和響應(yīng)數(shù)據(jù)。(5)在一個Servlet被調(diào)用之后截獲該調(diào)用。2.6.4監(jiān)聽器(Listener)監(jiān)聽器可以監(jiān)聽客戶端的請求、服務(wù)端的操作等。通過監(jiān)聽器,可以自動激發(fā)一些操作,如監(jiān)聽在線用戶數(shù)量,當(dāng)增加一個HttpSession時,給在線人數(shù)加1。監(jiān)聽器還有一個好處是可以在不修改現(xiàn)有系統(tǒng)基礎(chǔ)上,增加Web應(yīng)用程序生命周期事件的跟蹤。編寫監(jiān)聽器需要實(shí)現(xiàn)相應(yīng)的接口,常用的監(jiān)聽接口:(1)ServletContextAttributeListener監(jiān)聽對ServletContext屬性的操作,比如增加/刪除/修改。(2)ServletContextListener監(jiān)聽ServletContext,當(dāng)創(chuàng)建ServletContext時,激發(fā)contextInitialized方法;當(dāng)銷毀ServletContext時,激發(fā)contextDestroyed方法。(3)HttpSessionListener監(jiān)聽HttpSession的操作。當(dāng)創(chuàng)建一個Session時,激發(fā)sessionCreated方法;當(dāng)銷毀一個Session時,激發(fā)sessionDestroye方法。(4)HttpSessionAttributeListener2.7自定義JSP標(biāo)簽前面的章節(jié)介紹了JSP的動作標(biāo)簽,使用標(biāo)簽可以處理定向請求以簡化JSP頁面開發(fā)與維護(hù)。JSP技術(shù)提供了一種封裝其它動態(tài)類型的機(jī)制——自定義標(biāo)簽,它擴(kuò)展了JSP語言。自定義標(biāo)簽通常發(fā)布在標(biāo)簽庫中,該庫定義了一個自定義標(biāo)簽集并包含實(shí)現(xiàn)標(biāo)簽的對象。一些功能可以通過自定義標(biāo)簽來實(shí)現(xiàn),包括對隱含對象的操作,處理表單,訪問數(shù)據(jù)庫集其它企業(yè)級服務(wù),如e-mail,目錄服務(wù),處理流控制。很多JSP開發(fā)框架如Struts都提供了豐富的標(biāo)簽庫,本節(jié)將以一個“helloreader”的例子來介紹如何自定義JSP標(biāo)簽。2.7.1標(biāo)簽庫簡介標(biāo)簽庫涉及到4個基本概念:(1)標(biāo)簽(Tag)(2)標(biāo)簽庫(Taglibrary)(3)標(biāo)簽庫描述文件(TagLibraryDescriptor)(4)標(biāo)簽處理類(TagHandleClass)2.7.2創(chuàng)建標(biāo)簽的處理類標(biāo)簽處理類必須實(shí)現(xiàn)Tag接口的doStartTag和doEndTag方法。當(dāng)jsp引擎碰到tag標(biāo)簽的開頭時,doStartTag被調(diào)用,因?yàn)楹唵蔚膖ag沒有body,所以此方法將返回SKIP_BODY。當(dāng)JSP引擎碰到tag標(biāo)簽的結(jié)尾時,doEndTag被調(diào)用,如果余下的頁面還要被計(jì)算,那它將返回EVAL_PAGE,否則將會返回SKIP_PAGE。一般的做法是不必直接實(shí)現(xiàn)Tag接口而是實(shí)現(xiàn)TagSupport類,如代碼此簽的作用是打印字符串“Hello.Reader”。2.7.3創(chuàng)建標(biāo)簽庫描述文件標(biāo)簽庫文件(TagLibraryDescrptorFile)簡稱TLD文件是用xml語言描述的。TLD包括了標(biāo)簽庫中所有標(biāo)簽的描述,它一般用來被JSP服務(wù)器用來校驗(yàn)標(biāo)簽的語法正確性,或者被JSP開發(fā)者用來開發(fā)新的標(biāo)簽。TLD的文件擴(kuò)展名必須為.tld,而且必須放在當(dāng)前Web應(yīng)用的WEB-INF目錄或其子目錄中。如代碼與上一節(jié)中的處理類配合形成一個完整的標(biāo)簽。2.7.4使用自定義標(biāo)簽首先要配置web.xml使用自定義標(biāo)簽<taglib>。<taglib-uri>/WEB-INF/helloreader.tld</taglib-uri><!—加載標(biāo)簽,供頁面中使用--><taglib-location>/WEB-INF/helloreader.tld</taglib-location></taglib>2.7.5JSP2.0中新增的標(biāo)簽定義方法JSP2.0提供一些較為簡單的方法,讓開發(fā)人員來撰寫自定義標(biāo)簽。JSP2.0提供兩種新的機(jī)制,分別為SimpleTag和TagFile。SimpleTagSupport類別顧名思義,就是可以處理一些簡單的自訂標(biāo)簽需求,它是在JSP2.0之后新增的類別,對于一些簡單的自訂標(biāo)簽頁求,您可以繼承它來實(shí)作標(biāo)簽處理類別,而不用為了處理一些TagSupport、BodyTagSuppourt類別中回傳值的問題。2.8小結(jié)本章詳細(xì)介紹JSP開發(fā)的基礎(chǔ)知識,包括JSP語法、JSP指令和標(biāo)簽、JSP內(nèi)置對象、自定義標(biāo)簽。JSP和Servlet是用Java開發(fā)Web應(yīng)用的基礎(chǔ),是J2EE的重要的組成部分。在最后兩節(jié)里我們介紹了Servlet、過濾器和自定義標(biāo)簽,很多開發(fā)框架包括后文會介紹的Struts和Spring都為開發(fā)人員提供了很多功能強(qiáng)大的過濾器和標(biāo)簽庫。第3章Struts2概述Struts這個名字來源于在建筑和舊式飛機(jī)中使用的支持金屬架。顧名思義它給開發(fā)者提供了一個基本框架和眾多組件,那么在此框架下生產(chǎn)出的產(chǎn)品必然大量節(jié)省時間而且產(chǎn)品趨于標(biāo)準(zhǔn)化的,這也正是Struts項(xiàng)目的目的所在。Struts能充分滿足應(yīng)用開發(fā)的需求,簡單易用,敏捷迅速,成為最成功的J2EE框架之一。3.1Struts項(xiàng)目簡介Struts是Apache基金會Jakarta項(xiàng)目組的一個開源項(xiàng)目,它采用MVC模式,能夠很好地幫助Java開發(fā)者利用J2EE開發(fā)Web應(yīng)用,它能大量減少開發(fā)Web應(yīng)用的時間,提高產(chǎn)品的重用度。Struts主要是采用Servlet和JSP技術(shù)來實(shí)現(xiàn)的,它把Servlet、JSP、自定義標(biāo)簽和信息資源(messageresources)整合到一個統(tǒng)一的框架中,Struts它只有一個中心控制器,他采用XML定制轉(zhuǎn)向的URL,采用Action來處理邏輯,開發(fā)人員利用其進(jìn)行開發(fā)時不用再自己編碼實(shí)現(xiàn)全套MVC模式。Struts跟Tomcat、Velocity等諸多Apache項(xiàng)目一樣是開源軟件,這是它的一大優(yōu)點(diǎn),使開發(fā)者能更深入的了解其內(nèi)部實(shí)現(xiàn)機(jī)制。3.2Struts2的前世今生經(jīng)過多年的發(fā)展,Struts已經(jīng)成為一個高度成熟的框架,不管是穩(wěn)定性還是可靠性,都得到了廣泛的證明。在國內(nèi)Struts是使用最廣泛的一個框架,也成為Java程序員一項(xiàng)基本技能。但畢竟Struts誕生于很多年前,近期Ajax、JSF技術(shù)的興起,原有設(shè)計(jì)上的缺陷成為它的硬傷,Struts有點(diǎn)跟不上時代的步伐一些。大量新的MVC框架成了Struts強(qiáng)大的在競爭者,最有代表性的莫過于WebWork。WebWork是由OpenSymphony組織開發(fā)的,也是致力于組件化和代碼重用的J2EEWeb框架。后來Struts與WebWork兩大社區(qū)決定將兩個項(xiàng)目合并,稱為Sturts2。3.3Web世界中的MVC本節(jié)將著重講述Web世界中MVC模式是如何應(yīng)用的,與傳統(tǒng)的C/S結(jié)構(gòu)中MVC模式有哪些區(qū)別。另外,以網(wǎng)頁為視圖也為MVC帶來了一些變化和發(fā)展,產(chǎn)生了新的處理方式前端控制器和頁面控制器。3.3.1MVC在Web中的發(fā)展在經(jīng)典MVC中的事件流中,用戶與視圖(View)進(jìn)行交互,填入數(shù)據(jù)并單擊按鈕,控制器(Controller)接收到來自視圖的事件并對模型(Model)進(jìn)行操作,根據(jù)用戶提供的數(shù)據(jù)更新模型(Model)。視圖也會接到“模型改變”的事件通知,因此它會隨著模型而更新,將模型更新的結(jié)果顯示給用戶。這種模式在單機(jī)且實(shí)時更新的應(yīng)用程序中可以起到很好的作用。3.3.2前端控制器和頁面控制器MVC也不是一成不變的,一種稍微有些不同的MVC實(shí)現(xiàn)已經(jīng)通過一些框架,譬如Microsoft的ASP.NET,流行起來了。在這種MVC中,并不是令分發(fā)器去尋找一個控制器并執(zhí)行之,而是直接到達(dá)視圖并且在繼續(xù)生成視圖之前調(diào)用相應(yīng)的控制器。與傳統(tǒng)的MVC模式中的前端控制器對應(yīng)這種模式成為頁面控制器。3.4為什么要使用Struts2在Web應(yīng)用中MVC如此的重要,那么在眾多的MVC框架中Struts為何能脫穎而出受到絕大部分程序員的青睞呢?首先是它的技術(shù)水平,Struts2由Struts和webwork共同發(fā)展而來,集中來兩者的優(yōu)勢于一身。其次是它在國內(nèi)的認(rèn)知度最高,在選擇框架的時候,選擇一個大家都普遍熟悉的框架來減少學(xué)習(xí)時間,無疑也是一個很重要的因素。3.4.1框架的意義框架可以極大地提高開發(fā)效率。為了能夠滿足用戶的需求并且應(yīng)對來自不斷改變的商業(yè)世界的挑戰(zhàn),在構(gòu)建Web應(yīng)用程序的時候充分發(fā)揮MVC設(shè)計(jì)模式的優(yōu)勢。絕大多數(shù)的開發(fā)人員并不會自己從零開始寫一個MVC框架,而是在已有框架(譬如Struts)的基礎(chǔ)上進(jìn)行改進(jìn)。RickardOberg(WebWork的創(chuàng)造者和JBoss創(chuàng)始人之一)曾經(jīng)說過:“框架的強(qiáng)大之處不是源自它能讓你做什么,而是它不能讓你做什么。”Rickard所說的話解釋了什么是框架:框架使混亂的東西變得結(jié)構(gòu)化。而Web應(yīng)用程序框架則鼓勵開發(fā)人員使用一系列框架所提供的基礎(chǔ)類和類庫,從而避免雜亂的JSP所造成的混亂。對句話可能對初學(xué)者更有意義,應(yīng)該最先學(xué)習(xí)和了解的應(yīng)該是最普通、最經(jīng)典的應(yīng)用,而用了框架就能保證開發(fā)和設(shè)計(jì)不會偏離正確的方向。3.4.2Struts2的優(yōu)勢由Struts2的發(fā)展過程我們可以看出,Struts2是集中了MVC領(lǐng)域最強(qiáng)大的兩個社區(qū)的力量,其技術(shù)水平可謂是絕無僅有。Struts2又是一個嶄新的項(xiàng)目,發(fā)展空間很大,當(dāng)前最新的技術(shù),最新的理念都包含著其中。使用了Struts2就相當(dāng)于站沿了JavaWeb開發(fā)的最前沿,將與Struts2共同前進(jìn)。在認(rèn)識度上Struts無疑是國內(nèi)影響力最大的,運(yùn)用到特別廣泛。以至于把Struts作為JavaWeb開發(fā)的必選框架來使用,也是Java開發(fā)人員的必備技能之一。另一種考慮,在項(xiàng)目中采用一種比較普遍的框架,也會免去開發(fā)人員的學(xué)習(xí)時間并降低風(fēng)險(xiǎn)。3.5小結(jié)本章介紹了在開發(fā)過程中運(yùn)用框架的意義,借助框架可以極大的提高效率、降低風(fēng)險(xiǎn)、優(yōu)化結(jié)構(gòu)。簡要回顧了Struts2的由來和發(fā)展歷程,Struts是MVC模式在Web應(yīng)用的最佳實(shí)踐,在技術(shù)上處于領(lǐng)導(dǎo)地位,在實(shí)際項(xiàng)目中被最廣泛使用。Struts是最成功的一個J2EE框架之一,非常值得了解和學(xué)習(xí)。第4章Struts2入門Struts一貫以結(jié)構(gòu)清晰、簡單易用而著稱,Struts2繼承了這一傳統(tǒng)。雖然復(fù)雜度提高了、功能上增強(qiáng)了,但在安裝和配置上甚至比前面的版本更簡單。Struts2還提供了豐富的實(shí)例程序,使初學(xué)者很容易上手,在由淺入深的學(xué)習(xí)中一點(diǎn)不會感覺困難。4.1下載與安裝Struts2本節(jié)將介紹如何下載和Struts2,并介紹Struts2包內(nèi)都包含哪些文件,各自有什么作用,以及如何在Tomcat中安裝Struts2。最后發(fā)布并測試Struts2自帶的例子驗(yàn)證Struts2安裝是否成功。4.1.1下載Struts2Struts2的安裝非常簡單,首先請到/struts下載struts2,應(yīng)該選擇完全發(fā)布版(FullDistribution),它包含必要的jar文件、自帶的例子和文檔,下載后得到的是一個zip文件,文件名為struts-2.XXX-all.zip,將zip包解開,可以看到4目錄分別為:(1)src為源代碼目錄,*.java文件在此存放。Struts2是一個開源項(xiàng)目,可在此目錄中所有的代碼。(2)docs為文檔目錄。(3)lib為Struts2提供庫目錄,里面是提供給開發(fā)人員的jar文件,在開發(fā)過程中需要把這些jar加入的CLASSPATH。發(fā)布的時候需要把這些jar文件拷貝到Web工程的WEB-INF/lib下。(4)apps為例子目錄,里面是Struts2給出的幾個例子都是*.war文件。4.1.2發(fā)布Struts2自帶的例子把a(bǔ)pps目錄下文件名為struts2-blank-2.0.11.war文件拷貝到Tomcat的webapps下。重新啟動Tomcat。直接訪問http://localhost:8080/struts2-blank-2.0.11/測試這個例子。4.2第一個Struts2程序本節(jié)將介紹如何使用Struts2來開發(fā)Web應(yīng)用,還是用一個HelloReader的例子來說明Struts2基礎(chǔ)配置和結(jié)構(gòu)。4.2.1配置web.xmlStruts2的配置非常簡單,在web.xml中配置Struts2提供的過濾器并把所有的請求(/*)都要經(jīng)過這個過濾器。如代碼所示。代碼Sturts2示例:web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-app<display-name>StrutsBlank</display-name><filter><!—添加filter--><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>注意:在Struts1.x中web.xml配置了一個全局的Servlet來執(zhí)行分發(fā)的,而在Struts2中是一個過濾器(Filter)。4.2.2編寫JSP界面在使用Struts2提供的標(biāo)簽庫之前需要在JSP中引入這個標(biāo)簽庫,前綴定義為“s”,如代碼所示,例子中用到了一個“property”標(biāo)簽來顯示message這個屬性值。代碼Sturts2示例:helloreader.jsp<!—引入Struts標(biāo)簽--><%@taglibprefix="s"uri="/struts-tags"%><html><head><title>HelloReader!</title></head><body><!—使用property標(biāo)簽來獲取Action中的屬性,直接顯示在頁面中-><h2><s:propertyvalue="message"/></h2></body></html>4.2.3編寫Action類Action類是最基本的邏輯處理單元,在MVC模式中分發(fā)器分發(fā)給不同的Action類,來處理請求。在Struts2中Action類不必再實(shí)現(xiàn)Action接口,可以是任何類。但一般的還是需要繼承ActionSupport類,后文中會講到,因?yàn)锳ctionSupport提供了很多很好的基本功能如錯誤信息處理等。4.2.4添加映射到配置文件Struts2的配置文件是struts.xml,所有請求和分發(fā)以及其他配置都在這個文件中定義,struts.xml文件應(yīng)該放在WEB-INF目錄下。在Struts1.x中這個文件的文件名為struts-config.xml,而在Webwork中這個文件名為xwork.xml。如代碼4-4所示,配置了一個名稱為HelloReader的action,處理類是tutorial.HelloReader,處理后的結(jié)果轉(zhuǎn)到HelloReader.jsp。4.3發(fā)布與測試本節(jié)將展示在Tomcat中如何發(fā)布一個借助Struts2框架開發(fā)的應(yīng)用程序,并展示測試結(jié)果。最后通過分析這個例子是如何工作的,說明Struts2各個模塊之間的關(guān)系,請求是如何在其間流轉(zhuǎn)的。4.3.1發(fā)布在Tomcat的webapps目錄下創(chuàng)建一個Web應(yīng)用目錄struts2,JSP文件應(yīng)該放在這個目錄下。在此目錄下創(chuàng)建子目錄WEB-INF,web.xml文件應(yīng)該在此目錄下。程序中編寫的類class文件和struts.xml文件應(yīng)該放在WEB-INF/classes目錄下,最重要的是要把Struts2提供的jar文件拷貝到WEB-INF/lib下,這樣在程序中才能引用到Struts2的API。4.3.2測試結(jié)果重新啟動Tomcat,訪問http://localhost:8080/struts2/HelloReader.action,4.3.3分析處理流程這個例子的處理流程如圖所示。4.4小結(jié)本章從Struts2的下載安裝開始敘述,以一個簡單的例子帶領(lǐng)讀者走入Struts2世界,并詳細(xì)解讀了Struts2最基本的業(yè)務(wù)處理流程:受用戶請求、處理業(yè)務(wù)邏輯和返回結(jié)果頁面。分析了請求如何在各個模塊中流轉(zhuǎn)。例子雖然簡單,但包含了Struts2的幾大要素,Action、標(biāo)簽庫、過濾器。下一章將詳細(xì)說明Struts2的這些核心概念。第5章Struts2的核心概念本章將深入探討了Struts2的核心概念,首先介紹的是Struts2的體系結(jié)構(gòu)和幾個重要的配置文件,并會舉例說明Struts2的核心對象如何配置。然后介紹Struts2最重要的3個組成部分Action、Result、Interceptor(攔截器)的原理和使用方法。5.1術(shù)語概述Action在Struts2中是負(fù)責(zé)Web應(yīng)用程序中具體邏輯實(shí)現(xiàn)的。Action是一個Java類,一般的繼承于com.opensymphony.xwork.ActionSupport類,這個類在Struts2的Dispatcher接受到HTTP請求的時候被調(diào)用。當(dāng)一個action執(zhí)行完畢之后,它將返回一個返回碼,譬如“SUCCESS”“INPUT”或者其他“返回代碼”。這些“返回代碼”通過查找struts.xml中的定義告訴Struts2下一步該做什么而這個下一步就稱為result。Struts2支持許多種不同的result類型,比如返回結(jié)果頁面給用戶??蛇x擇的顯示模板技術(shù)有JSP、Velocity或者是FreeMarker。5.2Struts2的體系結(jié)構(gòu)Struts2的核心體系結(jié)構(gòu)如圖5.1所示。用戶在Struts2框架下只需編寫自己的Action類來處理邏輯、編寫JSP頁面(或者其他方式)來展示用戶界面和在struts.xml配置映射關(guān)系就可以完成基本的業(yè)務(wù)流程。5.3Struts2的配置文件Struts2框架主要有兩個核心配置文件:perties和struts.xml。struts.xml與Struts1版本中的struts-config.xml非常類似,主要負(fù)責(zé)管理應(yīng)用中的Action映射,以及該Action包含的Result定義等,而perties文件則定義了Struts2框架的全局屬性。所有的配置文件說明見表所示,圖展示了幾個配置文件所在位置和相互關(guān)系。5.3.1全局配置文件--perties
perties文件是一個標(biāo)準(zhǔn)的Properties文件,該文件包含了系列的key-value對象,每個key就是一個Struts2屬性,該key對應(yīng)的value就是一個Struts2屬性值。perties文件通常放在Web應(yīng)用的WEB-INF/classes路徑下,實(shí)際上,只要將該文件放在Web應(yīng)用的CLASSPATH路徑下,Struts2框架就可以加載該文件。以下是一部分配置片段。struts.enable.DynamicMethodInvocation=false"struts.devMode=false5.3.2核心配置文件--struts.xmlstruts.xml文件主要負(fù)責(zé)管理應(yīng)用中的action映射,以及該action包含的result定義等。在perties配置中的有一項(xiàng)struts.configuration.files,這里可以看出struts.xml這個文件名不一定是固定的,可以配置為其他文件名的。struts.xml內(nèi)容主要包括:Action、Interceptor、Packages、Namespace等。后面的章節(jié)將詳細(xì)介紹如何配置這些元素。在struts.xml中可以使用<include>標(biāo)簽把內(nèi)容分到幾個文件中去。這里非常像JSP中的<jsp:include>動作標(biāo)簽,可以把其他文件的內(nèi)容導(dǎo)入進(jìn)來,被導(dǎo)入的每個配置文件必須和struts.xml文件有一樣的格式。<include>標(biāo)簽的格式如下所示。5.3.3struts.xml的缺省實(shí)現(xiàn)struts-default.xml這個文件被包含在struts2-core.jar中,文件名已經(jīng)可以看出這個文件的作用是struts.xml的缺省配置,它將自動被加載然后導(dǎo)入到struts.xml中去。代碼5-1是struts-default.xml的部分片段。5.3.4Velocity模板規(guī)則文件如果在程序中使用了Velocity(一個基于java的模板引擎,可以替代JSP作為顯示頁面)可以把文件perties放到classpath中去,系統(tǒng)將自動加載。同時還要配置struts-default.vm文件,代碼perties#Velocity資源定義.velocimacro.library=action-default.vm,tigris-macros.vm,myapp.vm5.4struts.xml的配置Struts2絕大多數(shù)的配置都是在struts.xml中完成的,學(xué)習(xí)struts.xml文件是學(xué)習(xí)使用struts2的基礎(chǔ)。本節(jié)將詳細(xì)講述如何在struts.xml中定義和配置各種元素。5.4.1action配置action是Struts2的基礎(chǔ)“工作單元”。配置一個基本的action只需要兩個信息:action名字和對應(yīng)的action類,這兩部分就建立了一個最簡單的action配置。屬性“method”用來告訴Struts2調(diào)用action的那個方法。在action處理之后一般的需要展示處理結(jié)果給用戶,所以還需要把a(bǔ)ction和result映射在一起。如代碼所示。代碼Action配置:struts.xml<!—Strutsaction配置--><actionname="helloWorld"class="example.HelloWorld"method=”doWork”><resultname="failure"path="Error.jsp"/><resultname=”ok”path="HelloWorld.jsp"/></action>5.4.2result配置Struts2定義了一些默認(rèn)result:error,input,login,none和success。開發(fā)者當(dāng)然也可以根據(jù)應(yīng)用情況自由的定義結(jié)果。結(jié)果以“名字-值”的形式影射到結(jié)果類型。result標(biāo)簽告訴Strtus2在action被調(diào)用以后下一步做什么。result在struts.xml文件中定義,嵌套在<action>標(biāo)簽里。如果location參數(shù)是唯一的參數(shù),可以這樣簡單的定義:<!—在result中添加參數(shù)--><actionname="bar"class="myPackage.barAction"><resultname="success"type="dispatcher"><paramname="location">foo.jsp</param></result></action>5.4.3攔截器(interceptor)配置interceptor是能在一個action執(zhí)行的前后執(zhí)行的代碼。它是做Web應(yīng)用程序時很有用的工具。最常見的由Interceptor實(shí)現(xiàn)的功能如:安全檢查(確保訪問者是登陸用戶)、跟蹤日志(記錄每個action)、效率瓶頸檢查(記錄每個action開始和結(jié)束的時間以檢查程序中的瓶頸)。也可以把interceptor連在一起組成interceptor棧(interceptor-stack)。比如在action執(zhí)行前同時做登陸檢查,安全檢查和記錄日志,可以定義一個interceptor的棧。interceptor必須事先定義好,然后可以連在一起組成一個棧。如代碼5-7所示,定義了一個interceptor和一個interceptor棧。5.4.4包(package)配置所謂packages就是把a(bǔ)ctions、results、results、types、interceptors這些元素打包到一個邏輯單元中去,從概念上講,packages就更像一個程序中的對象,可以被其他子包從寫,而且可以擁有自己獨(dú)立的部分。Name屬性是packages的必填元素,它作為一個關(guān)鍵字被后邊的包引用;extends元素是可選的,它允許包擴(kuò)展一個和多個前邊定義的包。Abstract元素是可選的,如抽象類和抽象函數(shù)一樣它是必須被繼承的,可以申明一個不包含actions的package。5.4.5命名空間(Namespace)配置命名空間屬性允許把a(bǔ)ction配置分成不同的命名空間,這樣可以使功能不同action中使用相同的名字。默認(rèn)命名空間用“”(空字符串)表示。如果系統(tǒng)在指定的命名空間中沒有找到某個action,就會到默認(rèn)命名空間中查找。可以在所有用"extends"擴(kuò)展的命名空間外配置全局action不指定命名空間。Struts2中有以“/”命名的根命名空間,它是請求直接來自應(yīng)用程序根路徑的時候的命名空間。和其他命名空間一樣,如果在根命名空間中沒有所需的action別名,系統(tǒng)會回到默認(rèn)命名空間中查找。如代碼5-9所示,這里使用了默認(rèn)命名空間、“/”和聲明了的命名空間“barspace”5.4.6在struts.xml中定義Bean在struts.xml中還可以作JavaBean的定義如下:s<!--在struts.xml中定義Bean><struts><beantype="com.opensymphony.xwork2.ObjectFactory"name="myfactory"class="pany.myapp.MyObjectFactory"/></struts>5.4.7在struts.xml中使用通配符當(dāng)配置文件中actionmapping的數(shù)量很多的時候,使用通配符是一個很好的辦法,可以將一些相似的mapping綁在一起,用一個比較通用的mapping來表示。在路徑中用*來代替變化的部分,而action的處理類和JSP中{1}剛好是代替這個變量。<!--在struts.xml中使用通配符--><actionname="/edit*”class="example.Edit{1}Action"><resultname="failure"path="/mainMenu.jsp"/><resultname=”ok”path="/\{1\}.jsp"/></action>5.5實(shí)現(xiàn)ActionAction是Struts2編程的核心部分,反映了對Web應(yīng)用程序的功能需求。Action在MVC模式中擔(dān)任控制部分的角色,在Struts2中也使用的最多。每個請求的動作都對應(yīng)于一個相應(yīng)的action,action還可以負(fù)責(zé)存儲數(shù)據(jù)/狀態(tài)(以getter和setter的方式)并且執(zhí)行邏輯處理。在本章中將關(guān)注如何實(shí)現(xiàn)action,以及action如何提供Web應(yīng)用程序中所需的通用功能。除了Action接口之外,Struts2的action也可以選擇實(shí)現(xiàn)其他可選擇的接口,從而使action能夠提供諸如國際化、校驗(yàn)、負(fù)責(zé)工作流和錯誤信息處理等功能。ActionSupport基類實(shí)現(xiàn)了Action接口并提供了大部分可選擇口默認(rèn)實(shí)現(xiàn),將在本章深入講述這個類。除此之外,也將探討action是如何通過使用JavaBean屬性提供輸入和輸出的,最后將介紹如何處理文件上傳。5.5.1實(shí)現(xiàn)Aciton接口Struts2的Action接口來源于WebWork,全包名為com.opensymphony.xwork2.Action如代碼5-10所示。在Struts2中定義action類時已經(jīng)可以不實(shí)現(xiàn)Aciton接口,Struts2會以反射的方式來調(diào)用action類。5.5.2擴(kuò)展ActionSupport類ActionSupport是一個讓action類能夠更快開始工作的基類。它包含了action能夠提供的許多可選服務(wù)的默認(rèn)實(shí)現(xiàn),讓開發(fā)者更容易地開始開發(fā)自己的action類,不需要在為這些可選服務(wù)提供具體實(shí)現(xiàn)了。同時能夠改寫可選擇接口的任意一個方法實(shí)現(xiàn)并保持其他方法的默認(rèn)實(shí)現(xiàn)。由于ActionSupport預(yù)建了許多開箱即用的功能,建議讀者創(chuàng)建自己的action時都擴(kuò)展ActionSupport類。ActionSupport實(shí)現(xiàn)了以下可選擇接口,5.5.3實(shí)現(xiàn)基本校驗(yàn)通常在執(zhí)行業(yè)務(wù)邏輯之前,校驗(yàn)用戶提供的數(shù)據(jù)是十分表要的。這種字段校驗(yàn)包括“某個字段是必須的”、“某個字段必須大于某個值,小于某個值“等內(nèi)容。為了自動執(zhí)行校驗(yàn),Sturts2提供了一種能夠在excuete()方法被調(diào)用之前調(diào)用其他方法對action進(jìn)行處理的機(jī)制,這個機(jī)制由com.opensymphony.xwork2.Validateable接口提供,它包含了一個方法:publicvoidvalidate()Validateable接口為action增加了一個標(biāo)記,通過以上方法使得action能夠自動被校驗(yàn)。保存和顯示校驗(yàn)的錯誤信息有接口ValidationAware來負(fù)責(zé),這兩個接口一般會同時使用。5.5.4使用本地的資源文件本節(jié)中將介紹另外兩個接口TextProvider和LocalProvider,它們都是為了使用本地的資源文件而設(shè)計(jì)的。在Java中用戶語言和地區(qū)的信息被封裝在java.util.Local類中,而action則通過一個定義與com.opensymphony.xwork.LocaleProvider接口的方法判斷使用哪個Locale獲取用于顯示的信息文本,這個接口中只定義了一個方法:PublicLocalegetLocale()在ActionSupport中,這個方法的默認(rèn)實(shí)現(xiàn)為:通過調(diào)用AcitonContext.getContext().getLocale()方法,利用ActionContext獲得locale的值(關(guān)于ActionContext的使用將在后面的章節(jié)詳細(xì)描述)。Struts2通過查詢HttpServletRequest對象并調(diào)用它的getLocale()方法將Local與action調(diào)用聯(lián)系起來。5.5.5用ActionContext與Web容器發(fā)生聯(lián)系在Action的接口定義中,excute()方法并沒有HttpServletRequest和HttpServletResponse參數(shù)也就是說Struts2的Action不用去依賴于任何Web容器(不像Struts1必須在Web容器中才能運(yùn)行),不用與那些JavaServlet復(fù)雜的請求(Request)、響應(yīng)(Response)關(guān)聯(lián)在一起。但在Web應(yīng)用程序開發(fā)中,往往需要在Action里直接獲取請求(Request)或會話(Session)的一些信息,甚至需要直接對JavaServletHttp的請求、響應(yīng)操作。Struts2提供了一個工具,用ActionContext對象來與Web容器發(fā)生聯(lián)系。ActionContext(com.opensymphony.xwork.ActionContext)是Action執(zhí)行時的上下文,上下文可以把它看作是一個Map,它存放是Action在執(zhí)行時需要用到的對象,比如:上下文放有請求的參數(shù)(Parameter)、會話(Session)、Servlet上下文(ServletContext)、本地化(Locale)信息等。在每次執(zhí)行Action之前都會創(chuàng)建新的ActionContext,ActionContext是線程安全的,也就是說在同一個線程里ActionContext里的屬性是唯一的,這樣的Action就可以在多線程中使用。5.5.6高級輸入應(yīng)用程序經(jīng)常使用JavaBean表示一個域中的對象,包括User、Address、Block在內(nèi)地的類就是這種JavaBean很好的例子。而在Web程序中很大一部工作都是將信息填充到這些對象中去和從Bean中獲取數(shù)據(jù)信息在網(wǎng)頁中表現(xiàn)。本節(jié)將以一個完整的實(shí)例來說明Sturts2在這些方面提供了那些便利。5.5.7使用Model-DrivenStruts2中,提供了兩種Action驅(qū)動模式:Property-Driven(屬性驅(qū)動),Model-Driven(模型驅(qū)動的)。模型驅(qū)動的Action很像Struts1中的FormBean,在傳遞過程中有一個單獨(dú)的值對象來作為參數(shù)的載體,但在Struts2中這個值對象不必再繼承任何接口,只要普通JavaBean就可以充當(dāng)模型部分。很多情況下Bean的定義已經(jīng)存在了,而且是不能修改的(如從外部引入的類或者是已經(jīng)被大量代碼引用的類),如果必須實(shí)現(xiàn)某個接口才能作為FromBean,不得不再新增一個類,Struts2的這個改進(jìn)非常及時。5.5.8使用Property-DrivenProperty-Driven就是Action將直接用自己的字段來充當(dāng)FormBean的功能,在Struts2入門一章中,HelloReader這個例子就是采用的這種方法,在Action中直接包含了message屬性和它set、get方法。它一般用在頁面表單比較簡單的情況使用,而且可以直接把屬性作為Action的字段,這樣就不用在另寫FormBean,減少了重復(fù)代碼。上一節(jié)的例子如果使用Property-Driven方法,那就是將User與action類合并定義,把User中的屬性值直接轉(zhuǎn)移到action中去,在配置文件中也不必再增加modelDriven這個過濾器。5.6Result類型介紹Result是在Action執(zhí)行完,一個結(jié)果返回后決定發(fā)生什么事的類。開發(fā)者可以自由的根據(jù)他們的應(yīng)用和環(huán)境的需要創(chuàng)建自己的Result類型。例如在Struts2中Servlet和Velocity結(jié)果類型已經(jīng)被創(chuàng)建用來顯示web應(yīng)用程序的畫面。本節(jié)將介紹Struts2內(nèi)置的幾種Result類型和如何自定義開發(fā)Result。5.6.1內(nèi)置Result類型所有的Result類型都實(shí)現(xiàn)了com.opensymphony.xwork.Result接口。這個接口是所有action執(zhí)行結(jié)果的通用接口,不管這個結(jié)果是用來顯示一個網(wǎng)頁還是產(chǎn)生一個E-mail,發(fā)送一個JMS消息還是別的。在struts-default.xml中定義了系統(tǒng)提供的缺省Result類型,把它們映射為action配置中可以引用的名字,在action配置就就不用再使用長類名直接使用這些別名就可以了。5.6.2默認(rèn)ResultDispatcherResult是最常用的一種result,它也是Struts2默認(rèn)的result,又稱為通用resut。action執(zhí)行完后,請求會導(dǎo)向?qū)?yīng)的View,相當(dāng)于<jsp:forword>標(biāo)簽實(shí)現(xiàn)的跳轉(zhuǎn)功能。將同一個HTTP請求中的內(nèi)容分發(fā)至某一個頁面(dispatcher類型的result的使用)只要配置文件包含了struts-default.xml,而且package繼承了struts-default,那么使用dispatcherresult并不需要其他設(shè)置。示例:<resultname="success"type="dispatcher"><paramname="location">foo.jsp</param></result>5.6.3頁面跳轉(zhuǎn)ResultRedirectResult與DispatcherResult作用類似也是實(shí)現(xiàn)頁面跳轉(zhuǎn)。對上次的響應(yīng)將重定向到指定的位置,可以理解為在客戶端跳轉(zhuǎn)用戶又重新請求了一個新的URL。redirect是重新產(chǎn)生一個新的request,因此原來request保存的東西將不再有效,比如不能通過再requet.getAtrribute()取得對象,也不能取得action的實(shí)例、errors、fielderrors等。RedirectResult與DispatcherResult的區(qū)別于源于JSP篇中<jsp:forward>標(biāo)簽與response.redeiret()的區(qū)別。5.6.4創(chuàng)建action鏈ChainResult是一種result類型,它基于自己的攔截器stack(堆棧)和result調(diào)用一個action,這樣允許一個action附帶著原來的狀態(tài)將請求轉(zhuǎn)到目標(biāo)actionStruts2提供把多個Action按照預(yù)先定義好的順序或者流程鏈接起來的能力。這個特性通過給指定的Action設(shè)置一個ChainResult,然后通過一個ChainingInterceptor攔截目標(biāo)Action來實(shí)現(xiàn)。5.6.5整合各種View技術(shù)Velocity、Freemarker、JasperReports、xslt這4種result都是為了整合不同的視圖技術(shù)而設(shè)計(jì)的。1.VelocityResult:Velocity是一個基于java的模板引擎(templateengine)。2.FreemarkerResult:Freemarker也是一個模板引擎,允許JavaServlet保持圖形設(shè)計(jì)同應(yīng)用程序邏輯的分離,這是通過在模板中密封HTML完成的。模板用servlet提供的數(shù)據(jù)動態(tài)地生成HTML。3.JasperReportsresult:JasperReports是一個基于Java的開源報(bào)表工具,它可以在Java環(huán)境下像其他IDE報(bào)表工具一樣來制作報(bào)表。4.XSLTResult:XSLTResult用XSLT來轉(zhuǎn)換action對象到XML。5.6.6自定義resultStruts2也允許用戶自定義自己的result類型,只要實(shí)現(xiàn)com.opensymphony.xwork2.Result接口就可以了。如代碼5-29所示,模擬了一種result作用是根據(jù)處理結(jié)果將給指用戶發(fā)送一份E-mail。這個result需要4個參數(shù)to、from、subject和body5.7攔截器(Interceptors)介紹攔截器(Interceptor)是Struts2的一個強(qiáng)有力的工具,有許多功能都是構(gòu)建于它之上,如國際化、轉(zhuǎn)換器,校驗(yàn)等。Interceptor是Struts2的一大特色,在執(zhí)行action之前和之后可以使請求通過一個或多個Interceptor。多個連接器組合在一起實(shí)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年羥乙腈項(xiàng)目可行性研究報(bào)告
- 項(xiàng)目部安全培訓(xùn)試題(重點(diǎn))
- 薪酬套改方案
- 車間員工安全培訓(xùn)試題及參考答案(滿分必刷)
- 培訓(xùn)班工作方案
- 材料、構(gòu)配件、設(shè)備保管方案
- 施工現(xiàn)場各種安全管理制度
- 水產(chǎn)養(yǎng)殖與沿海風(fēng)險(xiǎn)防控考核試卷
- 中國水粉畫顏料市場銷售趨勢與需求前景調(diào)研研究報(bào)告(2024-2030版)
- 中國木瓜酒行業(yè)競爭對手趨勢及發(fā)展規(guī)劃研究報(bào)告(2024-2030版)
- 中國移動鐵通公司招聘筆試題庫2024
- 醫(yī)院培訓(xùn)課件:《靜脈中等長度導(dǎo)管臨床應(yīng)用專家共識》
- 榆能集團(tuán)筆試考什么
- 2024廣西公需課高質(zhì)量共建“一帶一路”譜寫人類命運(yùn)共同體新篇章答案
- 2024年連云港專業(yè)技術(shù)人員繼續(xù)教育《飲食、運(yùn)動和健康的關(guān)系》92分(試卷)
- 學(xué)習(xí)總結(jié)報(bào)告成果展示
- IYB培訓(xùn)—成本核算ppt課件
- 英語教師行動研究案例
- 中國鐵塔股份有限公司室內(nèi)分布系統(tǒng)施工及驗(yàn)收規(guī)范
- 外協(xié)件產(chǎn)品技術(shù)開發(fā)協(xié)議
- 全國專業(yè)標(biāo)準(zhǔn)化技術(shù)委員會目錄
評論
0/150
提交評論