

下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1/ 472/ 47Struts 教程概述本文主要講解什么是Struts Framework ,它的框架結(jié)構(gòu),組件結(jié)構(gòu),以及簡(jiǎn)單的配置講解。文章的包括了如下七大部分:Framework 的概念和體系簡(jiǎn)介Struts 的概念和體系結(jié)構(gòu)Struts 的工作原理和組件Struts 配置文件簡(jiǎn)介Struts 高級(jí)特性Struts 標(biāo)記庫(kù)一個(gè)簡(jiǎn)單的示例Framework 概念一直以來(lái)我們都說(shuō)Struts 是一個(gè) Web Framework。那么讓我么先來(lái)看看什么是Framework。Framework 概念并不是很新了,伴隨著軟件開發(fā)的發(fā)展,在多層的軟件開發(fā)項(xiàng)目中, 可重用、易擴(kuò)展的,而且是經(jīng)過(guò)良好測(cè)試
2、的軟件組件,越來(lái)越為人們所青睞。這意味著人 們可以將充裕的時(shí)間用來(lái)分析、構(gòu)建業(yè)務(wù)邏輯的應(yīng)用上,而非繁雜的代碼項(xiàng)目。于是人們 將相同類型問(wèn)題的解決途徑進(jìn)行抽象,抽取成一個(gè)應(yīng)用框架。這也就是我們所說(shuō)的 Framework。Framework 的體系提供了一套明確機(jī)制,從而讓開發(fā)人員很容易的擴(kuò)展和控制整個(gè) Framework開發(fā)上的結(jié)構(gòu)。通常,F(xiàn)ramework 的結(jié)構(gòu)中都有一個(gè)命令和控制”組件comma nd and con trol comp onent)-Framework Factory and Man agercode written口勺口和科fhe pubifc fo me work A
3、PIsBIMPublic InterfaceFramework1ManageinerifService Provider Interface (SPtcomponentsL._JTarget application server (the current framework hosf)Framework 體系 通過(guò)基于請(qǐng)求響應(yīng)Request-Response)模式的應(yīng)用Framework,基本上有如下幾個(gè)3/ 47表現(xiàn)邏輯結(jié)構(gòu)組成。控制器Controller)- 控制整個(gè) Framework 中各個(gè)組件的協(xié)調(diào)工作。業(yè)務(wù)邏輯層Business Logic)- 對(duì) Framwork 本身來(lái)說(shuō),這里
4、僅僅只是概念和幾個(gè)提夠服務(wù)的基礎(chǔ)組件,真正的實(shí)現(xiàn)與客戶的業(yè)務(wù)邏輯接軌,還需要開發(fā)人員在Framework 上再次擴(kuò)展。數(shù)據(jù)邏輯層Data Logic)絕大應(yīng)用系統(tǒng)都需要涉及到數(shù)據(jù)交互,這一層次主要包括了數(shù)據(jù)邏輯和數(shù)據(jù)訪問(wèn)接口。對(duì)于數(shù)據(jù)邏輯來(lái)說(shuō),如果你了解數(shù)據(jù)建模Data Modeling )可能就很容易理解。Struts 的概念和體系結(jié)構(gòu)Struts 有一組相互協(xié)作的類、Serlvet 以及 Jsp TagLib 組成?;?Struts 構(gòu)架的web 應(yīng)用程序基本上符合JSP Model2 的設(shè)計(jì)標(biāo)準(zhǔn),可以說(shuō)是MVC 設(shè)計(jì)模式的一種變化類型。根據(jù)上面對(duì)framework 的描述,我們很容易理
5、解為什么說(shuō)Struts 是一個(gè) webframwork,而不僅僅是一些標(biāo)記庫(kù)的組合。但Struts也包含了豐富的標(biāo)記庫(kù)和獨(dú)立于該框架工作的實(shí)用程序類。Struts 有其自己的控制器 Con troller ),同時(shí)整合了其他的一些技術(shù)去實(shí)現(xiàn)模型層 Model)和視圖層View)。在模型層,Struts可以很容易的與數(shù)據(jù)訪問(wèn)技術(shù)相結(jié)合,包括 EJB,JDBC 和 Object Relation Bridge 。在視圖層, Struts 能夠與 JSP, Velocity Templates,XSL 等等這些表示層組件想結(jié)合。Struts 的與 Web App 的關(guān)系既然 struts 叫做 we
6、b framework,那么其肯定主要基于web 層的應(yīng)用系統(tǒng)開發(fā)。按照J(rèn)2EE Architecture的標(biāo)準(zhǔn),struts應(yīng)當(dāng)禾口 jsp/servlet 一樣,存在于 web container(Servleils.JSPWebCodTainerSirulsFraniworkEJBConiainefClient. Tl&rMiddle TterFirewallHTML/XML / HTTPRMhllOPJ NIDI”JMS,JavAMailCllwtebXMLCMSOAP01啊3Adapner4/ 47HTML X訥Li層。Struts 與 WebApp 的關(guān)系Struts 的體
7、系結(jié)構(gòu)我們說(shuō) struts framework 是 MVC 模式的體現(xiàn),下面我們就從分別從模型、視圖、控制來(lái)看看 struts 的體系結(jié)構(gòu)Architecture )。下圖顯示了 struts framework 的體系結(jié) 構(gòu)響應(yīng)客戶請(qǐng)求時(shí)候,各個(gè)部分工作的原理。ResponseStruts 體系結(jié)構(gòu)從視圖角度 Wiew)首先,Struts 提供了 Java 類 org. apache.struts.action.ActionForm, Java 開發(fā)者將該類細(xì)分來(lái)創(chuàng)建表單 bea n。在運(yùn)行時(shí),該 bean 有兩種用法:當(dāng) JSP 準(zhǔn)備相關(guān)的 HTML,表單以進(jìn)行顯示時(shí),JSP 將訪問(wèn)該be
8、a n(它保存要放入表單中的值 。那些值是從業(yè)務(wù)邏輯或者是從先前的用戶輸入來(lái)提供的。當(dāng)從 Web 瀏覽器中返回用戶輸入時(shí),該bean 將驗(yàn)證并保存該輸入以供業(yè)務(wù)邏輯或(如果驗(yàn)證失敗的話 后續(xù)重新顯示使用。其次,Struts 提供了許多定制 JSP 標(biāo)記,它們的使用簡(jiǎn)單,但是它們?cè)陔[藏信息方面 功能強(qiáng)大。例如,除了 bean 名稱和給定 bean 中每個(gè)段的名稱之外,頁(yè)面設(shè)計(jì)者不 需要知道有關(guān)表單 bean的更多信息。從模型角度 vModel)Struts 雖然不直接有助于模型開發(fā)。在Struts 中,系統(tǒng)模型的狀態(tài)主要由ActiomFormBean 和值對(duì)象體現(xiàn)。Web TierRMI1IOP
9、5/ 47從控制器角度 vController)在 Struts framework 中,Controller主要是 ActionServlet ,但是對(duì)于業(yè)務(wù)邏輯的操作則主要由Action、ActionMapping、ActionForward 這幾個(gè)組件協(xié)調(diào)完成 也許這幾個(gè)組件,應(yīng)該劃分到模型中的業(yè)務(wù)邏輯一塊)。其中,Acti on 扮演了真正的控制邏輯的實(shí)現(xiàn)者,而 ActionMapping 和 ActionForward 則指定了不同業(yè)務(wù)邏輯或流程的運(yùn)行方向。6/ 47Struts 的基本組件包整個(gè) struts 大約有 15 包,近 200 個(gè)類所組成,而且數(shù)量還在不斷的擴(kuò)展。在此我
10、們 不能一一介紹,只能列舉幾個(gè)主要的簡(jiǎn)要的介紹一下。下表說(shuō)明了目前struts api 中基本的幾個(gè)組件包,包括actio n,actio ns,co nfig,util,taglib,validator。下圖則顯現(xiàn)了這幾個(gè)組件包之間的關(guān)系。其中action 是整個(gè) struts framework 的核心org.apache.struts.acti on基本上,控制整個(gè)struts framework的運(yùn)行的核心類、組件都在這個(gè)包中,比如我們上面提到的控制器ActionServiet 。已經(jīng) Action,ActionForm,ActionMapping等等。strutsl.1比 1.0 多
11、了 DynaActionForm 類。增加了動(dòng)態(tài)擴(kuò) 展生成FormBea n 功能org.apache.struts.acti ons這個(gè)包是主要作用是提供客戶的http 請(qǐng)求和業(yè)務(wù)邏輯處理之間的特定適配器轉(zhuǎn)換功能,而 1.0 版本中的部分動(dòng)態(tài)增刪FromBean 的類,也在 strutsl.1中被Action 包的 DynaActionForm 組件所取代org.apache.struts.c onfig提供對(duì)配置文件struts-co nfig.xml兀素的映射。這也是 sturts1.1中新增的功臺(tái)匕冃匕org.apache.struts.utilStrtuts為了更好支持web app
12、licati on的應(yīng)用,體統(tǒng)了一個(gè)些常用服務(wù)的支持,比如 Connection Pool 和 Message Source。詳細(xì)信息請(qǐng)參考o(jì)rg.apache.struts.taglib這不是一個(gè)包,而是是一個(gè)客戶標(biāo)簽類的集合。下面包括Bean Tags , HTMLTagsiLogic Tags , Nested Tags , Template Tags 這幾個(gè)用于構(gòu)建用戶界面的標(biāo)org.apache.struts.validatorStruts1.1 framework中增加了 validator framework,用于動(dòng)態(tài)的配置 from 表單的驗(yàn)證。詳細(xì)信息請(qǐng)參閱ActionSer
13、viet繼承自 javax.servlet.http.HttpServlet類,其在 Struts framework 中扮演的角色是中心控制器。它提供一個(gè)中心位置來(lái)處理全部的終端請(qǐng)求??刂破?Acti on Servlet主要負(fù)責(zé)將 HTTP 的客戶請(qǐng)求信息組裝后,根據(jù)配置文件的指定描述,轉(zhuǎn)發(fā)到適當(dāng)?shù)奶幚砥?。IStruts fraIactio nrk 的工里和組件1具體說(shuō)明。這幾個(gè)組件就是:括 ActionForwad) lActionFrom Bean 。廿請(qǐng)求,I讓我們通過(guò)對(duì)struts I 的四個(gè)核心組件介紹來(lái)Action Classes , Actio n Mapp in g 此處包
14、actionsStruts ActionServletStruts一對(duì)于 Struts 如tagliconfig控基本器件關(guān)Actio nServiet。validator7/ 47按照 Servelt的標(biāo)準(zhǔn),所有得Servlet 必須在 web 配置文件web.xml)聲明。同樣,Acto in Servlet 必須在 Web Applicatio n配置文件web.xml)中描述,有關(guān)配置信息如下。act ionorg.apache.struts.act ion.Action Servlet全部的請(qǐng)求 URI 以*.do 的模式存在并映射到這個(gè)servlet,其配置如下:act ion *
15、.do一個(gè)該模式的請(qǐng)求URI 符合如下格式:中心控制器為所有的表示層請(qǐng)求提供了一個(gè)集中的訪問(wèn)點(diǎn)。這個(gè)控制器提供的抽象概 念減輕了開發(fā)者建立公共應(yīng)用系統(tǒng)服務(wù)的困難,如管理視圖、會(huì)話及表單數(shù)據(jù)。它也提供 一個(gè)通用機(jī)制如錯(cuò)誤及異常處理,導(dǎo)航,國(guó)際化,數(shù)據(jù)驗(yàn)證,數(shù)據(jù)轉(zhuǎn)換等。當(dāng)用戶向服務(wù)器端提交請(qǐng)求的時(shí)候,實(shí)際上信息是首先發(fā)送到控制器 Acti on Servlet,一旦控制器獲得了請(qǐng)求,其就會(huì)將請(qǐng)求信息傳交給一些輔助類helpclasses )處理。這些輔助類知道如何去處理與請(qǐng)求信息所對(duì)應(yīng)的業(yè)務(wù)操作。在Struts中,這 個(gè)輔助類就 是 org.apache.struts.action.Action。
16、通 常開發(fā)者需要自己繼承Aciton 類,從而實(shí)現(xiàn)自己的Action 實(shí)例。Struts Action ClassesActio nServlet把全部提交的請(qǐng)求都被控制器委托到Requestprocessor 對(duì)象。RequestProcessor 使用 struts-config.xml 文件檢查請(qǐng)求 URI 找到動(dòng)作 Action 標(biāo)示符。一個(gè) Actio n 類的角色,就像客戶請(qǐng)求動(dòng)作和業(yè)務(wù)邏輯處理之間的一個(gè)適配器Adaptor ),其功能就是將請(qǐng)求與業(yè)務(wù)邏輯分開。這樣的分離,使得客戶請(qǐng)求和Action 類之間可以有多個(gè)點(diǎn)對(duì)點(diǎn)的映射。而且Action 類通常還提供了其它的輔助功能,比如
17、:認(rèn)證vauthorization )、日志 logging )和數(shù)據(jù)驗(yàn)證 validation )。Action 最為常用的是 executev )方法。throws java.i oO Exceptionjavax.servlet.ServletException當(dāng) Controller收到客戶的請(qǐng)求的時(shí)候,在將請(qǐng)求轉(zhuǎn)移到一個(gè)Action 實(shí)例時(shí),如果這個(gè)實(shí)例不存在,控制器會(huì)首先創(chuàng)建,然后會(huì)調(diào)用這個(gè)Action 實(shí)例的 executev )方法。Struts Framework為應(yīng)用系統(tǒng)中的每一個(gè)Action 類只創(chuàng)建一個(gè)實(shí)例。因?yàn)樗械挠脩舳际褂眠@一個(gè)實(shí)例,所以你必須確定你的Acti o
18、n 類運(yùn)行在一個(gè)多線程的環(huán)境中。下圖顯示了一個(gè) executev )方法如何被訪問(wèn):8/ 47vaction path=/logonActiontype=com.test.LogonAction name=LogonForm scope=request input=logoncheck.jspvalidate=falsevforward name=welcome path=/welcome.jsp/ vforward name=failurepath=/logon_failure.jsp / Action 實(shí)例的 execute(方法注意,客戶自己繼承的Action 子類,必須重寫 execu
19、tev )方法,因?yàn)?Action 類在默認(rèn)情況下是返回 null 的。Struts Action Mapping上面講到了一個(gè)客戶請(qǐng)求是如何被控制器轉(zhuǎn)發(fā)和處理的,但是,控制器如何知道什么 樣的信息轉(zhuǎn)發(fā)到什么樣的Action 類呢?這就需要一些與動(dòng)作和請(qǐng)求信息相對(duì)應(yīng)的映射配置說(shuō)明。在 struts 中,這些配置映射信息是存儲(chǔ)在特定的 XML 文件 v 比如 struts- con fig.xml )。這些配置信息在系統(tǒng)啟動(dòng)的時(shí)候被讀入內(nèi)存,供struts framework在運(yùn)行期間使用。在內(nèi)存中,每一個(gè) vaction元素都與 org.apache.struts.action.ActionM
20、apping類的一個(gè)實(shí)例對(duì)應(yīng)。下表就顯示了一個(gè)登陸的配置映射。上面的配置表示:當(dāng)可以通過(guò)/logonAction.dov此處假設(shè)配置的控制器映射為*.do)提交請(qǐng)求信息的時(shí)候,控制器將信息委托com.test.Logo nAction處理。調(diào)用 Logo nAction實(shí)例的 execute(方法。同時(shí)將 Map pi ng 實(shí)例和所對(duì)應(yīng)的 Logo nForm Bea n 信息傳入。其中name=LogonForm 使用的 form-bean 元素所聲明的 ActionForm Bean。有關(guān) form-bean 的 申明如下顯示。vform-beansvform-bean name=Log
21、inFormtype=com.test .L oginForm/v/form-beansUserexecute()ActionAction(Controller)(View)Action Servlet and Req ues (Processor(Controller)9/ 47使用 ActionForward 導(dǎo)航元素則表示了當(dāng)Action 實(shí)例的 execute(方法運(yùn)行完畢或,控制器根據(jù)Mapping 可將響應(yīng)信息轉(zhuǎn)到適當(dāng)?shù)牡胤健H缟厦娆F(xiàn)實(shí),如果客戶登陸成功,則調(diào)用welcomeforward,將成功信息返回到/welcome.jsp 頁(yè)面。在你的 execute(方法的結(jié)尾可以使用下
22、 面的實(shí)例代碼而返回welcome forward 。當(dāng)然你的 welcome forward 必須在 action 元素屬性中定義,正如上面所聲明的那樣。return (mapp in g.fi ndForward(welcome。ActionForward 對(duì)象是配置對(duì)象。這些配置對(duì)象擁有獨(dú)一無(wú)二的標(biāo)識(shí)以允許它們按照有意義的名稱如succesS, failure ”等來(lái)檢索。ActionForward 對(duì)象圭寸裝了向前進(jìn)的 URL 路徑 且被請(qǐng)求處理器用于識(shí)別目標(biāo)視圖。ActionForward 對(duì)象建立自 元素位于 struts-config.xml。下面是一個(gè) Struts 中 元素例
23、子,屬于 元素范圍?;趫?zhí)行請(qǐng)求處理器的execute( 方法的結(jié)果,當(dāng)傳遞一個(gè)值匹配指定于 元素中 name 屬性的值的時(shí)候,下一個(gè)視圖可以在execute(乃法中被開發(fā)者用方便的方法org.apache.struts.act ion.ActionM app in g.fi ndForward(選擇。 ActionMapping.find Forward(方法既從它的本地范圍又從全局范圍提供一個(gè)ActionForward 對(duì)象,該對(duì)象返回至RequestProcessor 以 RequestDispatcher.forward( 或response.sendRedirect(調(diào)用下一個(gè)視圖。
24、當(dāng) 元素有 redirect=false屬性或 redirect屬性不存在的時(shí)候,RequestDispatcher.forward(被執(zhí)行;當(dāng)redirect= “true ” 是,將調(diào)用 sendRedirect( 方法。下例舉例說(shuō)明了redirect 屬性的用法:如果 redirect=true, URL 建立如 /contextPath/path 因?yàn)镠ttpServletResponse.sendRedirect(中解|-URL 采用”開頭相對(duì)于 servlet 容器根目錄。如果 redirect=false, URI 建立如 /path 因?yàn)?ServletContext.getR
25、equestDisptacher(采用虛擬目錄相關(guān) URL。在此稍稍說(shuō)一下有關(guān)global-forwards的概念。其在配置文件中描述了整個(gè)應(yīng)用系統(tǒng)可以使用的 ActionForward ,而不是僅僅是一個(gè)特定的Action。10/ 47Struts ActionForm Bean 捕獲表單數(shù)據(jù)在上面講解 ActionServlet ,Action Classes 和 Action Mapping 的時(shí)候,我們都提到 了 ActionFormBean 的概念。一個(gè)應(yīng)用系統(tǒng)的消息轉(zhuǎn)移或者說(shuō)狀態(tài)轉(zhuǎn)移)的非持久性數(shù)據(jù)存儲(chǔ),是由 ActionForm Bean 的負(fù)責(zé)保持的。ActionForm 派生
26、的對(duì)象用于保存請(qǐng)求對(duì)象的參數(shù),因此它們和用戶緊密聯(lián)系。一個(gè) ActionForm 類被 Requestprocessor 建立。這是發(fā)生在已完成向前進(jìn)到一個(gè)URL,該URL 為映射到控制器 servlet 而不是 JSP 和相應(yīng)的動(dòng)作映射指定的表單屬性的。在這個(gè)情況 下,如果沒(méi)有在指定的活動(dòng)范圍內(nèi)找到,Requestprocessor 將嘗試尋找可能導(dǎo)致創(chuàng)建一個(gè)新ActionForm 對(duì)象的表單 bean。該 ActionForm 對(duì)象在指定的活動(dòng)范圍內(nèi)被用 元素的 name 屬性找到;RequestProcessor 將隨后重新安排表單屬性,用請(qǐng)求時(shí)參數(shù)填充表單,隨即調(diào)用表單對(duì) 象的vali
27、date(方法以履行服務(wù)器端用戶輸入驗(yàn)證。僅當(dāng)ActionMapping 對(duì)象中validate 屬性被設(shè)為 true 時(shí),validate(方法被調(diào)用;這就是默認(rèn)的行為。request.getParameterValues(parameterName被用于得到一個(gè) String對(duì)象,它用來(lái)表單填 充;驗(yàn)證的結(jié)果應(yīng)該是一個(gè) ActionErrors 對(duì)象,用 org.apache.struts.taglib.html.ErrorsTag 來(lái) 顯示驗(yàn)證錯(cuò)誤給用戶。 ActionForm 也可以被用于為當(dāng)前用戶保存即將被一個(gè)視圖引用的中 間模型狀態(tài)。當(dāng)一個(gè)表單對(duì)象被 RequestProcesso
28、r 找到,它被傳遞到請(qǐng)求處理器的execute(另法。一個(gè) ActionForm 對(duì)象也可以被請(qǐng)求處理器建立。表單對(duì)象建立目的是提供中間模型狀 態(tài)給使用請(qǐng)求范圍 JSP;這將確保對(duì)象不會(huì)在有效性過(guò)期后仍然存在。默認(rèn)的,所有的表 單都被保存為會(huì)話范圍。會(huì)話中表單對(duì)象脫離有效性的存在可能導(dǎo)致浪費(fèi)內(nèi)存,同樣的, 請(qǐng)求處理器必須跟蹤保存在會(huì)話中的表單對(duì)象的生命周期。一個(gè)好的捕獲表單數(shù)據(jù)的實(shí)踐 是為橫跨多用戶交互的相關(guān)表單用一個(gè)單獨(dú)的表單bean。表單 bean 也可以在反饋的時(shí)候用來(lái)儲(chǔ)存能夠被自定義標(biāo)簽改變的中間模型狀態(tài)。在視圖中標(biāo)簽用法避免結(jié)合Java 代碼,因此要成一個(gè)好的任務(wù)劃分,web 生產(chǎn)組
29、主要處理標(biāo)志,而應(yīng)用開發(fā)組主要處理Java 代碼。標(biāo)簽因素退出訪問(wèn)中間模型狀態(tài)的邏輯;當(dāng)訪問(wèn)嵌套的對(duì)象或當(dāng)通過(guò)聚集列舉時(shí)這個(gè) 邏輯可能很復(fù)雜。注意:在 struts1.1 中, ActionForm 的校驗(yàn)功能,逐漸被剝離出來(lái) 當(dāng)然依然可以使 用)。使用了 validator framework 對(duì)整個(gè)應(yīng)用系統(tǒng)的表單數(shù)據(jù)驗(yàn)證進(jìn)行統(tǒng)一管理。相信 信息請(qǐng)參考:在 ActionForm 的使用中, Struts 提倡使用到值對(duì)象 Value Object )。這樣將客戶或 開發(fā)人員,對(duì)數(shù)據(jù)狀態(tài)與對(duì)象狀態(tài)能夠更加清晰的理解和使用。對(duì)于每一個(gè)客戶請(qǐng)求, Struts framework 在處理 Acti
30、onForm 的時(shí)候,一般需要經(jīng)歷 如下幾個(gè)步驟:1)檢查 Action 的映射,確定 Action 中已經(jīng)配置了對(duì) ActionForm 的映射2)根據(jù) name 屬性,查找 form bean 的配置信息3)檢查 Action 的 formbean 的使用范圍,確定在此范圍下,是否已經(jīng)有此formbean 的實(shí)例。4)假如當(dāng)前范圍下,已經(jīng)存在了此form bean 的實(shí)例,而是對(duì)當(dāng)前請(qǐng)求來(lái)說(shuō),是同一種類型的話,那么就重用。5)否則,就重新構(gòu)建一個(gè)form bean 的實(shí)例 方法備調(diào)用7)調(diào)用對(duì)應(yīng)的 setter 方法,對(duì)狀態(tài)屬性賦值 方法。9)如果 validate )方法沒(méi)有返回任何錯(cuò)誤
31、,控制器將 ActionForm 作為參數(shù),傳給 Action 實(shí)例11/ 47的 execute和 validate(方法,并不能實(shí)現(xiàn)什么處理功能, 所以有必要自己重新覆蓋。Struts 的其他組件Struts framework 本身提供了很多可擴(kuò)展的組件或 sub framework ,方便的開發(fā)人員在其 構(gòu)架上構(gòu)建web 層的應(yīng)用系統(tǒng)。比如 upload,collections ,logging等等。讓我們來(lái)看看兩個(gè)比較重要的組件: validationg framework 和 struts taglib 。有關(guān)其他組件請(qǐng)參考 Struts 用戶手冊(cè) ) 。Validation Fr
32、amework for Struts在 struts1.1 中,新增了 validation framework 。增加了對(duì) form 數(shù)據(jù)提交的驗(yàn)證。 將原本需要在ActionFrom Bean 的 validate )進(jìn)行的驗(yàn)證通過(guò)配置文件的描述進(jìn)行驗(yàn) 證。有關(guān)其詳細(xì)信息,請(qǐng)參考 。個(gè)人建議對(duì)于小型應(yīng)用系統(tǒng)可以采用這種配置方式,但是 對(duì)于應(yīng)用系統(tǒng)中有大量 web 層表單應(yīng)用的系統(tǒng),并且業(yè)務(wù)需求變動(dòng)比較大的,使用 validation framework 可能會(huì)加重開發(fā)難度、系統(tǒng)維護(hù)難度。可以借鑒validationframework 的 Javascript Validator Tag 。
33、Struts TagLibstruts 提供了一組可擴(kuò)展的自定義標(biāo)簽庫(kù) TagLib ),可以簡(jiǎn)化創(chuàng)建用戶界面的過(guò) 程。目前包括: Bean Tags , HTML Tags, Logic Tags , Nested Tags , Template Tags 這 幾個(gè) Taglib 。有關(guān) Struts Taglib 的結(jié)構(gòu)和使用,可以參考前面有關(guān)Cutomer Tag Lib 的介紹,有關(guān)起詳細(xì)資料,請(qǐng)參考BeanUtils這個(gè)組件的全稱是 Bean Introspection Utilites。是屬于 Jakarta Commons 項(xiàng)目組的。主要是幫助構(gòu)建 javabean 的屬性操作的
34、 getter,setter ),已經(jīng)提供一種動(dòng)態(tài)定義 和訪問(wèn) bean的屬性。有關(guān)詳細(xì)信息,請(qǐng)參考。如果各位對(duì)這方面有很興趣,可以參考一些有關(guān) java 反射 Reflectio )方面的資 料。Collections這 個(gè) 組 件 主 要 是 提 供 了 一 些 集 合 或 列 表 對(duì) 象 , 在 原 有 的 java collectionsframework 的基礎(chǔ)上進(jìn)行了擴(kuò)展。詳細(xì)資料請(qǐng)參考:以及Digester這個(gè)組件翻譯成中文的意思是“匯編”。其主要功能是根據(jù) xml 配置文件,初始化 系統(tǒng)的一些java 類對(duì)象。Digester 幫助你指定 XML 與 java 對(duì)象之間映射模型
35、,而且允許 客戶話定制映射規(guī)則12/ 47rules )。詳細(xì)資料請(qǐng)參考Struts 配置文件簡(jiǎn)介Struts framework 根據(jù)配置文件使得 ServletAction ,ActionMapping,Action,ActionForm 這幾個(gè)不同層次的組件相互交互,協(xié)調(diào)的工作。這些配置文件是在系統(tǒng)啟動(dòng)的 時(shí)候,讀入導(dǎo)內(nèi)存中,供控制器使用的。Struts framework 主要包括三部分的配置描述,一個(gè)是指定有關(guān) Struts Controller及其相關(guān)的的配置描述 I nitializatio n Parameters), 一個(gè)對(duì) struts tag lib 的描述,一個(gè) 是 s
36、truts 組件 中配置 ActionServlet 類及其訪問(wèn)映 射。當(dāng)您第一次創(chuàng)建基于 Struts 的 Web 應(yīng)用程序時(shí),將為您創(chuàng)建一個(gè)部署描述符,這通常就足 夠了。該文件包括下列條目: 條 目 定 義 用 于 Web 應(yīng) 用 程 序 的 servlet( 在 本 例 中 , 這 是 唯 一的 servlet: 禾口 指示 Acti on Servlet (標(biāo)識(shí)為 操作” 接收HTTP 請(qǐng)求并確定如何響應(yīng)。 表示 servlet 初始化參數(shù) .-“config ”指示 ActionServlet 的行為由指定的配置文件來(lái)指導(dǎo),該配置文件通常具有以下名稱:WEB-INFstruts-co
37、nfig.xml-debug”具有整數(shù)值,它指示將有關(guān)處理的詳細(xì)信息寫至控制臺(tái)的程度。-”detail”具有整數(shù)值,它指示將“映射”詳細(xì)信息(如后面所述 寫至控制臺(tái)的程度。 導(dǎo)致在啟動(dòng)應(yīng)用程序時(shí)裝入 servlet。 元素標(biāo)識(shí)這樣的命名模式:當(dāng)命名模式由 URL 進(jìn)行匹配時(shí),Web 服務(wù)器就將控制權(quán)移交給 ActionServlet ??紤]下面各種情況: 訪問(wèn)了 ActionServlet ,原因是“操作” ( 中的 元素的內(nèi)容 與操作”(中的 相匹配。 元素指定 URL 的結(jié)尾的命名模式。每個(gè) URL 的開頭都是應(yīng)用 程序上下文路徑。按照慣例, ActionServlet 調(diào)用對(duì)象以響應(yīng)與命
38、名模式 “*do” (其中“ *”是通配符 一致的 URL 。 元素指示獲得初始控制權(quán)的特定于應(yīng)用程序的代碼;在本例 中,Web服務(wù)器直接從 Web Content 目錄中調(diào)用 index.jsp。元素指示顯示哪個(gè) JSP 來(lái)響應(yīng)錯(cuò)誤。在本例中,錯(cuò)誤為如下所示: 404 (找不到資源 500 (Web 服務(wù)器內(nèi)部發(fā)生錯(cuò)誤 每個(gè)元素都使相對(duì) URL(相對(duì)于 Web.xml與標(biāo)記庫(kù)描述符(相對(duì)于 Web 應(yīng) 用程序13/ 47根目錄 相關(guān)聯(lián)。每個(gè) JSP 都可以使用同一個(gè)URL 來(lái)表示給定的標(biāo)記庫(kù),而 Web.xml 確定引用了哪個(gè)文件。有關(guān) struts tag lib 的配置描述如果你的 we
39、b application 打算使用 Struts 的 taglib , 那么你有必要在 web.xml 中對(duì) struts taglib進(jìn)行配置描述。有關(guān) Struts Action Mapping 的配置描述作為先前描述的 web.xml 設(shè)置的結(jié)果, Web 應(yīng)用程序服務(wù)器將請(qǐng)求的一個(gè)子集按路徑 發(fā)送至ActionServlet ,它通常調(diào)用一系列操作和JSP。 ActionServlet 的響應(yīng)是基于配置文件 struts-config.xml 的內(nèi)容的。有關(guān)其 DTD 文檔的描述,請(qǐng)參考一般 struts-configversion1.1 )包含了如下幾個(gè)部分: 1)form-bea
40、n2) global-forwards3) action-mappings4) data-sources我們知道,對(duì)于這樣的一個(gè)請(qǐng)求 例如,表示為“ /login.do ”),執(zhí)行下列步驟:1、 尋找操作類對(duì)象 映射對(duì)象 ActionMapping ),它包含指示如何響應(yīng)方法的每個(gè)可能結(jié)果的規(guī) 則“映射”)Struts 表單 beanActionForm ),它保存發(fā)送至 HTML 表單或接收自 HTML表單的數(shù)據(jù)請(qǐng)求和響應(yīng)對(duì)象 HttpServletReques/HttpServletResponse )3、從執(zhí)行方法返回 ActionForward 對(duì)象,用于指導(dǎo) ActionServle
41、t 接著訪問(wèn)哪個(gè)操作 類或 JSP返回的 ActionForward 對(duì)象中的信息取決于兩個(gè)值: 方法的結(jié)果 標(biāo)記標(biāo)識(shí)每個(gè)表單 beanvaction-mappings 標(biāo)記包括用于指導(dǎo)應(yīng)用程序流的信息,每個(gè)vaction 子標(biāo)記都使相對(duì) URL 與操作類和潛在的后續(xù)操作相關(guān)。Form-bean 元素Struts 配置文件中的一個(gè)示例vform-bean 子元素為如下所示:每個(gè) 子元素都包括下列屬性:name14/ 47表單 bean 的名稱,稍后在配置文件中會(huì)用到。 ActionServlet 舉例說(shuō)明了該 bea n元素為如下所示:action path= “/register” type
42、=“strutsEGL.RegisterAction ” name=“registerForm”input=“/register.jsp” scope=“request” 每個(gè)vaction 元素都包括下列屬性中的某些屬性或所有屬性:path將請(qǐng)求指定為非限定URL,不帶文件擴(kuò)展名 元素中的其它屬性來(lái)處理的,并且是用戶輸入的結(jié)果或者是在differentvaction 元素中標(biāo)識(shí)的轉(zhuǎn)發(fā)的結(jié)果。type 指定在發(fā)出請(qǐng)求時(shí)調(diào)用其執(zhí)行方法的操作類的全限定名。該類必須在類路徑中。 注:不指定要實(shí)例化的類,可以通過(guò)使用 forward 屬性來(lái)轉(zhuǎn)發(fā)請(qǐng)求,該屬性 在Struts 貿(mào)易樣本”中未使用,并且與后
43、面描述的vforward 子元素不相同。name用于保存發(fā)送至 HTML 表單或接收自 HTML 表單的數(shù)據(jù)表單 bean 的名稱。input指定相對(duì) URL例如,“ /register.do”或/index.jsp ”)必須包括后綴, 如果表單 bean 的驗(yàn)證方法指示發(fā)生了輸入錯(cuò)誤,則會(huì)調(diào)用U RL ;有關(guān)詳細(xì)信息,參見(jiàn)下節(jié)的“驗(yàn)證”。scope指定將對(duì)表單 bean 的引用存儲(chǔ)在哪個(gè)作用域中。其值為“會(huì)話”缺省值)或“請(qǐng)求”。Struts 配置文件中的每個(gè)vaction 元素還包括子元素vforward ,它指定從方法結(jié)果至后 續(xù)調(diào)用的映射。每個(gè)vforward 子元素都包括下列屬性na
44、me指定導(dǎo)致在運(yùn)行時(shí)使用當(dāng)前映射的字符串例如,“ success ),但是只限于以下情況:在 type 中引用的操作類的執(zhí)行方法使用完全相同 的字符串來(lái)配置返回至 ActionServlet 的 ActionForward 對(duì)象。下面 的執(zhí)行方法不是很重要,但是會(huì)導(dǎo)致使用“success映射:public ActionForward exectue( ActionMapping mapping, ActoinForm form,HttpServletRequest request, HttpServletResponse response ThrowsIOException,ServletEx
45、ception15/ 47ActionForward forward=new ActionForward( 。 Forward=mapping,findForward( “success” 。 return(forward ;path指定非限定URL例如,/home.do ”或“ndex.jsp ”)必須包括文件擴(kuò)展名,僅當(dāng)使用當(dāng)前映射時(shí)才會(huì)調(diào)用該 URL ,轉(zhuǎn)發(fā)操作類是根據(jù) differentaction 元素中的屬性 來(lái)處理的,尤其是,在其path 屬性標(biāo)識(shí)相同 URL 的action元素中。有必要提一下的是,在 struts1.1 中,提出了對(duì) Multiple Application
46、Support 。在 struts 的早先版本中,只有一個(gè) struts 配置文件,一般叫 struts- config.xml 。但是,對(duì)于越來(lái)越復(fù)雜的應(yīng)用系統(tǒng)的發(fā)展,只有一個(gè)地方存放這個(gè)一個(gè)文 件,對(duì)大型項(xiàng)目來(lái)說(shuō),使用和修改這個(gè)配置文件,使其成為了一個(gè)應(yīng)用的瓶頸問(wèn)題。在 struts1.1 中,你可以定義多了配置文件協(xié)同工作。注:當(dāng)用戶或 ActionServlet 調(diào)用 JSP 時(shí),請(qǐng)求是由 Web 應(yīng)用程序服務(wù)器直接處理的不會(huì) 受到ActionServlet 的干預(yù)。Struts 高 級(jí) 特 性 Struts Advanced Feature)驗(yàn)證僅當(dāng)在下列情況下才會(huì)在表單bean 中
47、對(duì)用戶輸入進(jìn)行驗(yàn)證:表單 bean 覆蓋超類的驗(yàn)證方法Struts 配置文件中的 元素的驗(yàn)證屬性顯式地或者缺省設(shè)置為TRUE 。表單 bean 沒(méi)有關(guān)于應(yīng)用程序的業(yè)務(wù)邏輯的信息;因此該bean 提供的驗(yàn)證僅限于一些相對(duì)簡(jiǎn)單的問(wèn)題,例如,用戶是否在每個(gè)必填字段中都輸入了數(shù)據(jù)?Struts 框架的各種部件使得可以進(jìn)行驗(yàn)證Struts 配置文件中的以下 子元素將導(dǎo)致使用表單bea n registerForm:action path= “/register” type=“strutsEGL.RegisterAction ”name=“registerForm ” input= “/register.
48、jsp”a丄”scope=“request”如果缺少驗(yàn)證屬性,則意味著當(dāng)ActionServlet 接收到來(lái)自 HTML 表單對(duì)/register的請(qǐng)求時(shí),ActionServlet 將在接收用戶數(shù)據(jù)的表單bean 中調(diào)用驗(yàn)證方法。此驗(yàn)證在 ActionServlet 訪問(wèn)操作類之前進(jìn)行。如果丟失了該方法,不會(huì) 發(fā)生任何錯(cuò)誤,在該情況下,驗(yàn)證總是會(huì)成功。如果發(fā)生了錯(cuò)誤,則表單 bean 的驗(yàn)證方法將舉例說(shuō)明錯(cuò)誤類并將錯(cuò)誤條目添 加至該類。registerForm 的驗(yàn)證方法的一個(gè)子集為如下所示 :ActionErrors errors=new ActionErrors( ;If (userna
49、me= =unll | username.equals(errors.add(/register”,16/ 47new ActionError( /error. Register.username”;if (openingBalanceerrors.add(/register”,new ActionError( /error. register. balance”。return errors。errors.add 方法包括兩個(gè)參數(shù):property用來(lái)標(biāo)識(shí)錯(cuò)誤類別的 Java 字符串。17/ 47如果想要在特定的輸入字段或輸入字段的子集發(fā)生錯(cuò)誤時(shí)標(biāo)識(shí)該錯(cuò)誤,則指定屬性值。例如,指定諸如“use
50、rname”之類的值的優(yōu)點(diǎn)在于:報(bào)告了錯(cuò)誤的JSP 中,可以在屏幕上靠近發(fā)生錯(cuò)誤的字段的位置顯示有關(guān)特定 HTML 字段的錯(cuò) 誤消息,但是,要指示所有錯(cuò)誤都屬于同一類別,可以對(duì)屬 性參數(shù)指定以下常量:ActionErrors.GLOBAL_ERROR包含從屬性文件派生的“鍵字符串”對(duì)的鍵的 ActionError 對(duì)象。當(dāng)配置Acti on Error 對(duì)象時(shí),最多可以包括要代入字符串中用來(lái)替代0、1等的四個(gè)值。如果從驗(yàn)證方法返回了錯(cuò)誤,則 ActionServlet 指導(dǎo)對(duì)在 元素的輸入屬性中指定的對(duì)象或 JSP 進(jìn)行處理;在本例中,將處理 register.jsp.JSP register
51、.jsp. 包括用于顯示從驗(yàn)證方法派生的任何錯(cuò)誤消息的以下 標(biāo)記:如果在未發(fā)生輸入錯(cuò)誤的情況下調(diào)用JSP,則該標(biāo)記不顯示任何內(nèi)容,而在 JSP 中將繼續(xù)進(jìn)行處理。但是,如果因發(fā)生驗(yàn)證故障而調(diào)用了JSP,則為用戶顯示的內(nèi)容將受到屬性文件中是否包括下列鍵的影響:errors.header,它導(dǎo)致在所有錯(cuò)誤消息前面顯示一個(gè)字符串;或者errors.footer,它導(dǎo)致在所有錯(cuò)誤消息后面顯示一個(gè)字符串;或者errors.hiader,禾口 errors.footer 兩者例如,在 ApplicationRperties 中, errors.header 和 errors.foo
52、ter 的“鍵字符串”對(duì)以及先前顯示的這兩個(gè)消息鍵為如下所示,它們各自都在單獨(dú)的一行上 但是分成了多行顯示以便于您復(fù)查):errors.header=The Action failed because of the following reason(s:error.register.username=you must enter a User ID.error.register.balance=Your account must start with a positive balance.Errors.footer= 如果在注冊(cè)時(shí)用戶對(duì)用戶名輸入了空白,對(duì)余額輸入零,則用戶將接收 到一個(gè)包括兩
53、個(gè)錯(cuò)誤的列表的屏幕:The Action failed because of the following reason(s:o You must enter a User ID.o Your account must start with a positive balance.可以為標(biāo)記 指定屬性以支持國(guó)際化或者只顯示有關(guān)指定了 給定屬性值的錯(cuò)誤的信息。通過(guò)使用相異屬性值,可以在相鄰的不同字 段中顯示每條錯(cuò)誤消息而不是將所有錯(cuò)誤置于單個(gè)列表中。使用異常處理聲明要定義應(yīng)用程序的邏輯流程,成熟的經(jīng)驗(yàn)是推薦在代碼之外,用配置的方法來(lái)實(shí)現(xiàn), 而不是寫死在error18/ 47程序代碼中的。在J2EE
54、中,這樣的例子比比皆是。從實(shí)現(xiàn)EJB 的安全性和事務(wù)性行為到描述 JMS 消息和目的地之間的關(guān)系,很多運(yùn)行時(shí)的處理流程都是可以在程序之外定 義的。Struts 創(chuàng)建者從一開始就采用這種方法,通過(guò)配置Struts 的配置文件來(lái)定制應(yīng)用系統(tǒng)運(yùn)行時(shí)的各個(gè)方面。這一點(diǎn)在版本1.1 的新特性上得到延續(xù),包括新的異常處理功能。在Strutsframework 以前的版本中,開發(fā)人員不得不自己處理Struts 應(yīng)用中發(fā)生的錯(cuò)誤情況。在最新的版本中,情況大大的改觀了,Struts Framework 提供了內(nèi)置的一個(gè)稱為ExceptionHandler的類,用于系統(tǒng)缺省處理 action 類運(yùn)行中產(chǎn)生的錯(cuò)誤。
55、這也是在上一個(gè)技巧中我們提到的 framework 許多可擴(kuò)展接口之一。Struts 缺省的 ExceptionHandler 類會(huì)生成一個(gè) ActionError 對(duì)象并保存在適當(dāng)?shù)姆秶?另外一個(gè)是 storeException(.在多數(shù)情況下,只需要覆蓋其中的excute(方法。下面是 ExceptionHandler 類的 excute(方法聲明:public Ac tionFrwardexecute( Exception exrExcep七ionCciiTfig ActionMappinq mapping, ActionFormformInstance, HttpServietPequ
56、est request, HttpServletResponseresponse)throws ServletException;正如你看到的,該方法有好幾個(gè)參數(shù),其中包括原始的異常。方法返回一個(gè) ActionForward 對(duì)象,用于異常處理結(jié)束后將controller 類帶到請(qǐng)求必須轉(zhuǎn)發(fā)的地方去。當(dāng)然您可以實(shí)現(xiàn)任何處理,但一般而言,我們必須檢查拋出的異常,并針對(duì)該類型的異常進(jìn)行特定的處理。缺省的,系統(tǒng)的異常處理功能是創(chuàng)建一個(gè)出錯(cuò)信息,同時(shí)把請(qǐng)求轉(zhuǎn)發(fā) 到配置文件中指定的地方去。定制異常處理的一個(gè)常見(jiàn)的例子是處理嵌套異常。假設(shè)該異 常包含有嵌套異常,這些嵌套異常又包含了其他異常,因此我們必須覆
57、蓋原來(lái)的execute(方法,對(duì)每個(gè)異常編寫出錯(cuò)信息。一旦你創(chuàng)建了自己的 ExceptionHandler類,就應(yīng)該在 Struts 配置文件中的部分聲明這個(gè)類,以便讓 Struts 知道改用你自定義的異常處理取代缺省的異常處理可以配置你自己的 ExceptionHandler類是用于 Action Mapping 特定的部分還是所有的Action 對(duì)象。如果是用于 Action Mapping 特定的部分就在元素中配置。如果想讓這個(gè)類可 用于所有的Action 對(duì)象,可以在元素中指定。例如,假設(shè)我們創(chuàng)建了異常處理類 CustomizedExceptionHandler 用于所有的 Actio
58、n 類,元素定義如下所示:gJ.ooalexcep七JLDTISAexceptionhandle r=f,c oin. c avails 3s* storefront * CustomisedExceptionHandlerFTkey=global error mm19/ 47ssaaeF,在元素中可以對(duì)很多屬性進(jìn)行設(shè)置。在本文中,最重要的屬性莫過(guò)于handler 屬性,handler 屬性的值就是自定義的繼承了ExceptionHandler 類的子類的全名。假如該屬性沒(méi)有定義,Struts 會(huì)采用自己的缺省值。當(dāng)然,其他的屬性也很重要,但如果想覆蓋缺省的異 常處理的話,handler 無(wú)疑
59、是最重要的屬性。最后必須指出的一點(diǎn)是,你可以有不同的異常處理類來(lái)處理不同的異常。在上面的例子中,CustomizedExceptionHandler 用來(lái)處理任何 java.lang.Exception 的子類.其實(shí),你 也可以定義多個(gè)異常處理類,每一個(gè)專門處理不同的異常樹。下面的XM 片斷解釋了如何配置以實(shí)現(xiàn)這一點(diǎn)。gJ.oJoalexcep七JJRISexoeptionhandle r=c oim. c avane ss,storefront * CustomizedExceptionHandlerkey=global error m亡ssaaer,在這里,一旦有異常拋出,struts f
60、ramework將試圖在配置文件中找到ExceptionHandler ,如果沒(méi)有找到,那么 struts 將沿著該異常的父類鏈一層層往上找直到 發(fā)現(xiàn)匹配的為止。因此,我們可以定義一個(gè)層次型的異常處理關(guān)系結(jié)構(gòu),在配置文件中已 經(jīng)體現(xiàn)了這一點(diǎn)。使用應(yīng)用模塊 vApplication Modules )Struts 1.1 的一個(gè)新特性是應(yīng)用模塊的概念。應(yīng)用模塊允許將單個(gè)Struts 應(yīng)用劃分成幾個(gè)模塊,每個(gè)模塊有自己的 Struts 配置文件,JSP 頁(yè)面,Action 等等。這個(gè)新特性是為了解決 大中型的開發(fā)隊(duì)伍抱怨最多的一個(gè)問(wèn)題,即為了更好的支持并行開發(fā)允許多個(gè)配置文件而 不是單個(gè)配置文件。顯然,當(dāng)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 修水井合同范例
- 農(nóng)村現(xiàn)澆房合同范例
- 作坊轉(zhuǎn)讓合同范例
- 會(huì)議門禁租賃合同范例
- 買商鋪轉(zhuǎn)讓合同范例
- 供需方 采購(gòu)合同范例
- 企業(yè)營(yíng)銷推廣合同范例
- 五金合作合同范例
- PP凈化塔工程合同范例
- 制作安裝門頭合同范例
- 2024年反詐騙知識(shí)競(jìng)賽題庫(kù)與答案
- 初中英語(yǔ)不規(guī)則動(dòng)詞表(譯林版-中英)
- 【A酒店員工敬業(yè)度提升對(duì)策探究10000字(論文)】
- 人工造林項(xiàng)目投標(biāo)方案(技術(shù)方案)
- 版NCCN直腸癌指南解讀
- 全過(guò)程工程咨詢服務(wù)服務(wù)質(zhì)量保障方案
- 安全生產(chǎn)培訓(xùn)記錄表
- (高清版)DZT 0319-2018 冶金行業(yè)綠色礦山建設(shè)規(guī)范
- 2024年湖南株洲市天元區(qū)面向社會(huì)社區(qū)專職工作者招聘筆試參考題庫(kù)附帶答案詳解
- 高中生物學(xué)科核心素養(yǎng)解讀課件
- 2024屆江蘇省蘇州市八年級(jí)語(yǔ)文第二學(xué)期期末統(tǒng)考試題含解析
評(píng)論
0/150
提交評(píng)論