java基礎全套課件_第1頁
java基礎全套課件_第2頁
java基礎全套課件_第3頁
java基礎全套課件_第4頁
java基礎全套課件_第5頁
已閱讀5頁,還剩596頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第2章學習JSPJSP完全來以Java語言開發(fā),是純Java的應用。JSP經服務器轉換后與一般的Java類完全相同,而這一特性也使JSP具有了Java所具備的所有優(yōu)勢,如面向對象、簡單性、跨平臺等等。J2EE提供了良好的框架和指南,在此標準中開發(fā)程序層次更加清楚開發(fā)更有效率,產品的可用性、可移植性更好。本章將詳細介紹JSP的工作原理和如何使用JSP。2.1環(huán)境準備這一節(jié)里主要介紹如何安裝一個JSP運行環(huán)境,包括安裝JDK和安裝運行JSP的服務器Tomcat以及安裝開發(fā)工具MyEclipse。2.1.1安裝JDKJDK(JavaDevelopmentKit)java開發(fā)包,又叫做J2SE(Java2SDKStandardEdition),是SUN公司免費提供的,可以從SUN的Java網站上下載到,地址:/j2se/downloads.html,JDK當前最新的版本是J2SDK1.6,載頁面中列出了符合多種操作系統(tǒng)的JDK,這里應該選擇Windows平臺的JDK。下載好的JDK是一個可執(zhí)行安裝程序,可以自定義安裝路徑選擇只安裝某些組件,推薦全部按默認值安裝。2.1.2安裝TomcatTomcat是一個免費并且開源的JSP服務器,它是Apache軟件基金會的Jakarta項目中的一個核心項目,由Apache、SUN和其他一些公司及個人共同開發(fā)而成。由于有了SUN的參與和支持,最新的Servlet和JSP規(guī)范總是能在Tomcat中得到體現(xiàn)。因為Tomcat技術先進、性能穩(wěn)定,簡單易用,成為目前應用最廣泛的JSP服務器。本書所有例子都將以Tomcat為JSP服務器。2.1.3安裝MyEclipseEclipse是一種可擴展的開放源代碼集成開發(fā)環(huán)境。是一款非常受歡迎的Java開發(fā)工具,使用它開發(fā)人員是最多的。Eclipse的最大特點是它能接受各種開放源代碼插件。而MyEclipse是對Eclipse的擴展,集成了很多常用的經典插件,支持HTML,Struts,JSF,CSS,Javascript,SQL,Hibernate利用它可以在數(shù)據(jù)庫和J2EE的開發(fā)、發(fā)布,極大的提高工作效率。2.2第一個JSP程序本節(jié)介紹如何在Tomcat服務器上創(chuàng)建和發(fā)布JSP程序。這里首先講解Tomcat的目錄結構以及Web應用的目錄結構,接著介紹如何將JSP部署到Web應用中,運行第一個JSP程序并測試它。2.2.1JSP的工作原理JSP服務器管理JSP頁面有兩個階段:轉換階段(translationphase)和執(zhí)行階段(executionphase)。當有一個客戶請求到來時,JSP服務器檢驗JSP頁面的語法是否正確,將JSP頁面轉換為Servlet(Servlet就是用Java語言實現(xiàn)的CGI程序,后面章節(jié)將詳細介紹)源文件,然后調用javac工具類編譯Servlet源文件生成class文件,這一階段是轉換階段。2.2.2JSP目錄結構在Tomcat上發(fā)布Web應用之前,首先要了解Tomcat的目錄結構,參見這些目錄都是的子目錄,Tomcat6.0與以前的版本相比較對目錄結構做了很大改動,合并和簡化了一些目錄,現(xiàn)在的結構簡單而且清晰。2.2.3解讀web.xmlJavaWeb應用通過一個基于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é)詳細討論,本節(jié)側重于介紹JSP的發(fā)布過程。這兩個JSP文件都應放在應用jsp_example自己的目錄下。2.2.5發(fā)布與測試按上一節(jié)中表2-2Web應用的目錄結構表,在Tomcat的webapps目錄下創(chuàng)建目錄jsp_example,將寫好兩個jsp文件和web.xml文件放入指定目錄,重新啟動tomcat。訪問jsp可以看到結果。2.3JSP基本的語法JSP網頁主要分為腳本與網頁數(shù)據(jù)兩部分。網頁數(shù)據(jù)就是JSP服務器不處理的部分,例如:HTML的內容,會直接送到客戶端端執(zhí)行。腳本必須經由JSP服務器處理的部分,而大部分腳本都以XML作為語法基礎,并且大小寫必須要一致。腳本有4種類型:編譯指令、JSP腳本、動作標簽和表達式語言(ExpressionLanguage),其中表達式語言又簡稱為EL是JSP2.0新增的功能,將在后文的Struts2篇來介紹。2.3.1給JSP加注釋一般批注可分為兩種:一種為在客戶端顯示的批注;另外一種就是客戶端看不到,只給開發(fā)程序員專用的批注。(1)客戶端可以看到的批注,以“<!--”開頭以“-->”結尾,如:<!--comment[<%=expression%>]-->(2)開發(fā)程序員專用的批注,以“<%--”開頭以“--%>”結尾,如:<%--comment--%>2.3.2在JSP中聲明變量和函數(shù)在JSP程序中聲明是為了在JSP中聲明變量或者函數(shù),是以“<%!”開頭以“--%>”結尾,如:<%!declaration;[declaration;]+...%>2.3.3用JSP表達式輸出結果JSP表達式是以“<%=”為起始以“%>”為結尾,其中間內容包含一段合法的表達式,如:<%=expression%>前面章節(jié)中曾經使用JSP表達式:<fontsize=<%=i%>>讀者,您好!</font>歡迎:<%=request.getParameter("username")%>2.3.4用JSP腳本實現(xiàn)程序邏輯JSP腳本又稱為scriptlet是包含一個有效的程序段。是以“<%”開頭以“%>”結尾,如:<%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編譯指令和動作標簽編譯指令主要用來提供整個JSP網頁相關的信息,并且用來設定JSP網頁的相關屬性,例如:網頁的編碼方式、語法、信息等。起始符號為“<%@”,終止符號為“%>”中間部分就是一些指令和一連串的屬性設定。JSP有3編譯指令:page、include和taglib。動作標簽又稱為動作元素、動作指令,也可以理解為JSP自帶的標準標簽庫。動作標簽利用XML語法格式的標記來控制JSP服務器的行為。利用動作標簽可以動態(tài)地插入文件、重用JavaBean組件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼。起始符號為<jsp:xxx>,終止符號為</jsp:xxx>。2.4.1使用page指令page指令是最復雜的編譯指令,它的主要功能為設定整個JSP網頁的屬性和相關功能。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編譯時插入一個包含文本或代碼的文件,當使用include指令時,這個包含的過程是靜態(tài)的。也可以理解為不管要插入的文件內容是什么,簡單的把其中所有的內容拷貝過來合并成一個新文件,然后提交給JSP服務器做接下來的工作。由此可以看出,如果兩個文件中有重復的Java變量或函數(shù)定義,那么合并之后編譯要出錯,html的標簽也同樣會相互影響,要避免片段文件中有<html><body>之類的全局標簽出現(xiàn)。2.4.3用taglib指令引入標簽庫taglib指令能夠讓用戶自定義新的標簽。這里只是先做一個簡單介紹,在后面的章節(jié)再詳細介紹如何自定義標簽和如何使用標簽。taglib指令的語法如下:<%@tagliburi="tagLibraryURI"prefix="tagPrefix"%>2.4.4用forward標簽跳轉頁面forward動作把請求轉到另外的頁面。<jsp:forward>標簽只有一個屬性page。page屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態(tài)計算,如下面的例子所示:<jsp:forwardpage="/utils/errorReporter.jsp"/><jsp:forwardpage="<%=someJavaExpression%>"/>2.4.5動態(tài)插入文件<jsp:include>標簽把指定文件插入正在生成的頁面。其語法如下:<jsp:includepage="relativeURL"flush="true"/>所謂動態(tài)插入正是相對于前面已經介紹過靜態(tài)include指令,它是在JSP文件被轉換成Servlet的時候引入文件,而這里的<jsp:include>動作不同,插入文件的時間是在頁面被請求的時候。這里被插入的文件是一個完整的JSP文件而非片段,把兩個JSP輸出到客戶端的結果結合在一起,他們分別被JSP服務器轉化為兩個不同Java類,因此不存在變量定義方面的沖突。用<jsp:include>標簽引入文件的效率要稍微差一點,而且被引用文件不能包含某些JSP代碼(例如不能設置HTTP頭),但它的靈活性卻要好得多。2.4.6用標簽操作JavaBean本節(jié)將涉及3標簽,<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>。<jsp:useBean>標簽用來裝載一個將在JSP頁面中使用的JavaBean。這個功能非常有用,因為它使得開發(fā)人員既可以發(fā)揮Java組件重用的優(yōu)勢,同時也避免了損失直接在JSP實例化對象的復雜操作。<jsp:useBean>標簽最簡單的語法為:<jsp:useBeanid="name"class="package.class"/>2.4.7其他動作標簽<jsp:plugin>標簽用來根據(jù)瀏覽器的類型,插入通過Java插件運行JavaApplet所必需的OBJECT或EMBED元素。當JSP網頁被編譯后送往瀏覽器執(zhí)行時,<jsp:plugin>將會根據(jù)瀏覽器的版本替換成<object>標簽或者<embed>標簽。一般來說,<jsp:plugin>會指定對象Applet或Bean,同樣也會指定類的名字和位置,另外還會指定將從哪里下載這個Java組件。<jsp:fallback>一段文字用于:當不能啟動Applet或Bean時,那么瀏覽器會有一段錯誤信息。2.5JSP的內置對象內置對象也稱內建對象、隱含對象是不需要聲明,直接可以在JSP中使用的Java對象。JSP基于Java語言,面向對象也是它的一大特色。JSP的內置對象就是把最常用最重要的幾個對象直接創(chuàng)建然后內置了,用戶無需再顯示的用代碼聲明,用好JSP內置對象是JSP編程的精髓。JSP有以下九個內置對象:request、response、out、pageContext、session、application、config、page、exception本節(jié)將分別講述如何使用這些對象。2.5.1使用request對象獲取請求request是最常用的內置對象。表示javax.servlet.http.HttpServletRequest對象request對象包含所有請求的信息,如請求的來源、標頭、cookies和請求相關的參數(shù)值等。比較常用的方法:(1)ObjectgetAttribute(Stringname):返回由name指定的屬性值,該屬性不存在時返回null。(2)voidsetAttribute(Stringname,Objectvalue):在屬性列表中添加/刪除指定的屬性。(3)StringgetParameter(Stringname):獲取客戶端發(fā)送給服務器端的參數(shù)值。(4)String[]getParameterValues(Stringname):獲得請求中指定參數(shù)的所有值。(5)StringgetProtocol():返回請求使用的協(xié)議??梢允荋TTP1.1或者HTTP1.0。(6)StringRequestURI():返回發(fā)出請求的客戶端地址,但是不包括請求的參數(shù)字符串。(7)StringgetRemoteAddr():獲取發(fā)出請求的客戶端IP地址。(8)HttpSessiongetSession():獲取session。2.5.2使用response對象做應答response表示HttpServletResponse對象,并提供了幾個用于設置送回瀏覽器的響應的方法,如比較常見的方法:(1)sendRedirect(URL):可以將用戶重定向到一個不同的頁面(URL)。(2)setContenType(Stringtype):響應設置內容類型頭。(3)addHeader(Stringname,Stringvalue):添加String類型的值到HTTP文件頭2.5.3在session對象中保存用戶會話session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態(tài)信息。session在第一個JSP頁面被裝載時自動創(chuàng)建,完成會話期管理。從一個客戶打開瀏覽器并連接到服務器開始,到客戶關閉瀏覽器離開這個服務器結束,被稱為一個會話。當一個客戶訪問一個服務器時,可能會在這個服務器的幾個頁面之間反復連接,反復刷新一個頁面,服務器應當通過某種辦法(比如cookie)知道這是同一個客戶,這就需要session對象。2.5.4application對象、pageContext對象和JSP的Scope服務器啟動后就產生了這個application對象,當客戶再所訪問的網站的各個頁面之間瀏覽時,這個application對象都是同一個,可以理解為在一個應用中applications對象是一個全局的Map。pageContext與application對象類似有setAttribute()和getAttribute()方法來保存對象只是它的范圍只限于本網頁內。這里提到JSP的范圍(scope),分別為Page、Request、Session、Application。在這4個范圍分別有pageContext,request,session,appliaction4個內置對象對應用來保存對象,方法名都是setAttribute()和getAttribute()。范圍的概念十分重要,很多配置都有范圍這一屬性。2.5.5使用out對象輸出out對象是javax.jsp.JspWriter的一個實例,是一個輸出流,用來向客戶端輸出數(shù)據(jù)。out對象用于各種數(shù)據(jù)的輸出。常用方法如下:(1)out.print():輸出各種類型數(shù)據(jù)。(2)out.newLine():輸出一個換行符。(3)out.close():關閉流。2.5.6在exception對象中處理異常Exception對象用作處理JSP文件執(zhí)行時發(fā)生的錯誤和異常只有在錯誤頁面里才可以使用,前提是:在頁面指令里要有isErrorPage=true的頁面中;如:<%@pagecontentType="text/html;charset=gb2312"isErrorPage="true"%>則:在此頁面中頁面中便可使用exception內置對象,用法如下:<%=exception.getMessage()%>2.5.7page對象和config對象page表示從該頁面產生的一個Servlet實例,相當于這個JSP產生Servlet類的this,可以通過page對象訪問實例的屬性和函數(shù)config表示一個javax.servlet.ServletConfig對象。該對象用于存取Servlet實例的初始化參數(shù)。常用方法如下:(1)StringgetInitParameter(Stringname):返回名稱為name的促使參數(shù)的值。(2)EnumerationgetInitParameters():返回這個JSP所有的促使參數(shù)的名稱集合。(3)ServletContextgetContext():返回執(zhí)行者的Servlet上下文。(4)StringgetServletName():返回Servlet的名稱。2.6Servlet就當時功能來說,Servlet所提供的功能就是一個Java版本的CGI。它依舊是一個具有跨平臺特性、100%純Java的Server-Side程序。JavaServletAPI定義了Servlet和服務器之間的一個標準接口,這使得Servlet具有跨服務器平臺的特性。2.6.1Servlet簡介Servlet通過創(chuàng)建一個框架擴展服務器的能力,采用請求-響應模式提供Web服務。當客戶機發(fā)送請求至服務器時,服務器將請求信息發(fā)送給Servlet,Servlet生成響應內容并將其傳給Server服務器,然后再由Server服務器將響應返回給客戶端。圖展示了Servlet的生命周期,定義了一個Servlet如何被加載、初始化,以及它怎樣提供服務和最后銷毀的過程。2.6.2創(chuàng)建Servlet所有的Servlet必須直接或間接地實現(xiàn)javax.servlet.Servlet接口,這樣才能在Servlet服務器或稱為Servlet容器、Servlet引擎上運行,更簡單的方法是繼承HttpServlet類。功能是在用戶請求中獲取name參數(shù),然后向客戶端輸出一個HTML網頁。2.6.3過濾器(Filter)一個過濾器是一個可以傳送請求或修改響應的對象。過濾器并不是Servlet,他們并不實際創(chuàng)建一個請求。他們是請求到達一個Servlet前的預處理程序,在響應離開Servlet后的后處理程序。就像你將在后面的例子中看到的,一個過濾器能夠做如下工作。(1)在一個Servlet被調用前截獲該調用。(2)在一個Servlet被調用前檢查請求。(3)修改在實際請求中提供了可定制請求對象的請求頭和請求數(shù)據(jù)。(4)修改在實際響應中提供了可定制響應對象的響應頭和響應數(shù)據(jù)。(5)在一個Servlet被調用之后截獲該調用。2.6.4監(jiān)聽器(Listener)監(jiān)聽器可以監(jiān)聽客戶端的請求、服務端的操作等。通過監(jiān)聽器,可以自動激發(fā)一些操作,如監(jiān)聽在線用戶數(shù)量,當增加一個HttpSession時,給在線人數(shù)加1。監(jiān)聽器還有一個好處是可以在不修改現(xiàn)有系統(tǒng)基礎上,增加Web應用程序生命周期事件的跟蹤。編寫監(jiān)聽器需要實現(xiàn)相應的接口,常用的監(jiān)聽接口:(1)ServletContextAttributeListener監(jiān)聽對ServletContext屬性的操作,比如增加/刪除/修改。(2)ServletContextListener監(jiān)聽ServletContext,當創(chuàng)建ServletContext時,激發(fā)contextInitialized方法;當銷毀ServletContext時,激發(fā)contextDestroyed方法。(3)HttpSessionListener監(jiān)聽HttpSession的操作。當創(chuàng)建一個Session時,激發(fā)sessionCreated方法;當銷毀一個Session時,激發(fā)sessionDestroye方法。(4)HttpSessionAttributeListener2.7自定義JSP標簽前面的章節(jié)介紹了JSP的動作標簽,使用標簽可以處理定向請求以簡化JSP頁面開發(fā)與維護。JSP技術提供了一種封裝其它動態(tài)類型的機制——自定義標簽,它擴展了JSP語言。自定義標簽通常發(fā)布在標簽庫中,該庫定義了一個自定義標簽集并包含實現(xiàn)標簽的對象。一些功能可以通過自定義標簽來實現(xiàn),包括對隱含對象的操作,處理表單,訪問數(shù)據(jù)庫集其它企業(yè)級服務,如e-mail,目錄服務,處理流控制。很多JSP開發(fā)框架如Struts都提供了豐富的標簽庫,本節(jié)將以一個“helloreader”的例子來介紹如何自定義JSP標簽。2.7.1標簽庫簡介標簽庫涉及到4個基本概念:(1)標簽(Tag)(2)標簽庫(Taglibrary)(3)標簽庫描述文件(TagLibraryDescriptor)(4)標簽處理類(TagHandleClass)2.7.2創(chuàng)建標簽的處理類標簽處理類必須實現(xiàn)Tag接口的doStartTag和doEndTag方法。當jsp引擎碰到tag標簽的開頭時,doStartTag被調用,因為簡單的tag沒有body,所以此方法將返回SKIP_BODY。當JSP引擎碰到tag標簽的結尾時,doEndTag被調用,如果余下的頁面還要被計算,那它將返回EVAL_PAGE,否則將會返回SKIP_PAGE。一般的做法是不必直接實現(xiàn)Tag接口而是實現(xiàn)TagSupport類,如代碼此簽的作用是打印字符串“Hello.Reader”。2.7.3創(chuàng)建標簽庫描述文件標簽庫文件(TagLibraryDescrptorFile)簡稱TLD文件是用xml語言描述的。TLD包括了標簽庫中所有標簽的描述,它一般用來被JSP服務器用來校驗標簽的語法正確性,或者被JSP開發(fā)者用來開發(fā)新的標簽。TLD的文件擴展名必須為.tld,而且必須放在當前Web應用的WEB-INF目錄或其子目錄中。如代碼與上一節(jié)中的處理類配合形成一個完整的標簽。2.7.4使用自定義標簽首先要配置web.xml使用自定義標簽<taglib>。<taglib-uri>/WEB-INF/helloreader.tld</taglib-uri><!—加載標簽,供頁面中使用--><taglib-location>/WEB-INF/helloreader.tld</taglib-location></taglib>2.7.5JSP2.0中新增的標簽定義方法JSP2.0提供一些較為簡單的方法,讓開發(fā)人員來撰寫自定義標簽。JSP2.0提供兩種新的機制,分別為SimpleTag和TagFile。SimpleTagSupport類別顧名思義,就是可以處理一些簡單的自訂標簽需求,它是在JSP2.0之后新增的類別,對于一些簡單的自訂標簽頁求,您可以繼承它來實作標簽處理類別,而不用為了處理一些TagSupport、BodyTagSuppourt類別中回傳值的問題。2.8小結本章詳細介紹JSP開發(fā)的基礎知識,包括JSP語法、JSP指令和標簽、JSP內置對象、自定義標簽。JSP和Servlet是用Java開發(fā)Web應用的基礎,是J2EE的重要的組成部分。在最后兩節(jié)里我們介紹了Servlet、過濾器和自定義標簽,很多開發(fā)框架包括后文會介紹的Struts和Spring都為開發(fā)人員提供了很多功能強大的過濾器和標簽庫。第3章Struts2概述Struts這個名字來源于在建筑和舊式飛機中使用的支持金屬架。顧名思義它給開發(fā)者提供了一個基本框架和眾多組件,那么在此框架下生產出的產品必然大量節(jié)省時間而且產品趨于標準化的,這也正是Struts項目的目的所在。Struts能充分滿足應用開發(fā)的需求,簡單易用,敏捷迅速,成為最成功的J2EE框架之一。3.1Struts項目簡介Struts是Apache基金會Jakarta項目組的一個開源項目,它采用MVC模式,能夠很好地幫助Java開發(fā)者利用J2EE開發(fā)Web應用,它能大量減少開發(fā)Web應用的時間,提高產品的重用度。Struts主要是采用Servlet和JSP技術來實現(xiàn)的,它把Servlet、JSP、自定義標簽和信息資源(messageresources)整合到一個統(tǒng)一的框架中,Struts它只有一個中心控制器,他采用XML定制轉向的URL,采用Action來處理邏輯,開發(fā)人員利用其進行開發(fā)時不用再自己編碼實現(xiàn)全套MVC模式。Struts跟Tomcat、Velocity等諸多Apache項目一樣是開源軟件,這是它的一大優(yōu)點,使開發(fā)者能更深入的了解其內部實現(xiàn)機制。3.2Struts2的前世今生經過多年的發(fā)展,Struts已經成為一個高度成熟的框架,不管是穩(wěn)定性還是可靠性,都得到了廣泛的證明。在國內Struts是使用最廣泛的一個框架,也成為Java程序員一項基本技能。但畢竟Struts誕生于很多年前,近期Ajax、JSF技術的興起,原有設計上的缺陷成為它的硬傷,Struts有點跟不上時代的步伐一些。大量新的MVC框架成了Struts強大的在競爭者,最有代表性的莫過于WebWork。WebWork是由OpenSymphony組織開發(fā)的,也是致力于組件化和代碼重用的J2EEWeb框架。后來Struts與WebWork兩大社區(qū)決定將兩個項目合并,稱為Sturts2。3.3Web世界中的MVC本節(jié)將著重講述Web世界中MVC模式是如何應用的,與傳統(tǒng)的C/S結構中MVC模式有哪些區(qū)別。另外,以網頁為視圖也為MVC帶來了一些變化和發(fā)展,產生了新的處理方式前端控制器和頁面控制器。3.3.1MVC在Web中的發(fā)展在經典MVC中的事件流中,用戶與視圖(View)進行交互,填入數(shù)據(jù)并單擊按鈕,控制器(Controller)接收到來自視圖的事件并對模型(Model)進行操作,根據(jù)用戶提供的數(shù)據(jù)更新模型(Model)。視圖也會接到“模型改變”的事件通知,因此它會隨著模型而更新,將模型更新的結果顯示給用戶。這種模式在單機且實時更新的應用程序中可以起到很好的作用。3.3.2前端控制器和頁面控制器MVC也不是一成不變的,一種稍微有些不同的MVC實現(xiàn)已經通過一些框架,譬如Microsoft的ASP.NET,流行起來了。在這種MVC中,并不是令分發(fā)器去尋找一個控制器并執(zhí)行之,而是直接到達視圖并且在繼續(xù)生成視圖之前調用相應的控制器。與傳統(tǒng)的MVC模式中的前端控制器對應這種模式成為頁面控制器。3.4為什么要使用Struts2在Web應用中MVC如此的重要,那么在眾多的MVC框架中Struts為何能脫穎而出受到絕大部分程序員的青睞呢?首先是它的技術水平,Struts2由Struts和webwork共同發(fā)展而來,集中來兩者的優(yōu)勢于一身。其次是它在國內的認知度最高,在選擇框架的時候,選擇一個大家都普遍熟悉的框架來減少學習時間,無疑也是一個很重要的因素。3.4.1框架的意義框架可以極大地提高開發(fā)效率。為了能夠滿足用戶的需求并且應對來自不斷改變的商業(yè)世界的挑戰(zhàn),在構建Web應用程序的時候充分發(fā)揮MVC設計模式的優(yōu)勢。絕大多數(shù)的開發(fā)人員并不會自己從零開始寫一個MVC框架,而是在已有框架(譬如Struts)的基礎上進行改進。RickardOberg(WebWork的創(chuàng)造者和JBoss創(chuàng)始人之一)曾經說過:“框架的強大之處不是源自它能讓你做什么,而是它不能讓你做什么。”Rickard所說的話解釋了什么是框架:框架使混亂的東西變得結構化。而Web應用程序框架則鼓勵開發(fā)人員使用一系列框架所提供的基礎類和類庫,從而避免雜亂的JSP所造成的混亂。對句話可能對初學者更有意義,應該最先學習和了解的應該是最普通、最經典的應用,而用了框架就能保證開發(fā)和設計不會偏離正確的方向。3.4.2Struts2的優(yōu)勢由Struts2的發(fā)展過程我們可以看出,Struts2是集中了MVC領域最強大的兩個社區(qū)的力量,其技術水平可謂是絕無僅有。Struts2又是一個嶄新的項目,發(fā)展空間很大,當前最新的技術,最新的理念都包含著其中。使用了Struts2就相當于站沿了JavaWeb開發(fā)的最前沿,將與Struts2共同前進。在認識度上Struts無疑是國內影響力最大的,運用到特別廣泛。以至于把Struts作為JavaWeb開發(fā)的必選框架來使用,也是Java開發(fā)人員的必備技能之一。另一種考慮,在項目中采用一種比較普遍的框架,也會免去開發(fā)人員的學習時間并降低風險。3.5小結本章介紹了在開發(fā)過程中運用框架的意義,借助框架可以極大的提高效率、降低風險、優(yōu)化結構。簡要回顧了Struts2的由來和發(fā)展歷程,Struts是MVC模式在Web應用的最佳實踐,在技術上處于領導地位,在實際項目中被最廣泛使用。Struts是最成功的一個J2EE框架之一,非常值得了解和學習。第4章Struts2入門Struts一貫以結構清晰、簡單易用而著稱,Struts2繼承了這一傳統(tǒng)。雖然復雜度提高了、功能上增強了,但在安裝和配置上甚至比前面的版本更簡單。Struts2還提供了豐富的實例程序,使初學者很容易上手,在由淺入深的學習中一點不會感覺困難。4.1下載與安裝Struts2本節(jié)將介紹如何下載和Struts2,并介紹Struts2包內都包含哪些文件,各自有什么作用,以及如何在Tomcat中安裝Struts2。最后發(fā)布并測試Struts2自帶的例子驗證Struts2安裝是否成功。4.1.1下載Struts2Struts2的安裝非常簡單,首先請到/struts下載struts2,應該選擇完全發(fā)布版(FullDistribution),它包含必要的jar文件、自帶的例子和文檔,下載后得到的是一個zip文件,文件名為struts-2.XXX-all.zip,將zip包解開,可以看到4目錄分別為:(1)src為源代碼目錄,*.java文件在此存放。Struts2是一個開源項目,可在此目錄中所有的代碼。(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自帶的例子把apps目錄下文件名為struts2-blank-2.0.11.war文件拷貝到Tomcat的webapps下。重新啟動Tomcat。直接訪問http://localhost:8080/struts2-blank-2.0.11/測試這個例子。4.2第一個Struts2程序本節(jié)將介紹如何使用Struts2來開發(fā)Web應用,還是用一個HelloReader的例子來說明Struts2基礎配置和結構。4.2.1配置web.xmlStruts2的配置非常簡單,在web.xml中配置Struts2提供的過濾器并把所有的請求(/*)都要經過這個過濾器。如代碼所示。代碼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提供的標簽庫之前需要在JSP中引入這個標簽庫,前綴定義為“s”,如代碼所示,例子中用到了一個“property”標簽來顯示message這個屬性值。代碼Sturts2示例:helloreader.jsp<!—引入Struts標簽--><%@taglibprefix="s"uri="/struts-tags"%><html><head><title>HelloReader!</title></head><body><!—使用property標簽來獲取Action中的屬性,直接顯示在頁面中-><h2><s:propertyvalue="message"/></h2></body></html>4.2.3編寫Action類Action類是最基本的邏輯處理單元,在MVC模式中分發(fā)器分發(fā)給不同的Action類,來處理請求。在Struts2中Action類不必再實現(xiàn)Action接口,可以是任何類。但一般的還是需要繼承ActionSupport類,后文中會講到,因為ActionSupport提供了很多很好的基本功能如錯誤信息處理等。4.2.4添加映射到配置文件Struts2的配置文件是struts.xml,所有請求和分發(fā)以及其他配置都在這個文件中定義,struts.xml文件應該放在WEB-INF目錄下。在Struts1.x中這個文件的文件名為struts-config.xml,而在Webwork中這個文件名為xwork.xml。如代碼4-4所示,配置了一個名稱為HelloReader的action,處理類是tutorial.HelloReader,處理后的結果轉到HelloReader.jsp。4.3發(fā)布與測試本節(jié)將展示在Tomcat中如何發(fā)布一個借助Struts2框架開發(fā)的應用程序,并展示測試結果。最后通過分析這個例子是如何工作的,說明Struts2各個模塊之間的關系,請求是如何在其間流轉的。4.3.1發(fā)布在Tomcat的webapps目錄下創(chuàng)建一個Web應用目錄struts2,JSP文件應該放在這個目錄下。在此目錄下創(chuàng)建子目錄WEB-INF,web.xml文件應該在此目錄下。程序中編寫的類class文件和struts.xml文件應該放在WEB-INF/classes目錄下,最重要的是要把Struts2提供的jar文件拷貝到WEB-INF/lib下,這樣在程序中才能引用到Struts2的API。4.3.2測試結果重新啟動Tomcat,訪問http://localhost:8080/struts2/HelloReader.action,4.3.3分析處理流程這個例子的處理流程如圖所示。4.4小結本章從Struts2的下載安裝開始敘述,以一個簡單的例子帶領讀者走入Struts2世界,并詳細解讀了Struts2最基本的業(yè)務處理流程:受用戶請求、處理業(yè)務邏輯和返回結果頁面。分析了請求如何在各個模塊中流轉。例子雖然簡單,但包含了Struts2的幾大要素,Action、標簽庫、過濾器。下一章將詳細說明Struts2的這些核心概念。第5章Struts2的核心概念本章將深入探討了Struts2的核心概念,首先介紹的是Struts2的體系結構和幾個重要的配置文件,并會舉例說明Struts2的核心對象如何配置。然后介紹Struts2最重要的3個組成部分Action、Result、Interceptor(攔截器)的原理和使用方法。5.1術語概述Action在Struts2中是負責Web應用程序中具體邏輯實現(xiàn)的。Action是一個Java類,一般的繼承于com.opensymphony.xwork.ActionSupport類,這個類在Struts2的Dispatcher接受到HTTP請求的時候被調用。當一個action執(zhí)行完畢之后,它將返回一個返回碼,譬如“SUCCESS”“INPUT”或者其他“返回代碼”。這些“返回代碼”通過查找struts.xml中的定義告訴Struts2下一步該做什么而這個下一步就稱為result。Struts2支持許多種不同的result類型,比如返回結果頁面給用戶。可選擇的顯示模板技術有JSP、Velocity或者是FreeMarker。5.2Struts2的體系結構Struts2的核心體系結構如圖5.1所示。用戶在Struts2框架下只需編寫自己的Action類來處理邏輯、編寫JSP頁面(或者其他方式)來展示用戶界面和在struts.xml配置映射關系就可以完成基本的業(yè)務流程。5.3Struts2的配置文件Struts2框架主要有兩個核心配置文件:perties和struts.xml。struts.xml與Struts1版本中的struts-config.xml非常類似,主要負責管理應用中的Action映射,以及該Action包含的Result定義等,而perties文件則定義了Struts2框架的全局屬性。所有的配置文件說明見表所示,圖展示了幾個配置文件所在位置和相互關系。5.3.1全局配置文件--perties

perties文件是一個標準的Properties文件,該文件包含了系列的key-value對象,每個key就是一個Struts2屬性,該key對應的value就是一個Struts2屬性值。perties文件通常放在Web應用的WEB-INF/classes路徑下,實際上,只要將該文件放在Web應用的CLASSPATH路徑下,Struts2框架就可以加載該文件。以下是一部分配置片段。struts.enable.DynamicMethodInvocation=false"struts.devMode=false5.3.2核心配置文件--struts.xmlstruts.xml文件主要負責管理應用中的action映射,以及該action包含的result定義等。在perties配置中的有一項struts.configuration.files,這里可以看出struts.xml這個文件名不一定是固定的,可以配置為其他文件名的。struts.xml內容主要包括:Action、Interceptor、Packages、Namespace等。后面的章節(jié)將詳細介紹如何配置這些元素。在struts.xml中可以使用<include>標簽把內容分到幾個文件中去。這里非常像JSP中的<jsp:include>動作標簽,可以把其他文件的內容導入進來,被導入的每個配置文件必須和struts.xml文件有一樣的格式。<include>標簽的格式如下所示。5.3.3struts.xml的缺省實現(xiàn)struts-default.xml這個文件被包含在struts2-core.jar中,文件名已經可以看出這個文件的作用是struts.xml的缺省配置,它將自動被加載然后導入到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中完成的,學習struts.xml文件是學習使用struts2的基礎。本節(jié)將詳細講述如何在struts.xml中定義和配置各種元素。5.4.1action配置action是Struts2的基礎“工作單元”。配置一個基本的action只需要兩個信息:action名字和對應的action類,這兩部分就建立了一個最簡單的action配置。屬性“method”用來告訴Struts2調用action的那個方法。在action處理之后一般的需要展示處理結果給用戶,所以還需要把action和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定義了一些默認result:error,input,login,none和success。開發(fā)者當然也可以根據(jù)應用情況自由的定義結果。結果以“名字-值”的形式影射到結果類型。result標簽告訴Strtus2在action被調用以后下一步做什么。result在struts.xml文件中定義,嵌套在<action>標簽里。如果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應用程序時很有用的工具。最常見的由Interceptor實現(xiàn)的功能如:安全檢查(確保訪問者是登陸用戶)、跟蹤日志(記錄每個action)、效率瓶頸檢查(記錄每個action開始和結束的時間以檢查程序中的瓶頸)。也可以把interceptor連在一起組成interceptor棧(interceptor-stack)。比如在action執(zhí)行前同時做登陸檢查,安全檢查和記錄日志,可以定義一個interceptor的棧。interceptor必須事先定義好,然后可以連在一起組成一個棧。如代碼5-7所示,定義了一個interceptor和一個interceptor棧。5.4.4包(package)配置所謂packages就是把actions、results、results、types、interceptors這些元素打包到一個邏輯單元中去,從概念上講,packages就更像一個程序中的對象,可以被其他子包從寫,而且可以擁有自己獨立的部分。Name屬性是packages的必填元素,它作為一個關鍵字被后邊的包引用;extends元素是可選的,它允許包擴展一個和多個前邊定義的包。Abstract元素是可選的,如抽象類和抽象函數(shù)一樣它是必須被繼承的,可以申明一個不包含actions的package。5.4.5命名空間(Namespace)配置命名空間屬性允許把action配置分成不同的命名空間,這樣可以使功能不同action中使用相同的名字。默認命名空間用“”(空字符串)表示。如果系統(tǒng)在指定的命名空間中沒有找到某個action,就會到默認命名空間中查找??梢栽谒杏?extends"擴展的命名空間外配置全局action不指定命名空間。Struts2中有以“/”命名的根命名空間,它是請求直接來自應用程序根路徑的時候的命名空間。和其他命名空間一樣,如果在根命名空間中沒有所需的action別名,系統(tǒng)會回到默認命名空間中查找。如代碼5-9所示,這里使用了默認命名空間、“/”和聲明了的命名空間“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中使用通配符當配置文件中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實現(xiàn)ActionAction是Struts2編程的核心部分,反映了對Web應用程序的功能需求。Action在MVC模式中擔任控制部分的角色,在Struts2中也使用的最多。每個請求的動作都對應于一個相應的action,action還可以負責存儲數(shù)據(jù)/狀態(tài)(以getter和setter的方式)并且執(zhí)行邏輯處理。在本章中將關注如何實現(xiàn)action,以及action如何提供Web應用程序中所需的通用功能。除了Action接口之外,Struts2的action也可以選擇實現(xiàn)其他可選擇的接口,從而使action能夠提供諸如國際化、校驗、負責工作流和錯誤信息處理等功能。ActionSupport基類實現(xiàn)了Action接口并提供了大部分可選擇口默認實現(xiàn),將在本章深入講述這個類。除此之外,也將探討action是如何通過使用JavaBean屬性提供輸入和輸出的,最后將介紹如何處理文件上傳。5.5.1實現(xiàn)Aciton接口Struts2的Action接口來源于WebWork,全包名為com.opensymphony.xwork2.Action如代碼5-10所示。在Struts2中定義action類時已經可以不實現(xiàn)Aciton接口,Struts2會以反射的方式來調用action類。5.5.2擴展ActionSupport類ActionSupport是一個讓action類能夠更快開始工作的基類。它包含了action能夠提供的許多可選服務的默認實現(xiàn),讓開發(fā)者更容易地開始開發(fā)自己的action類,不需要在為這些可選服務提供具體實現(xiàn)了。同時能夠改寫可選擇接口的任意一個方法實現(xiàn)并保持其他方法的默認實現(xiàn)。由于ActionSupport預建了許多開箱即用的功能,建議讀者創(chuàng)建自己的action時都擴展ActionSupport類。ActionSupport實現(xiàn)了以下可選擇接口,5.5.3實現(xiàn)基本校驗通常在執(zhí)行業(yè)務邏輯之前,校驗用戶提供的數(shù)據(jù)是十分表要的。這種字段校驗包括“某個字段是必須的”、“某個字段必須大于某個值,小于某個值“等內容。為了自動執(zhí)行校驗,Sturts2提供了一種能夠在excuete()方法被調用之前調用其他方法對action進行處理的機制,這個機制由com.opensymphony.xwork2.Validateable接口提供,它包含了一個方法:publicvoidvalidate()Validateable接口為action增加了一個標記,通過以上方法使得action能夠自動被校驗。保存和顯示校驗的錯誤信息有接口ValidationAware來負責,這兩個接口一般會同時使用。5.5.4使用本地的資源文件本節(jié)中將介紹另外兩個接口TextProvider和LocalProvider,它們都是為了使用本地的資源文件而設計的。在Java中用戶語言和地區(qū)的信息被封裝在java.util.Local類中,而action則通過一個定義與com.opensymphony.xwork.LocaleProvider接口的方法判斷使用哪個Locale獲取用于顯示的信息文本,這個接口中只定義了一個方法:PublicLocalegetLocale()在ActionSupport中,這個方法的默認實現(xiàn)為:通過調用AcitonContext.getContext().getLocale()方法,利用ActionContext獲得locale的值(關于ActionContext的使用將在后面的章節(jié)詳細描述)。Struts2通過查詢HttpServletRequest對象并調用它的getLocale()方法將Local與action調用聯(lián)系起來。5.5.5用ActionContext與Web容器發(fā)生聯(lián)系在Action的接口定義中,excute()方法并沒有HttpServletRequest和HttpServletResponse參數(shù)也就是說Struts2的Action不用去依賴于任何Web容器(不像Struts1必須在Web容器中才能運行),不用與那些JavaServlet復雜的請求(Request)、響應(Response)關聯(lián)在一起。但在Web應用程序開發(fā)中,往往需要在Action里直接獲取請求(Request)或會話(Session)的一些信息,甚至需要直接對JavaServletHttp的請求、響應操作。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高級輸入應用程序經常使用JavaBean表示一個域中的對象,包括User、Address、Block在內地的類就是這種JavaBean很好的例子。而在Web程序中很大一部工作都是將信息填充到這些對象中去和從Bean中獲取數(shù)據(jù)信息在網頁中表現(xiàn)。本節(jié)將以一個完整的實例來說明Sturts2在這些方面提供了那些便利。5.5.7使用Model-DrivenStruts2中,提供了兩種Action驅動模式:Property-Driven(屬性驅動),Model-Driven(模型驅動的)。模型驅動的Action很像Struts1中的FormBean,在傳遞過程中有一個單獨的值對象來作為參數(shù)的載體,但在Struts2中這個值對象不必再繼承任何接口,只要普通JavaBean就可以充當模型部分。很多情況下Bean的定義已經存在了,而且是不能修改的(如從外部引入的類或者是已經被大量代碼引用的類),如果必須實現(xiàn)某個接口才能作為FromBean,不得不再新增一個類,Struts2的這個改進非常及時。5.5.8使用Property-DrivenProperty-Driven就是Action將直接用自己的字段來充當FormBean的功能,在Struts2入門一章中,HelloReader這個例子就是采用的這種方法,在Action中直接包含了message屬性和它set、get方法。它一般用在頁面表單比較簡單的情況使用,而且可以直接把屬性作為Action的字段,這樣就不用在另寫FormBean,減少了重復代碼。上一節(jié)的例子如果使用Property-Driven方法,那就是將User與action類合并定義,把User中的屬性值直接轉移到action中去,在配置文件中也不必再增加modelDriven這個過濾器。5.6Result類型介紹Result是在Action執(zhí)行完,一個結果返回后決定發(fā)生什么事的類。開發(fā)者可以自由的根據(jù)他們的應用和環(huán)境的需要創(chuàng)建自己的Result類型。例如在Struts2中Servlet和Velocity結果類型已經被創(chuàng)建用來顯示web應用程序的畫面。本節(jié)將介紹Struts2內置的幾種Result類型和如何自定義開發(fā)Result。5.6.1內置Result類型所有的Result類型都實現(xiàn)了com.opensymphony.xwork.Result接口。這個接口是所有action執(zhí)行結果的通用接口,不管這個結果是用來顯示一個網頁還是產生一個E-mail,發(fā)送一個JMS消息還是別的。在struts-default.xml中定義了系統(tǒng)提供的缺省Result類型,把它們映射為action配置中可以引用的名字,在action配置就就不用再使用長類名直接使用這些別名就可以了。5.6.2默認ResultDispatcherResult是最常用的一種result,它也是Struts2默認的result,又稱為通用resut。action執(zhí)行完后,請求會導向對應的View,相當于<jsp:forword>標簽實現(xiàn)的跳轉功能。將同一個HTTP請求中的內容分發(fā)至某一個頁面(dispatcher類型的result的使用)只要配置文件包含了struts-default.xml,而且package繼承了struts-default,那么使用dispatcherresult并不需要其他設置。示例:<resultname="success"type="dispatcher"><paramname="location">foo.jsp</param></result>5.6.3頁面跳轉ResultRedirectResult與DispatcherResult作用類似也是實現(xiàn)頁面跳轉。對上次的響應將重定向到指定的位置,可以理解為在客戶端跳轉用戶又重新請求了一個新的URL。redirect是重新產生一個新的request,因此原來request保存的東西將不再有效,比如不能通過再requet.getAtrribute()取得對象,也不能取得action的實例、errors、fielderrors等。RedirectResult與DispatcherResult的區(qū)別于源于JSP篇中<jsp:forward>標簽與response.redeiret()的區(qū)別。5.6.4創(chuàng)建action鏈ChainResult是一種result類型,它基于自己的攔截器stack(堆棧)和result調用一個action,這樣允許一個action附帶著原來的狀態(tài)將請求轉到目標actionStruts2提供把多個Action按照預先定義好的順序或者流程鏈接起來的能力。這個特性通過給指定的Action設置一個ChainResult,然后通過一個ChainingInterceptor攔截目標Action來實現(xiàn)。5.6.5整合各種View技術Velocity、Freemarker、JasperReports、xslt這4種result都是為了整合不同的視圖技術而設計的。1.VelocityResult:Velocity是一個基于java的模板引擎(templateengine)。2.FreemarkerResult:Freemarker也是一個模板引擎,允許JavaServlet保持圖形設計同應用程序邏輯的分離,這是通過在模板中密封HTML完成的。模板用servlet提供的數(shù)據(jù)動態(tài)地生成HTML。3.JasperReportsresult:JasperReports是一個基于Java的開源報表工具,它可以在Java環(huán)境下像其他IDE報表工具一樣來制作報表。4.XSLTResult:XSLTResult用XSLT來轉換action對象到XML。5.6.6自定義resultStruts2也允許用戶自定義自己的result類型,只要實現(xiàn)com.opensymphony.xwork2.Result接口就可以了。如代碼5-29所示,模擬了一種result作用是根據(jù)處理結果將給指用戶發(fā)送一份E-mail。這個result需要4個參數(shù)to、from、subject和body5.7攔截器(Interceptors)介紹攔截器(Interceptor)是Struts2的一個強有力的工具,有許多功能都是構建于它之上,如國際化、轉換器,校驗等。Interceptor是Struts2的一大特色,在執(zhí)行action之前和之后可以使請求通過一個或多個Interceptor。多個連接器組合在一起實

溫馨提示

  • 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

提交評論