版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
SpringMVC技術(shù)體系介紹2022/11/261SpringMVC培訓(xùn)——孫林SpringMVC技術(shù)體系介紹2022/11/261SpMVC模式介紹SpringMVC架構(gòu)SpringMVC重要組件2022/11/262SpringMVC培訓(xùn)——孫林目錄MVC模式介紹2022/11/262SpringMVC培MVC模式介紹——J2EE中的MVC2022/11/263SpringMVC培訓(xùn)——孫林MVC模式介紹——J2EE中的MVC2022/11/263SMVC模式介紹模型-視圖-控制器(Model-View-Controller)把一個應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應(yīng)用被分成三個層——模型層、視圖層、控制層。MVC模式是解決了展示以及業(yè)務(wù)邏輯實現(xiàn)的分離。讓開發(fā)者可以專心地解決不同層的編碼。也方便代碼重用和測試和維護。JSP、HTML、XMLServlet、Struts、Spring實體Bean、Entity、VO、FormBean2022/11/264SpringMVC培訓(xùn)——孫林MVC模式介紹模型-視圖-控制器(Model-View-CoServices層常用的應(yīng)用系統(tǒng)中的多層結(jié)構(gòu)View展示層Controller控制層業(yè)務(wù)邏輯處理層數(shù)據(jù)持久化層(DAO)實體Bean、Entity層數(shù)據(jù)庫2022/11/265SpringMVC培訓(xùn)——孫林Services層常用的應(yīng)用系統(tǒng)中的多層結(jié)構(gòu)View展示層CMVC設(shè)計思想 MVC是一種復(fù)合模式,結(jié)合了觀察者模式、策略模式、組合模式、適配器模式。
模型使用觀察者模式,以便觀察者更新,同時保持兩者之間的解耦??刂破魇且晥D的策略,視圖使用組合模式實現(xiàn)用戶界面。適配器模式用來將模型適配成符合現(xiàn)有視圖和控制器的需要的模型。
這些模式合作把MVC模式的三層解耦。2022/11/266SpringMVC培訓(xùn)——孫林MVC設(shè)計思想 MVC是一種復(fù)合模式,結(jié)合了觀察者模式、策略MVC設(shè)計思想視圖(View)代表用戶交互界面,對于Web應(yīng)用來說,可以是HTML,也可能是jsp、XML和Applet等。一個應(yīng)用可能有很多不同的視圖,MVC設(shè)計模式對于視圖的處理僅限于視圖上數(shù)據(jù)的采集和處理,以及用戶的請求,而不包括在視圖上的業(yè)務(wù)流程的處理。業(yè)務(wù)流程的處理交予模型(Model)處理。比如一個訂單的視圖只接受來自模型的數(shù)據(jù)并顯示給用戶,以及將用戶界面的輸入數(shù)據(jù)和請求傳遞給控制和模型。
2022/11/267SpringMVC培訓(xùn)——孫林MVC設(shè)計思想視圖(View)代表用戶交互界面,對于MVC設(shè)計思想模型(Model):是業(yè)務(wù)的處理以及業(yè)務(wù)規(guī)則的制定。模型接受視圖請求的數(shù)據(jù),并返回最終的處理結(jié)果。業(yè)務(wù)模型的設(shè)計是MVC最主要的核心。MVC設(shè)計模式告訴我們,把應(yīng)用的模型按一定的規(guī)則抽取出來,抽取的層次很重要,抽象與具體不能隔得太遠,也不能太近。MVC并沒有提供模型的設(shè)計方法,而只是組織管理這些模型,以便于模型的重構(gòu)和提高重用性。業(yè)務(wù)模型還有一個很重要的模型那就是數(shù)據(jù)模型。數(shù)據(jù)模型主要指實體對象的數(shù)據(jù)保存(持續(xù)化)。比如將一張訂單保存到數(shù)據(jù)庫,從數(shù)據(jù)庫獲取訂單。我們可以將這個模型單獨列出,所有有關(guān)數(shù)據(jù)庫的操作只限制在該模型中。2022/11/268SpringMVC培訓(xùn)——孫林MVC設(shè)計思想模型(Model):是業(yè)務(wù)的處理MVC設(shè)計思想控制(Controller)可以理解為從用戶接收請求,將模型與視圖匹配在一起,共同完成用戶的請求。劃分控制層的作用也很明顯,它清楚地告訴你,它就是一個分發(fā)器,選擇什么樣的模型,選擇什么樣的視圖,可以完成什么樣的用戶請求??刂茖硬⒉蛔鋈魏蔚臄?shù)據(jù)處理。例如,用戶點擊一個連接,控制層接受請求后,并不處理業(yè)務(wù)信息,它只把用戶的信息傳遞給模型,告訴模型做什么,選擇符合要求的視圖返回給用戶。因此,一個模型可能對應(yīng)多個視圖,一個視圖可能對應(yīng)多個模型。
2022/11/269SpringMVC培訓(xùn)——孫林MVC設(shè)計思想控制(Controller)可以理解為JSPModel1架構(gòu)
Model1的基礎(chǔ)是JSP文件,它由一些相互獨立的JSP文件和其他一些JavaClass組成。這些JSP從HTTPRequest中獲得所需要的數(shù)據(jù),處理業(yè)務(wù)邏輯,然后將結(jié)果通過Response返前端瀏覽器。Model1的應(yīng)該說是唯一的好處是“簡單”,可以大大加快系統(tǒng)的開發(fā)進度。它把表現(xiàn)層和業(yè)務(wù)邏輯層柔和在一起,不利于以后的維護工作以及開發(fā)角色的分配,所以這種模式只能適合于小的系統(tǒng)開發(fā)。2022/11/2610SpringMVC培訓(xùn)——孫林JSPModel1架構(gòu)Model1的基礎(chǔ)是JJSPModel2架構(gòu) Model2采用面向?qū)ο蠹夹g(shù)實現(xiàn)MVC模式從而擴展JSP/Servlet的模式。Model2是MVC在Web上的應(yīng)用。2022/11/2611SpringMVC培訓(xùn)——孫林JSPModel2架構(gòu) Model2采用面向?qū)ο蠹夹g(shù)實一個Model2規(guī)范實現(xiàn)的Web框架2022/11/2612SpringMVC培訓(xùn)——孫林一個Model2規(guī)范實現(xiàn)的Web框架2022/11/261一個Model2規(guī)范實現(xiàn)的Web框架視圖層采用JSP實現(xiàn);控制層采用Servlet實現(xiàn),整個框架采用同一個Servlet,以實現(xiàn)請求的中轉(zhuǎn);模型層采用Java實現(xiàn),主要決定用來做什么;在模型層后添加了一個DAO,目的是將決定做什么和具體怎么做分開。整個Web框架大致的流程是:首先客戶端發(fā)送請求,提交JSP頁面給中轉(zhuǎn)器(Servlet);中轉(zhuǎn)器根據(jù)客戶的請求,選擇相應(yīng)的模型層,即Logic,Logic進行相應(yīng)的邏輯處理;如果需要使用數(shù)據(jù)庫,則通過DAO進行相應(yīng)的數(shù)據(jù)庫操作。2022/11/2613SpringMVC培訓(xùn)——孫林一個Model2規(guī)范實現(xiàn)的Web框架視圖層采用JSPSpringMVC架構(gòu)2022/11/2614SpringMVC培訓(xùn)——孫林SpringMVC架構(gòu)2022/11/2614SprinSpringMVC架構(gòu)SpringMVC是結(jié)構(gòu)最清晰的MVCModel2實現(xiàn)。它的Action也不叫Action,而是稱做Controller;Controller接收request,response參數(shù),然后返回ModelAndView(其中的Model不是Object類型,而是Map類型)。但在其它的WebFramework中,Action返回值一般都只是一個ViewName;Model則需要通過其它的途徑(如request.attribute,Context參數(shù),或Action本身的屬性數(shù)據(jù))傳遞上去。2022/11/2615SpringMVC培訓(xùn)——孫林SpringMVC架構(gòu)SpringMVC是結(jié)構(gòu)SpringWebMVC請求處理流程2022/11/2616SpringMVC培訓(xùn)——孫林SpringWebMVC請求處理流程2022/11/26SpringMVC特點清晰的角色劃分:控制器(controller)、驗證器(validator)、命令對象(commandobject)、表單對象(formobject)、模型對象(modelobject)、Servlet分發(fā)器(DispatcherServlet)、處理器映射(handlermapping)、視圖解析器(viewresolver)等。每一個角色都可以由一個專門的對象來實現(xiàn)。強大而直接的配置方式:將框架類和應(yīng)用程序類都能作為JavaBean配置,支持跨多個context的引用,例如,在web控制器中對業(yè)務(wù)對象和驗證器(validator)的引用??蛇m配、非侵入:可以根據(jù)不同的應(yīng)用場景,選擇合適的控制器子類(simple型、command型、form型、wizard型、multi-action型或者自定義),而不是從單一控制器(比如Action/ActionForm)繼承。2022/11/2617SpringMVC培訓(xùn)——孫林SpringMVC特點清晰的角色劃分:控制器(contSpringMVC特點可重用的業(yè)務(wù)代碼:可以使用現(xiàn)有的業(yè)務(wù)對象作為命令或表單對象,而不需要去擴展某個特定框架的基類??啥ㄖ频慕壎ǎ╞inding)和驗證(validation):比如將類型不匹配作為應(yīng)用級的驗證錯誤,這可以保存錯誤的值。再比如本地化的日期和數(shù)字綁定等等。在其他某些框架中,你只能使用字符串表單對象,需要手動解析它并轉(zhuǎn)換到業(yè)務(wù)對象??啥ㄖ频膆andlermapping和viewresolution:Spring提供從最簡單的URL映射,到復(fù)雜的、專用的定制策略。與某些webMVC框架強制開發(fā)人員使用單一特定技術(shù)相比,Spring顯得更加靈活。靈活的model轉(zhuǎn)換:在Springweb框架中,使用基于Map的鍵/值對來達到輕易地與各種視圖技術(shù)的集成。2022/11/2618SpringMVC培訓(xùn)——孫林SpringMVC特點可重用的業(yè)務(wù)代碼:可以使用現(xiàn)有的SpringMVC特點可定制的本地化和主題(theme)解析:支持在JSP中可選擇地使用Spring標(biāo)簽庫、支持JSTL、支持Velocity(不需要額外的中間層)等等。簡單而強大的JSP標(biāo)簽庫(SpringTagLibrary):支持包括諸如數(shù)據(jù)綁定和主題(theme)之類的許多功能。JSP表單標(biāo)簽庫:在Spring2.0中引入的表單標(biāo)簽庫,使得在JSP中編寫表單更加容易。SpringBean的生命周期可以被限制在當(dāng)前的HTTPRequest或者HTTPSession。2022/11/2619SpringMVC培訓(xùn)——孫林SpringMVC特點可定制的本地化和主題(themeSpringMVC重要組件2022/11/2620SpringMVC培訓(xùn)——孫林SpringMVC重要組件2022/11/2620SprSpringMVC重要組件Springmvc請所有的請求都提交給DispatcherServlet,它會委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)負(fù)責(zé)對請求進行真正的處理工作。DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller。DispatcherServlet請請求提交到目標(biāo)Controller。Controller進行業(yè)務(wù)邏輯處理后,會返回一個ModelAndView。Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象。視圖對象負(fù)責(zé)渲染返回給客戶端。
2022/11/2621SpringMVC培訓(xùn)——孫林SpringMVC重要組件Springmvc請所有的請SpringMVC架構(gòu)類圖2022/11/2622SpringMVC培訓(xùn)——孫林SpringMVC架構(gòu)類圖2022/11/2622SprDispatcherServlet2022/11/2623SpringMVC培訓(xùn)——孫林DispatcherServlet2022/11/2623SDispatcherServlet應(yīng)用了“FrontController”
模式–是所有SpringMVC請求的中樞。繼承了HttpServlet,是一個Servlet,由WebApplicationContext加載如果不作其它配置,會加載默認(rèn)組件2022/11/2624SpringMVC培訓(xùn)——孫林DispatcherServlet應(yīng)用了“FrontCo在web.xml配DispatcherServletweb.xml…<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>WEB-INF/mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet>…2022/11/2625SpringMVC培訓(xùn)——孫林在web.xml配DispatcherServletwebHandlerMapping2022/11/2626SpringMVC培訓(xùn)——孫林HandlerMapping2022/11/2626SpriHandlerMapping將web請求映射到正確的處理器(handler)上,通常是一個Controller不需用自定義處理器映射–已經(jīng)內(nèi)置了很多處理器映射策略在處理器映射中通過配置攔截器(包括處理器執(zhí)行前、執(zhí)行后、或者執(zhí)行前后運行攔截器)將使其功能更強大2022/11/2627SpringMVC培訓(xùn)——孫林HandlerMapping將web請求映射到正確的處理器(BeanNameUrlHandlerMapping把一個URL影射到一個和它名字相同的已注冊的bean–比如/simple將影射到一個名為“/simple”的bean??梢越obean多個名字(別名)通過空格來分隔必須有一個name屬性–“/”在xml中不能定義id屬性在bean名字中可以使用通配符(/simple*)是默認(rèn)的HandlerMapping,如果在上下文中沒有找到處理器映射,DispatcherServlet會為你創(chuàng)建一個BeanNameUrlHandlerMapping,但不鼓勵2022/11/2628SpringMVC培訓(xùn)——孫林BeanNameUrlHandlerMapping把一個UBeanNameUrlHandlerMappingdispatcher-servlet.xml<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><beanname="/simple.htm/simpleSimon.htm"class="com.twoqubed.mvc.web.SimpleController">…</bean>2022/11/2629SpringMVC培訓(xùn)——孫林BeanNameUrlHandlerMappingdispaSimpleUrlHandlerMapping最常用的處理器映射,將請求的URLs影射到handlers由一系列的分別代表URLs和bean的名字的name/value對來定義影射。Bean的名字可以用通配符(/simple*)2022/11/2630SpringMVC培訓(xùn)——孫林SimpleUrlHandlerMapping最常用的處理器SimpleUrlHandlerMappingdispatcher-servlet.xml…<beanclass="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><propertyname="mappings"><value>/simple.htm=simpleController/test*=testController</value></property></bean>…2022/11/2631SpringMVC培訓(xùn)——孫林SimpleUrlHandlerMappingdispatcControllerClassNameHandlerMapping支持慣例優(yōu)先原則在它的應(yīng)用上下文中找出所有不同的處理器(handler)(或Controller)bean,并去掉名稱中的Controller,來定義它的處理器映射。Removed"Controller"fromclassname全部轉(zhuǎn)為小寫前面加“/”后面附"*“例子:WelcomeController映射到“/welcome*”請求URL極大的減少了影射的配置dispatcher-servlet.xml<beanclass="org.springframework.web.servlet.mvc.
support.ControllerClassNameHandlerMapping"/>2022/11/2632SpringMVC培訓(xùn)——孫林ControllerClassNameHandlerMappControllers2022/11/2633SpringMVC培訓(xùn)——孫林Controllers2022/11/2633SpringController接口負(fù)責(zé)處理請求內(nèi)部參數(shù)繼承HttpServlethandleRequest(HttpServletRequest,HttpServletResponse)返回一個ModelAndView對象所有實現(xiàn)都是線程安全的基本不用自己實現(xiàn)接口–已經(jīng)提供了很多實用的實現(xiàn)類2022/11/2634SpringMVC培訓(xùn)——孫林Controller接口負(fù)責(zé)處理請求2022/11/263ModelAndView對象封裝了用來渲染頁面的model和viewModel用java.util.Map實現(xiàn)的添加對象,可以不需用名字:addObject(String,Object)–用顯式名字添加addObject(Object)–用默認(rèn)名添加(慣例優(yōu)先)View用String或View對象表示類似Struts的Action2022/11/2635SpringMVC培訓(xùn)——孫林ModelAndView對象封裝了用來渲染頁面的modeController實現(xiàn)通常在我們的應(yīng)用中要求Controllers:自動作默認(rèn)處理(不用編碼)簡單web處理在web層和service層之間作相應(yīng)的處理參數(shù)處理視圖跳轉(zhuǎn)輸入驗證2022/11/2636SpringMVC培訓(xùn)——孫林Controller實現(xiàn)通常在我們的應(yīng)用中要求ControAbstractController提供了簡單的操作用來處理一個簡單的請求protectedModelAndViewhandleRequestInternal(HttpServletRequestrequest,HttpServletResponseresponse){Stringtext=service.getText();returnnewModelAndView("simple","text",text);}2022/11/2637SpringMVC培訓(xùn)——孫林AbstractController提供了簡單的操作2022ThrowawayController中文叫做一次性控制器,也就像一次性筷子那樣用完即丟并不在Spring的Controller繼承架構(gòu)中,而是一個獨立的接口定義當(dāng)映射的不是一個model對象時很有用Bean的作用域必須是prototype,他們本身不是線程安全的2022/11/2638SpringMVC培訓(xùn)——孫林ThrowawayController中文叫做一次性控制器,ThrowawayControllerdispatcher-servlet.xml…<beanid="exampleThrowawayController"class="com.twoqubed.mvc.web.ExampleThrowawayController"scope="prototype"/>…配置作為一個prototypebean2022/11/2639SpringMVC培訓(xùn)——孫林ThrowawayControllerdispatcher-ThrowawayControllerpublicclassExampleThrowawayControllerimplementsThrowawayController{privateStringmessage;publicvoidsetMessage(Stringmessage){this.message=message;}publicModelAndViewexecute()throwsException{StringhashCodeMessage="["+hashCode()+"]-"+message;returnnewModelAndView("throwaway","message",hashCodeMessage);}}2022/11/2640SpringMVC培訓(xùn)——孫林ThrowawayControllerpublicclasCommandControllers提供了一種和數(shù)據(jù)對象交互的方式,并動態(tài)地將來自HttpServletRequest的參數(shù)綁定到指定的數(shù)據(jù)對象上。功能和Struts中的ActionForm有點像,不過在Spring中,不需要實現(xiàn)任何接口來實現(xiàn)數(shù)據(jù)綁定Command可以是任何POJO–通常是一個domain對象提供的功能:綁定用戶類型自動驗證自動創(chuàng)建command對象稍后會用到…2022/11/2641SpringMVC培訓(xùn)——孫林CommandControllers提供了一種和數(shù)據(jù)對象交CommandControllersAbstractCommandController–提供綁定和驗證SimpleFormController–除了提供綁定和驗證,還提供了工作流中的表單處理對表單form處理很有用具體細節(jié)后面介紹AbstractWizardFormController–適合涉及多個頁面的表單form處理2022/11/2642SpringMVC培訓(xùn)——孫林CommandControllersAbstractCom其他ControllersServletWrappingControllerandServletForwardingController–為了Struts專門設(shè)計的,在spring攔截器里封裝了Strutsservlet,作用相當(dāng)于代理Struts的ActionServletParameterizableViewController–簡單的返回一個指定的視圖名稱,不涉及客戶端視圖技術(shù)(從而避免了在Java代碼中的硬編碼)UrlFilenameViewController–會檢查URL,獲取文件請求的文件名,并把它作為視圖名加以使用。如:/index.html對應(yīng)的視圖文件名是index
2022/11/2643SpringMVC培訓(xùn)——孫林其他ControllersServletWrappingC攔截器(Interceptors)2022/11/2644SpringMVC培訓(xùn)——孫林?jǐn)r截器(Interceptors)2022/11/2644S攔截器Interceptors在請求前后添加其它功能包括攔截器方法–preHandleandpostHandle包括回調(diào)方法–afterCompletetion可以通過HandlerMapping和一系列Controller關(guān)聯(lián)上2022/11/2645SpringMVC培訓(xùn)——孫林?jǐn)r截器Interceptors在請求前后添加其它功能2022攔截器Interceptors實現(xiàn)實現(xiàn)HandlerInterceptor或WebRequestInterceptorSpring提供的幾個實現(xiàn)OvenXxxInViewInteceptor–用于ORM架構(gòu)JDO,JPAandHibernateUserRoleAuthorizationInterceptor–用于各種角色授權(quán)驗證其他有用的擴展:自定義安全,caching,…2022/11/2646SpringMVC培訓(xùn)——孫林?jǐn)r截器Interceptors實現(xiàn)實現(xiàn)HandlerInt攔截器Interceptors例子下面的例子提供了一個攔截器,它攔截所有請求,如果當(dāng)前時間不是在上午9點到下午6點,它將用戶重定向到某個頁面。所有的請求都將被TimeBasedAccessInterceptor截獲,如果當(dāng)前時間不在上班時間,用戶會被重定向到一個靜態(tài)html頁面,提供諸如只有上班時間才能訪問網(wǎng)站之類的告示。2022/11/2647SpringMVC培訓(xùn)——孫林?jǐn)r截器Interceptors例子下面的例子提供了一個攔截器攔截器Interceptors例子<beans><beanid="handlerMapping"class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><propertyname="interceptors"><list>
<refbean="officeHoursInterceptor"/></list></property><propertyname="mappings"><value> /*.form=editAccountFormController
/*.view=editAccountFormController</value></property></bean><beanid="officeHoursInterceptor"class="samples.TimeBasedAccessInterceptor"><propertyname="openingTime"value="9"/> <propertyname="closingTime"value="18"/></bean><beans>2022/11/2648SpringMVC培訓(xùn)——孫林?jǐn)r截器Interceptors例子<beans>2022/攔截器Interceptors例子packagesamples;publicclassTimeBasedAccessInterceptorextendsHandlerInterceptorAdapter{ privateintopeningTime; privateintclosingTime; publicvoidsetOpeningTime(intopeningTime){ this.openingTime=openingTime; } publicvoidsetClosingTime(intclosingTime){ this.closingTime=closingTime; } publicbooleanpreHandle(HttpServletRequestrequest, HttpServletResponseresponse,Objecthandler)throwsException{ Calendarcal=Calendar.getInstance(); inthour=cal.get(HOUR_OF_DAY); if(openingTime<=hour<closingTime){ returntrue; }else{ response.sendRedirect("/outsideOfficeHours.html"); returnfalse; } }}2022/11/2649SpringMVC培訓(xùn)——孫林?jǐn)r截器Interceptors例子packagesampl視圖解析器(ViewResolver)2022/11/2650SpringMVC培訓(xùn)——孫林視圖解析器(ViewResolver)2022/11/265視圖解析器(ViewResolver)從一個邏輯視圖名映射到一個視圖對象可以排序,所以能鏈在一起對JSP用戶,通常實現(xiàn)InternalResourceViewResolver:<beanid="internalResourceViewResolver"…<propertyname="prefix"value="/WEB-INF/jsp/"/><propertyname="suffix"value=".jsp"/></bean>2022/11/2651SpringMVC培訓(xùn)——孫林視圖解析器(ViewResolver)從一個邏輯視圖名映射到其它視圖解析器的實現(xiàn)VelocityViewResolver–針對Velocitytemplates設(shè)計的FreeMarkerViewResolver–針對FreeMarkertemplates設(shè)計的ResourceBundleViewResolver映射關(guān)系在一個properties文件支持國際化XmlViewResolver–映射關(guān)系在XML文件2022/11/2652SpringMVC培訓(xùn)——孫林其它視圖解析器的實現(xiàn)VelocityViewResolver視圖(View)2022/11/2653SpringMVC培訓(xùn)——孫林視圖(View)2022/11/2653SpringMVC視圖(View)支持的幾種視圖模板技術(shù):InternalResourceView(JSP)JstlView(JSP+JSTL)VelocityView(Velocity)FreeMarkerView(FreeMarker)TilesView(Tiles)TilesJstlView(Tiles+JSTL)還支持渲染下列視圖:ExcelfilesPDFfilesXSLTresultsJasperReports2022/11/2654SpringMVC培訓(xùn)——孫林視圖(View)支持的幾種視圖模板技術(shù):2022/11/26SpringMVCform處理SimpleFormController提供了表單處理通用工作流程提供了用戶自定義標(biāo)簽,用來展示和處理常用的表單默認(rèn),GET用于form展示,POST用于form處理通過一些Controller類實現(xiàn)表單展示處理能處理完整的工作流–這是亮點2022/11/2655SpringMVC培訓(xùn)——孫林SpringMVCform處理SimpleFormCon注冊Command類SimpleFormControllers關(guān)聯(lián)一個Commandclass因為是緊耦合,配置這個Controllerclass是可以的publicclassPlayerFormControllerextendsSimpleFormController{publicPlayerFormController(){setCommandClass(Player.class);setCommandName("player");}2022/11/2656SpringMVC培訓(xùn)——孫林注冊Command類SimpleFormControll展示一個form在工作流中展示form涉及的三個方法formBackingObject–在form里返回一個command對象initBinder–注冊用戶自定義屬性referenceData–導(dǎo)入要在頁面實現(xiàn)的數(shù)據(jù)2022/11/26SpringMVC培訓(xùn)——孫林57展示一個form在工作流中展示form涉及的三個方法20處理form表單處理form表單的兩個主要方法:onBindAndValidate()–允許用戶邦定和驗證doSubmitAction()–處理完表單后,回調(diào)動作。典型的實現(xiàn)是持久化對象到數(shù)據(jù)庫。2022/11/26SpringMVC培訓(xùn)——孫林58處理form表單處理form表單的兩個主要方法:2022/SpringMVC其它特性其它SpringMVC功能這里不再介紹了,但很優(yōu)秀處理多請求支持自定義主體支持國際化方便ServletContextListener初始化Log4JSpringMVC標(biāo)簽2022/11/26SpringMVC培訓(xùn)——孫林59SpringMVC其它特性其它SpringMVC功能SpringMVC技術(shù)體系介紹2022/11/2660SpringMVC培訓(xùn)——孫林SpringMVC技術(shù)體系介紹2022/11/261SpMVC模式介紹SpringMVC架構(gòu)SpringMVC重要組件2022/11/2661SpringMVC培訓(xùn)——孫林目錄MVC模式介紹2022/11/262SpringMVC培MVC模式介紹——J2EE中的MVC2022/11/2662SpringMVC培訓(xùn)——孫林MVC模式介紹——J2EE中的MVC2022/11/263SMVC模式介紹模型-視圖-控制器(Model-View-Controller)把一個應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應(yīng)用被分成三個層——模型層、視圖層、控制層。MVC模式是解決了展示以及業(yè)務(wù)邏輯實現(xiàn)的分離。讓開發(fā)者可以專心地解決不同層的編碼。也方便代碼重用和測試和維護。JSP、HTML、XMLServlet、Struts、Spring實體Bean、Entity、VO、FormBean2022/11/2663SpringMVC培訓(xùn)——孫林MVC模式介紹模型-視圖-控制器(Model-View-CoServices層常用的應(yīng)用系統(tǒng)中的多層結(jié)構(gòu)View展示層Controller控制層業(yè)務(wù)邏輯處理層數(shù)據(jù)持久化層(DAO)實體Bean、Entity層數(shù)據(jù)庫2022/11/2664SpringMVC培訓(xùn)——孫林Services層常用的應(yīng)用系統(tǒng)中的多層結(jié)構(gòu)View展示層CMVC設(shè)計思想 MVC是一種復(fù)合模式,結(jié)合了觀察者模式、策略模式、組合模式、適配器模式。
模型使用觀察者模式,以便觀察者更新,同時保持兩者之間的解耦??刂破魇且晥D的策略,視圖使用組合模式實現(xiàn)用戶界面。適配器模式用來將模型適配成符合現(xiàn)有視圖和控制器的需要的模型。
這些模式合作把MVC模式的三層解耦。2022/11/2665SpringMVC培訓(xùn)——孫林MVC設(shè)計思想 MVC是一種復(fù)合模式,結(jié)合了觀察者模式、策略MVC設(shè)計思想視圖(View)代表用戶交互界面,對于Web應(yīng)用來說,可以是HTML,也可能是jsp、XML和Applet等。一個應(yīng)用可能有很多不同的視圖,MVC設(shè)計模式對于視圖的處理僅限于視圖上數(shù)據(jù)的采集和處理,以及用戶的請求,而不包括在視圖上的業(yè)務(wù)流程的處理。業(yè)務(wù)流程的處理交予模型(Model)處理。比如一個訂單的視圖只接受來自模型的數(shù)據(jù)并顯示給用戶,以及將用戶界面的輸入數(shù)據(jù)和請求傳遞給控制和模型。
2022/11/2666SpringMVC培訓(xùn)——孫林MVC設(shè)計思想視圖(View)代表用戶交互界面,對于MVC設(shè)計思想模型(Model):是業(yè)務(wù)的處理以及業(yè)務(wù)規(guī)則的制定。模型接受視圖請求的數(shù)據(jù),并返回最終的處理結(jié)果。業(yè)務(wù)模型的設(shè)計是MVC最主要的核心。MVC設(shè)計模式告訴我們,把應(yīng)用的模型按一定的規(guī)則抽取出來,抽取的層次很重要,抽象與具體不能隔得太遠,也不能太近。MVC并沒有提供模型的設(shè)計方法,而只是組織管理這些模型,以便于模型的重構(gòu)和提高重用性。業(yè)務(wù)模型還有一個很重要的模型那就是數(shù)據(jù)模型。數(shù)據(jù)模型主要指實體對象的數(shù)據(jù)保存(持續(xù)化)。比如將一張訂單保存到數(shù)據(jù)庫,從數(shù)據(jù)庫獲取訂單。我們可以將這個模型單獨列出,所有有關(guān)數(shù)據(jù)庫的操作只限制在該模型中。2022/11/2667SpringMVC培訓(xùn)——孫林MVC設(shè)計思想模型(Model):是業(yè)務(wù)的處理MVC設(shè)計思想控制(Controller)可以理解為從用戶接收請求,將模型與視圖匹配在一起,共同完成用戶的請求。劃分控制層的作用也很明顯,它清楚地告訴你,它就是一個分發(fā)器,選擇什么樣的模型,選擇什么樣的視圖,可以完成什么樣的用戶請求??刂茖硬⒉蛔鋈魏蔚臄?shù)據(jù)處理。例如,用戶點擊一個連接,控制層接受請求后,并不處理業(yè)務(wù)信息,它只把用戶的信息傳遞給模型,告訴模型做什么,選擇符合要求的視圖返回給用戶。因此,一個模型可能對應(yīng)多個視圖,一個視圖可能對應(yīng)多個模型。
2022/11/2668SpringMVC培訓(xùn)——孫林MVC設(shè)計思想控制(Controller)可以理解為JSPModel1架構(gòu)
Model1的基礎(chǔ)是JSP文件,它由一些相互獨立的JSP文件和其他一些JavaClass組成。這些JSP從HTTPRequest中獲得所需要的數(shù)據(jù),處理業(yè)務(wù)邏輯,然后將結(jié)果通過Response返前端瀏覽器。Model1的應(yīng)該說是唯一的好處是“簡單”,可以大大加快系統(tǒng)的開發(fā)進度。它把表現(xiàn)層和業(yè)務(wù)邏輯層柔和在一起,不利于以后的維護工作以及開發(fā)角色的分配,所以這種模式只能適合于小的系統(tǒng)開發(fā)。2022/11/2669SpringMVC培訓(xùn)——孫林JSPModel1架構(gòu)Model1的基礎(chǔ)是JJSPModel2架構(gòu) Model2采用面向?qū)ο蠹夹g(shù)實現(xiàn)MVC模式從而擴展JSP/Servlet的模式。Model2是MVC在Web上的應(yīng)用。2022/11/2670SpringMVC培訓(xùn)——孫林JSPModel2架構(gòu) Model2采用面向?qū)ο蠹夹g(shù)實一個Model2規(guī)范實現(xiàn)的Web框架2022/11/2671SpringMVC培訓(xùn)——孫林一個Model2規(guī)范實現(xiàn)的Web框架2022/11/261一個Model2規(guī)范實現(xiàn)的Web框架視圖層采用JSP實現(xiàn);控制層采用Servlet實現(xiàn),整個框架采用同一個Servlet,以實現(xiàn)請求的中轉(zhuǎn);模型層采用Java實現(xiàn),主要決定用來做什么;在模型層后添加了一個DAO,目的是將決定做什么和具體怎么做分開。整個Web框架大致的流程是:首先客戶端發(fā)送請求,提交JSP頁面給中轉(zhuǎn)器(Servlet);中轉(zhuǎn)器根據(jù)客戶的請求,選擇相應(yīng)的模型層,即Logic,Logic進行相應(yīng)的邏輯處理;如果需要使用數(shù)據(jù)庫,則通過DAO進行相應(yīng)的數(shù)據(jù)庫操作。2022/11/2672SpringMVC培訓(xùn)——孫林一個Model2規(guī)范實現(xiàn)的Web框架視圖層采用JSPSpringMVC架構(gòu)2022/11/2673SpringMVC培訓(xùn)——孫林SpringMVC架構(gòu)2022/11/2614SprinSpringMVC架構(gòu)SpringMVC是結(jié)構(gòu)最清晰的MVCModel2實現(xiàn)。它的Action也不叫Action,而是稱做Controller;Controller接收request,response參數(shù),然后返回ModelAndView(其中的Model不是Object類型,而是Map類型)。但在其它的WebFramework中,Action返回值一般都只是一個ViewName;Model則需要通過其它的途徑(如request.attribute,Context參數(shù),或Action本身的屬性數(shù)據(jù))傳遞上去。2022/11/2674SpringMVC培訓(xùn)——孫林SpringMVC架構(gòu)SpringMVC是結(jié)構(gòu)SpringWebMVC請求處理流程2022/11/2675SpringMVC培訓(xùn)——孫林SpringWebMVC請求處理流程2022/11/26SpringMVC特點清晰的角色劃分:控制器(controller)、驗證器(validator)、命令對象(commandobject)、表單對象(formobject)、模型對象(modelobject)、Servlet分發(fā)器(DispatcherServlet)、處理器映射(handlermapping)、視圖解析器(viewresolver)等。每一個角色都可以由一個專門的對象來實現(xiàn)。強大而直接的配置方式:將框架類和應(yīng)用程序類都能作為JavaBean配置,支持跨多個context的引用,例如,在web控制器中對業(yè)務(wù)對象和驗證器(validator)的引用??蛇m配、非侵入:可以根據(jù)不同的應(yīng)用場景,選擇合適的控制器子類(simple型、command型、form型、wizard型、multi-action型或者自定義),而不是從單一控制器(比如Action/ActionForm)繼承。2022/11/2676SpringMVC培訓(xùn)——孫林SpringMVC特點清晰的角色劃分:控制器(contSpringMVC特點可重用的業(yè)務(wù)代碼:可以使用現(xiàn)有的業(yè)務(wù)對象作為命令或表單對象,而不需要去擴展某個特定框架的基類??啥ㄖ频慕壎ǎ╞inding)和驗證(validation):比如將類型不匹配作為應(yīng)用級的驗證錯誤,這可以保存錯誤的值。再比如本地化的日期和數(shù)字綁定等等。在其他某些框架中,你只能使用字符串表單對象,需要手動解析它并轉(zhuǎn)換到業(yè)務(wù)對象??啥ㄖ频膆andlermapping和viewresolution:Spring提供從最簡單的URL映射,到復(fù)雜的、專用的定制策略。與某些webMVC框架強制開發(fā)人員使用單一特定技術(shù)相比,Spring顯得更加靈活。靈活的model轉(zhuǎn)換:在Springweb框架中,使用基于Map的鍵/值對來達到輕易地與各種視圖技術(shù)的集成。2022/11/2677SpringMVC培訓(xùn)——孫林SpringMVC特點可重用的業(yè)務(wù)代碼:可以使用現(xiàn)有的SpringMVC特點可定制的本地化和主題(theme)解析:支持在JSP中可選擇地使用Spring標(biāo)簽庫、支持JSTL、支持Velocity(不需要額外的中間層)等等。簡單而強大的JSP標(biāo)簽庫(SpringTagLibrary):支持包括諸如數(shù)據(jù)綁定和主題(theme)之類的許多功能。JSP表單標(biāo)簽庫:在Spring2.0中引入的表單標(biāo)簽庫,使得在JSP中編寫表單更加容易。SpringBean的生命周期可以被限制在當(dāng)前的HTTPRequest或者HTTPSession。2022/11/2678SpringMVC培訓(xùn)——孫林SpringMVC特點可定制的本地化和主題(themeSpringMVC重要組件2022/11/2679SpringMVC培訓(xùn)——孫林SpringMVC重要組件2022/11/2620SprSpringMVC重要組件Springmvc請所有的請求都提交給DispatcherServlet,它會委托應(yīng)用系統(tǒng)的其他模塊負(fù)責(zé)負(fù)責(zé)對請求進行真正的處理工作。DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller。DispatcherServlet請請求提交到目標(biāo)Controller。Controller進行業(yè)務(wù)邏輯處理后,會返回一個ModelAndView。Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象。視圖對象負(fù)責(zé)渲染返回給客戶端。
2022/11/2680SpringMVC培訓(xùn)——孫林SpringMVC重要組件Springmvc請所有的請SpringMVC架構(gòu)類圖2022/11/2681SpringMVC培訓(xùn)——孫林SpringMVC架構(gòu)類圖2022/11/2622SprDispatcherServlet2022/11/2682SpringMVC培訓(xùn)——孫林DispatcherServlet2022/11/2623SDispatcherServlet應(yīng)用了“FrontController”
模式–是所有SpringMVC請求的中樞。繼承了HttpServlet,是一個Servlet,由WebApplicationContext加載如果不作其它配置,會加載默認(rèn)組件2022/11/2683SpringMVC培訓(xùn)——孫林DispatcherServlet應(yīng)用了“FrontCo在web.xml配DispatcherServletweb.xml…<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>WEB-INF/mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet>…2022/11/2684SpringMVC培訓(xùn)——孫林在web.xml配DispatcherServletwebHandlerMapping2022/11/2685SpringMVC培訓(xùn)——孫林HandlerMapping2022/11/2626SpriHandlerMapping將web請求映射到正確的處理器(handler)上,通常是一個Controller不需用自定義處理器映射–已經(jīng)內(nèi)置了很多處理器映射策略在處理器映射中通過配置攔截器(包括處理器執(zhí)行前、執(zhí)行后、或者執(zhí)行前后運行攔截器)將使其功能更強大2022/11/2686SpringMVC培訓(xùn)——孫林HandlerMapping將web請求映射到正確的處理器(BeanNameUrlHandlerMapping把一個URL影射到一個和它名字相同的已注冊的bean–比如/simple將影射到一個名為“/simple”的bean??梢越obean多個名字(別名)通過空格來分隔必須有一個name屬性–“/”在xml中不能定義id屬性在bean名字中可以使用通配符(/simple*)是默認(rèn)的HandlerMapping,如果在上下文中沒有找到處理器映射,DispatcherServlet會為你創(chuàng)建一個BeanNameUrlHandlerMapping,但不鼓勵2022/11/2687SpringMVC培訓(xùn)——孫林BeanNameUrlHandlerMapping把一個UBeanNameUrlHandlerMappingdispatcher-servlet.xml<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><beanname="/simple.htm/simpleSimon.htm"class="com.twoqubed.mvc.web.SimpleController">…</bean>2022/11/2688SpringMVC培訓(xùn)——孫林BeanNameUrlHandlerMappingdispaSimpleUrlHandlerMapping最常用的處理器映射,將請求的URLs影射到handlers由一系列的分別代表URLs和bean的名字的name/value對來定義影射。Bean的名字可以用通配符(/simple*)2022/11/2689SpringMVC培訓(xùn)——孫林SimpleUrlHandlerMapping最常用的處理器SimpleUrlHandlerMappingdispatcher-servlet.xml…<beanclass="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><propertyname="mappings"><value>/simple.htm=simpleController/test*=testController</value></property></bean>…2022/11/2690SpringMVC培訓(xùn)——孫林SimpleUrlHandlerMappingdispatcControllerClassNameHandlerMapping支持慣例優(yōu)先原則在它的應(yīng)用上下文中找出所有不同的處理器(handler)(或Controller)bean,并去掉名稱中的Controller,來定義它的處理器映射。Removed"Controller"fromclassname全部轉(zhuǎn)為小寫前面加“/”后面附"*“例子:WelcomeController映射到“/welcome*”請求URL極大的減少了影射的配置dispatcher-servlet.xml<beanclass="org.springframework.web.servlet.mvc.
support.ControllerClassNameHandlerMapping"/>2022/11/2691SpringMVC培訓(xùn)——孫林ControllerClassNameHandlerMappControllers2022/11/2692SpringMVC培訓(xùn)——孫林Controllers2022/11/2633SpringController接口負(fù)責(zé)處理請求內(nèi)部參數(shù)繼承HttpServlethandleRequest(HttpServletRequest,HttpServletResponse)返回一個ModelAndView對象所有實現(xiàn)都是線程安全的基本不用自己實現(xiàn)接口–已經(jīng)提供了很多實用的實現(xiàn)類2022/11/2693SpringMVC培訓(xùn)——孫林Controller接口負(fù)責(zé)處理請求2022/11/263ModelAndView對象封裝了用來渲染頁面的model和viewModel用java.util.Map實現(xiàn)的添加對象,可以不需用名字:addObject(String,Object)–用顯式名字添加addObject(Object)–用默認(rèn)名添加(慣例優(yōu)先)View用String或View對象表示類似Struts的Action2022/11/2694SpringMVC培訓(xùn)——孫林ModelAndView對象封裝了用來渲染頁面的modeController實現(xiàn)通常在我們的應(yīng)用中要求Controllers:自動作默認(rèn)處理(不用編碼)簡單web處理在web層和service層之間作相應(yīng)的處理參數(shù)處理視圖跳轉(zhuǎn)輸入驗證2022/11/2695SpringMVC培訓(xùn)——孫林Controller實現(xiàn)通常在我們的應(yīng)用中要求ControAbstractController提供了簡單的操作用來處理一個簡單的請求protectedModelAndViewhandleRequestInternal(HttpServletRequestrequest,HttpServletResponseresponse){Stringtext=service.getText();returnnewModelAndView("simple","text",text);}2022/11/2696SpringMVC培訓(xùn)——孫林AbstractController提供了簡單的操作2022ThrowawayController中文叫做一次性控制器,也就像一次性筷子那樣用完即丟并不在Spring的Controller繼承架構(gòu)中,而是一個獨立的接口定義當(dāng)映射的不是一個model對象時很有用Bean的作用域必須是prototype,他們本身不是線程安全的2022/11/2697SpringMVC培訓(xùn)——孫林ThrowawayController中文叫做一次性控制器,ThrowawayControllerdispatcher-servlet.xml…<beanid="exampleThrowawayController"class="com.twoqubed.mvc.web.ExampleThrowawayController"scope="prototype"/>…配置作為一個prototypebean2022/11/2698SpringMVC培訓(xùn)——孫林ThrowawayControllerdispatcher-ThrowawayControllerpublicclassExampleThrowawayControllerimplementsThrowawayController{privateStringmessage;publicvoidsetMessage(Stringmessage){this.message=message;}publicModelAndViewexecute()throwsException{StringhashCodeMessage="["+hashCode()+"]-"+message;returnnewModelAndView("throwaway","message",hashCodeMessage);}}2022/11/2699SpringMVC培訓(xùn)——孫林ThrowawayControllerpublicclasCommandControllers提供了一種和數(shù)據(jù)對象交互的方式,并動態(tài)地將來自HttpServletRequest的參數(shù)綁定到指定的數(shù)據(jù)對象上。功能和Struts中的ActionForm有點像,不過在Spring中,不需要實現(xiàn)任何接口來實現(xiàn)數(shù)據(jù)綁定Command可以是任何POJO–通常是一個domain對象提供的功能:綁定用戶類型自動驗證自動創(chuàng)建command對象稍后會用到…2022/11/26100SpringMVC培訓(xùn)——孫林CommandControllers提供了一種和數(shù)據(jù)對象交CommandControllersAbstractCommandController–提供綁定和驗證SimpleFormController–除了提供綁定和驗證,還提供了工作流中的表單處理對表單form處理很有用具體細節(jié)后面介紹AbstractWizardFormController–適合涉及多個頁面的表單form處理2022/11/26101SpringMVC培訓(xùn)——孫林CommandControllersAbstractCom其他ControllersServletWrappingControllerandServletForwardingController–為了Struts專門設(shè)計的,在spring攔截器里封裝了Strutsservlet,作用相當(dāng)于代理Struts的ActionServletParameterizableViewController–簡單的返回一個指定的視圖名稱,不涉及客戶端視圖技術(shù)(從而避免了在Java代碼中的硬編碼)UrlFilenameViewController–會檢查URL,獲取文件請求的文件名,并把它作為視圖名加以使用。如:/index.html對應(yīng)的視圖文件名是index
2022/11/26102SpringMVC培訓(xùn)——孫林其他ControllersServletWrappingC攔截器(Interceptors)2022/11/26103SpringMVC培訓(xùn)——孫林?jǐn)r截器(Interceptors)2022/11/2644S攔截器Interceptors在請求前后添加其它功能包括攔截器方法–preHandleandpostHandle包括回調(diào)方法–afterCompletetion可以通過HandlerMapping和一系列Controller關(guān)聯(lián)上2022/11/26104SpringMVC培訓(xùn)——孫林?jǐn)r截器Interceptors在請求前后添加其它功能2022攔截器Interceptors實現(xiàn)實現(xiàn)HandlerInterceptor或WebRequestInterceptorSpring提供的幾個實現(xiàn)OvenXxxInViewInteceptor–用于ORM架構(gòu)JDO,JPAandHibernateUserRoleAuthorizationInterceptor–用于各種角色授權(quán)驗證其他有用的擴展:自定義安全,caching,…2022/11/26105SpringMVC培訓(xùn)——孫林?jǐn)r截器Interceptors實現(xiàn)實現(xiàn)HandlerInt攔截器Interceptors例子下面的例子提供了一個攔截器,它攔截所有請求,如
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 無抵押貸款合同樣式
- 員工離職協(xié)議模板
- 配電室維護協(xié)議書
- 權(quán)威加工合同范文合輯
- 大學(xué)新生入學(xué)法律協(xié)議范文
- 全面服裝代理合同范本
- 消防工程專業(yè)承包合同
- 廣告位承包協(xié)議范本
- 美術(shù)作品購買協(xié)議范本2024年
- 個人稅收居民證明委托申請
- GB/T 28617-2024綠色制造通用技術(shù)導(dǎo)則鑄造
- 2024年工程部門工作計劃模版(三篇)
- 出診管理制度
- 七年級數(shù)學(xué)分層教學(xué)實施方案
- 人民醫(yī)院衛(wèi)生工作制度(管理規(guī)范10篇)
- 獎牌制作施工方案
- MOOC 新時代中國特色社會主義理論與實踐-武漢理工大學(xué) 中國大學(xué)慕課答案
- 體育教育生涯發(fā)展報告
- 如何做好群團工作
- 保險代理業(yè)務(wù)及臺帳管理制度
- 媒介文化教程第六講 奇觀社會與媒體奇觀
評論
0/150
提交評論