![2023SpringBoot教學(xué)課件 第2講 Spring MVC_第1頁(yè)](http://file4.renrendoc.com/view14/M08/3F/30/wKhkGWbzZwmASlfGAAFHk6GaJaY240.jpg)
![2023SpringBoot教學(xué)課件 第2講 Spring MVC_第2頁(yè)](http://file4.renrendoc.com/view14/M08/3F/30/wKhkGWbzZwmASlfGAAFHk6GaJaY2402.jpg)
![2023SpringBoot教學(xué)課件 第2講 Spring MVC_第3頁(yè)](http://file4.renrendoc.com/view14/M08/3F/30/wKhkGWbzZwmASlfGAAFHk6GaJaY2403.jpg)
![2023SpringBoot教學(xué)課件 第2講 Spring MVC_第4頁(yè)](http://file4.renrendoc.com/view14/M08/3F/30/wKhkGWbzZwmASlfGAAFHk6GaJaY2404.jpg)
![2023SpringBoot教學(xué)課件 第2講 Spring MVC_第5頁(yè)](http://file4.renrendoc.com/view14/M08/3F/30/wKhkGWbzZwmASlfGAAFHk6GaJaY2405.jpg)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2講SpringMVCfdteachers@163.comSpringBoot導(dǎo)學(xué)課Spring,SpringMVC,SpringBoot有什么區(qū)別和聯(lián)系SpringmakesiteasytocreateJavaenterpriseapplications.ItprovideseverythingyouneedtoembracetheJavalanguageinanenterpriseenvironmentSpring主要是基于IOC反轉(zhuǎn)Beans管理Bean類SpringMVC是基于Spring的一個(gè)MVC框架,擁有web功能SpringBoot是基于Spring4的條件注冊(cè)的一套快速開(kāi)發(fā)整合包SpringCloud:現(xiàn)在是大數(shù)據(jù)、云時(shí)代,上云是必然選擇,那么SpringCloud應(yīng)運(yùn)而生1SpringMVC是基于Spring的一個(gè)MVC框架,用以替代初期的SSH框架;(springFramework本身沒(méi)有Web功能,SpringMVC使用WebApplicationContext類擴(kuò)展ApplicationContext,使得擁有web功能)SpringMVC屬于SpringFrameWork的后續(xù)產(chǎn)品,已經(jīng)融合在SpringWebFlow里面SpringBoot是為了簡(jiǎn)化Spring應(yīng)用的創(chuàng)建、運(yùn)行、調(diào)試、部署等而出現(xiàn)的,使用它可以做到專注于Spring應(yīng)用的開(kāi)發(fā),而無(wú)需過(guò)多關(guān)注XML的配置。提供了一堆依賴打包,并已經(jīng)按照使用習(xí)慣解決了依賴問(wèn)題—>習(xí)慣大于約定。2眾所周知Spring框架需要進(jìn)行大量的配置,SpringBoot引入自動(dòng)配置的概念,讓項(xiàng)目設(shè)置變得很容易。SpringBoot本身并不提供Spring框架的核心特性以及擴(kuò)展功能,只是用于快速、敏捷地開(kāi)發(fā)新一代基于Spring框架的應(yīng)用程序。也就是說(shuō),它并不是用來(lái)替代Spring的解決方案,而是和Spring框架緊密結(jié)合用于提升Spring開(kāi)發(fā)者體驗(yàn)的工具3使用Spring進(jìn)行開(kāi)發(fā)各種配置過(guò)于麻煩比如開(kāi)啟某些Spring特性時(shí),需要用XML或Java進(jìn)行顯式配置。于是,SpringBoot誕生了Spring旨在簡(jiǎn)化J2EE企業(yè)應(yīng)用程序開(kāi)發(fā)。SpringBoot旨在簡(jiǎn)化Spring開(kāi)發(fā)(減少配置文件,開(kāi)箱即用?。㏒pringBoot只是簡(jiǎn)化了配置,如果你需要構(gòu)建MVC架構(gòu)的Web程序,你還是需要使用SpringMVC作為MVC框架,只是說(shuō)SpringBoot幫你簡(jiǎn)化了SpringMVC的很多配置,真正做到開(kāi)箱即用springboot就是一個(gè)大框架里面包含了許許多多的東西,其中spring就是最核心的內(nèi)容之一,當(dāng)然也就包含springmvc4如果承載的是WEB項(xiàng)目,使用SpringMVC作為MVC框架,那么工作流程和你上面描述的是完全一樣的,因?yàn)檫@部分工作是SpringMVC做的而不是SpringBoot熟悉使用Springboot,還有必要學(xué)習(xí)SpringMVC么如果你不是為了面試的話,就沒(méi)太必要專門(mén)學(xué)了,因?yàn)槟銓W(xué)SpringBoot其實(shí)就已經(jīng)學(xué)了SpringMVC56springboot和SSM有以下幾個(gè)主要區(qū)別springboot提供了一種約定優(yōu)于配置的方式,它可以根據(jù)項(xiàng)目的依賴自動(dòng)配置合適的組件,無(wú)需手動(dòng)編寫(xiě)大量的配置文件。SSM則需要開(kāi)發(fā)者自己配置各個(gè)框架之間的集成和協(xié)調(diào),這會(huì)增加開(kāi)發(fā)和維護(hù)的復(fù)雜度springboot支持創(chuàng)建可執(zhí)行的jar包,這意味著可以直接運(yùn)行一個(gè)jar文件來(lái)啟動(dòng)應(yīng)用程序,無(wú)需額外的服務(wù)器容器。SSM則需要部署到一個(gè)服務(wù)器容器中,如Tomcat或Jetty,這會(huì)增加部署和運(yùn)行的成本springboot擁有一個(gè)強(qiáng)大的生態(tài)系統(tǒng),它提供了許多與其他技術(shù)集成的模塊,如數(shù)據(jù)庫(kù)、緩存、消息隊(duì)列、安全、監(jiān)控等。SSM則需要開(kāi)發(fā)者自己尋找合適的第三方庫(kù)來(lái)實(shí)現(xiàn)這些功能,這會(huì)增加開(kāi)發(fā)和測(cè)試的難度。springboot更適合開(kāi)發(fā)微服務(wù)架構(gòu)的應(yīng)用程序,它可以快速創(chuàng)建獨(dú)立運(yùn)行、松耦合、易于擴(kuò)展的服務(wù)。SSM則更適合開(kāi)發(fā)傳統(tǒng)的單體應(yīng)用程序,它可以實(shí)現(xiàn)較為復(fù)雜和穩(wěn)定的業(yè)務(wù)邏輯7SSM框架項(xiàng)目會(huì)有大量的配置文件,需要手動(dòng)的去整合SpringMVC、Spring、MyBatis,并且需要注意各種配置和兼容,后期的維護(hù)難度也很大SpringBoot的目的:快速整合和自動(dòng)配置8SpringBoot開(kāi)發(fā)相較于SSM開(kāi)發(fā),具有以下優(yōu)勢(shì)1.快速開(kāi)發(fā):SpringBoot采用約定大于配置的方式,大量減少了開(kāi)發(fā)的配置量,提供豐富的自動(dòng)配置,使開(kāi)發(fā)者更加專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。
2.微服務(wù)支持:SpringBoot是微服務(wù)框架的首選,提供了各種與微服務(wù)相關(guān)的組件和功能,如服務(wù)注冊(cè)和發(fā)現(xiàn)、負(fù)載均衡、調(diào)用鏈跟蹤等。
3.靈活配置:SpringBoot采用Yaml格式的配置文件,使得配置更加清晰、具有易讀性、易維護(hù)性;同時(shí),支持動(dòng)態(tài)更新配置,避免因?yàn)樾薷呐渲枚貑?yīng)用程序的缺陷。4.大量Starter:提供了大量的開(kāi)箱即用的Starter,便于程序員集成各種中間件,只需引入相應(yīng)的Starter,SpringBoot就會(huì)根據(jù)classpath下的依賴自動(dòng)生成相應(yīng)的基礎(chǔ)設(shè)置。9SpringBoot的優(yōu)點(diǎn)
Spring由于其繁瑣的配置,一度被人認(rèn)為“配置地獄”,各種XML、Annotation配置,讓人眼花繚亂,而且如果出錯(cuò)了也很難找出原因。pringBoot幫助開(kāi)發(fā)者快速啟動(dòng)一個(gè)Web容器;SpringBoot繼承了原有Spring框架的優(yōu)秀基因;SpringBoot簡(jiǎn)化了使用Spring的過(guò)程。在使用SSM開(kāi)發(fā)的時(shí)候,多數(shù)會(huì)選擇Jsp作為視圖,但是springboot不推薦使用jsp,主推的是thymeleaf和freemarker等模板引擎綜上,SpringBoot適用于構(gòu)建基于微服務(wù)架構(gòu)的應(yīng)用程序,簡(jiǎn)化了應(yīng)用的開(kāi)發(fā)和部署,提高了應(yīng)用的可維護(hù)性和可擴(kuò)展性;而SSM框架適用于構(gòu)建傳統(tǒng)的JavaWeb應(yīng)用程序,遵循MVC模式,將業(yè)務(wù)邏輯和數(shù)據(jù)持久層分離,實(shí)現(xiàn)更好的可維護(hù)性和可擴(kuò)展性。10學(xué)習(xí)最佳入門(mén)路徑先看官方文檔開(kāi)始實(shí)踐做完一兩個(gè)實(shí)際項(xiàng)目之后,返回去再讀一遍文檔11Spring和springboot的區(qū)別12131415161718192021springboot就是一個(gè)大框架里面包含了許許多多的東西,其中spring就是最核心的內(nèi)容之一,當(dāng)然也就包含springmvc。springmvc只是spring處理web層請(qǐng)求的一個(gè)模塊SpringMVC提供了一種輕度耦合的方式來(lái)開(kāi)發(fā)web應(yīng)用。SpringMVC是Spring的一個(gè)模塊,是一個(gè)web框架SpringBoot本身并不提供Spring框架的核心特性以及擴(kuò)展功能,只是用于快速、敏捷地開(kāi)發(fā)新一代基于Spring框架的應(yīng)用程序。也就是說(shuō),它并不是用來(lái)替代Spring的解決方案,而是和Spring框架緊密結(jié)合用于提升Spring開(kāi)發(fā)者體驗(yàn)的工具。同時(shí)它集成了大量常用的第三方庫(kù)配置22SpringBoot只是承載者,輔助你簡(jiǎn)化項(xiàng)目搭建過(guò)程的。如果承載的是WEB項(xiàng)目,使用SpringMVC作為MVC框架,那么工作流程和你上面描述的是完全一樣的,因?yàn)檫@部分工作是SpringMVC做的而不是SpringBoot。對(duì)使用者來(lái)說(shuō),換用SpringBoot以后,項(xiàng)目初始化方法變了,配置文件變了,另外就是不需要單獨(dú)安裝Tomcat這類容器服務(wù)器了,maven打出jar包直接跑起來(lái)就是個(gè)網(wǎng)站,但你最核心的業(yè)務(wù)邏輯實(shí)現(xiàn)與業(yè)務(wù)流程實(shí)現(xiàn)沒(méi)有任何變化。23thymeleaf有必要學(xué)嗎?24Spring的運(yùn)行原理25262728SpringBoot知識(shí)體系29SpringBoot配置與日志SpringBoot的Web開(kāi)發(fā)SpringBoot的數(shù)據(jù)訪問(wèn)SpringBoot的異步消息服務(wù)SpringBoot的安全管理SpringBoot的熱部署與單元測(cè)試SpringBoot應(yīng)用監(jiān)控與任務(wù)管理本章目標(biāo)了解SpringMVC的工作原理掌握基于注解的控制器的編寫(xiě)方式了解數(shù)據(jù)綁定的基本原理掌握SpringMVC應(yīng)用的開(kāi)發(fā)步驟了解攔截器的基本用法30本章內(nèi)容312.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫(kù)與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.1SpringMVC的工作原理32?請(qǐng)思考
SpringMVC框架的核心控制器是?SpringMVC的工作流程1.客戶端請(qǐng)求提交到DispatcherServlet;2.由DispatcherServlet控制器尋找一個(gè)或多個(gè)HandlerMapping,找到處理請(qǐng)求的Controller;3.DispatcherServlet將請(qǐng)求提交到Controller;4.Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView;5.DispatcherServlet尋找一個(gè)或多個(gè)ViewResoler視圖解析器,找到ModelAndView指定的視圖;6.視圖負(fù)責(zé)將結(jié)果顯示到客戶端。33SpringMVC接口SpringMVC所有的請(qǐng)求都經(jīng)過(guò)DispatcherServlet接口來(lái)統(tǒng)一分發(fā)。DispatcherServlet將請(qǐng)求分發(fā)給Controller之前,需要借助于SpringMVC提供的HandlerMapping定位到具體的Controller。HandlerMapping接口負(fù)責(zé)完成客戶請(qǐng)求到Controller映射。Controller接口將處理用戶請(qǐng)求,這和JavaServlet扮演的角色是一致的。從宏觀角度考慮,DispatcherServlet是整個(gè)Web應(yīng)用的控制器;從微觀考慮,Controller是單個(gè)Http請(qǐng)求處理過(guò)程中的控制器,而ModelAndView是Http請(qǐng)求過(guò)程中返回的模型(Model)和視圖(View)。ViewResolver接口(視圖解析器)在Web應(yīng)用中負(fù)責(zé)查找View對(duì)象,從而將相應(yīng)結(jié)果渲染給客戶。34本章內(nèi)容352.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫(kù)與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.2SpringMVC的工作環(huán)境2.2.1SpringMVC所需要的JAR包2.2.2使用Eclipse開(kāi)發(fā)SpringMVC的Web應(yīng)用362.2.1SpringMVC所需要的JAR包對(duì)于SpringMVC框架的初學(xué)者,開(kāi)發(fā)SpringMVC應(yīng)用時(shí),只需將Spring的4個(gè)基礎(chǔ)包、commons-logging-1.2.jar、注解時(shí)需要的JAR包spring-aop-5.1.4.RELEASE.jar和SpringMVC相關(guān)的JAR包(spring-web-5.3.2.jar和spring-webmvc-5.3.2.jar)復(fù)制到Web應(yīng)用的WEB-INF/lib目錄下即可。372.2SpringMVC的工作環(huán)境2.2.1SpringMVC所需要的JAR包2.2.2使用Eclipse開(kāi)發(fā)SpringMVC的Web應(yīng)用382.2.2使用Eclipse開(kāi)發(fā)SpringMVC的Web應(yīng)用【例2-1】SpringMVC入門(mén)程序的實(shí)現(xiàn)過(guò)程。1.創(chuàng)建Web應(yīng)用ch2_1并導(dǎo)入JAR包創(chuàng)建Web應(yīng)用ch2_1,導(dǎo)入如2.2.1節(jié)所示的JAR包。2.在web.xml文件中部署SpringMVC核心控制器DispatcherServlet在開(kāi)發(fā)SpringMVC應(yīng)用時(shí),需要在WEB-INF目錄下,創(chuàng)建web.xml文件,并在該文件中部署DispatcherServlet。39部署SpringMVC核心控制器DispatcherServlet40<!--配置springmvcDispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>3.創(chuàng)建Web應(yīng)用首頁(yè)在ch2_1應(yīng)用的WebContent目錄下,有個(gè)應(yīng)用首頁(yè)index.jsp。41<body>
沒(méi)注冊(cè)的用戶,請(qǐng)<ahref="index/register">注冊(cè)</a>!<br>
已注冊(cè)的用戶,去<ahref="index/login">登錄</a>!</body>4.創(chuàng)建Controller類在ch2_1應(yīng)用的src目錄下,創(chuàng)建包c(diǎn)ontroller,并在該包中創(chuàng)建基于注解的名為“IndexController”的控制器類,該類中有兩個(gè)處理請(qǐng)求方法,分別處理首頁(yè)index.jsp中“注冊(cè)(index/register)”和“登錄(index/login)”超鏈接請(qǐng)求。42@Controller@RequestMapping("/index")publicclassIndexController{ @RequestMapping("/login") publicStringlogin(){ return"login"; } @RequestMapping("/register") publicStringregister(){ return"register"; }}?請(qǐng)思考
與前端請(qǐng)求URL是什么關(guān)系?5.創(chuàng)建SpringMVC的配置文件在SpringMVC中,使用掃描機(jī)制找到應(yīng)用中所有基于注解的控制器類。所以,為了讓控制器類被SpringMVC框架掃描到,需要在配置文件中聲明spring-context,并使用<context:component-scan/>元素指定控制器類的基本包(請(qǐng)確保所有控制器類都在基本包及其子包下)。另外,需要在配置文件中定義SpringMVC的視圖解析器(ViewResolver)。43<!--使用掃描機(jī)制,掃描控制器類-->
<context:component-scanbase-package="controller"/> <!--配置視圖解析器--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!--前綴--><propertyname="prefix"value="/WEB-INF/jsp/"/><!--后綴--><propertyname="suffix"value=".jsp"/></bean>6.應(yīng)用的其他頁(yè)面IndexController控制器的register方法處理成功后,跳轉(zhuǎn)到“/WEB-INF/jsp/register.jsp”視圖;IndexController控制器的login方法處理成功后,跳轉(zhuǎn)到“/WEB-INF/jsp/login.jsp”視圖。因此,應(yīng)用的“/WEB-INF/jsp”目錄下應(yīng)有“register.jsp”和“l(fā)ogin.jsp”頁(yè)面。44?請(qǐng)思考
與視圖解析器是什么關(guān)系?7.發(fā)布并運(yùn)行SpringMVC應(yīng)用在Eclipse中第1次運(yùn)行SpringMVC應(yīng)用時(shí),需要將應(yīng)用發(fā)布到Tomcat。例如,運(yùn)行ch2_1應(yīng)用時(shí),可以右擊應(yīng)用名稱ch2_1,選擇RunAs/RunonServer即完成發(fā)布并運(yùn)行。45本章內(nèi)容462.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫(kù)與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫(xiě)請(qǐng)求處理方法2.3.4Controller接收請(qǐng)求參數(shù)的常見(jiàn)方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute472.3.1Controller注解類型在SpringMVC中,使用org.springframework.stereotype.Controller注解類型聲明某類的實(shí)例是一個(gè)控制器。例如,2.2.2節(jié)中的IndexController控制器類。別忘了在SpringMVC的配置文件中使用<context:component-scan/>元素(見(jiàn)【例2-1】)指定控制器類的基本包,進(jìn)而掃描所有注解的控制器類。482.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫(xiě)請(qǐng)求處理方法2.3.4Controller接收請(qǐng)求參數(shù)的常見(jiàn)方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute492.3.2RequestMapping注解類型在基于注解的控制器類中,可以為每個(gè)請(qǐng)求編寫(xiě)對(duì)應(yīng)的處理方法。如何將請(qǐng)求與處理方法一一對(duì)應(yīng)呢?需要使用org.springframework.web.bind.annotation.RequestMapping注解類型將請(qǐng)求與處理方法一一對(duì)應(yīng)。50方法級(jí)別注解51@ControllerpublicclassIndexController{
@RequestMapping(value="/index/login") publicStringlogin(){ /**login代表邏輯視圖名稱,需要根據(jù)SpringMVC配置中 *internalResourceViewResolver的前綴和后綴找到對(duì)應(yīng)的物理視圖 */ return"login"; }
@RequestMapping(value="/index/register") publicStringregister(){ return"register"; }}
注解的value屬性將請(qǐng)求URI映射到方法,value屬性是RequestMapping注解的默認(rèn)屬性,如果就一個(gè)value屬性,則可省略該屬性??梢允褂萌缦耈RL訪問(wèn)login方法(請(qǐng)求處理方法):http://localhost:xxx/yyyy/index/login類級(jí)別注解52@Controller@RequestMapping("/index")publicclassIndexController{
@RequestMapping("/login") publicStringlogin(){ return"login"; }
@RequestMapping("/register") publicStringregister(){ return"register"; }}為了方便程序維護(hù),建議開(kāi)發(fā)者采用類級(jí)別注解,將相關(guān)處理放在同一個(gè)控制器類中,例如,對(duì)商品的增、刪、改、查處理方法都可以放在一個(gè)名為GoodsOperate的控制類中。2.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫(xiě)請(qǐng)求處理方法2.3.4Controller接收請(qǐng)求參數(shù)的常見(jiàn)方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute53請(qǐng)求處理方法中常出現(xiàn)的參數(shù)類型54@Controller@RequestMapping("/index")publicclassIndexController{ @RequestMapping("/login") publicStringlogin(HttpSessionsession,HttpServletRequestrequest){ session.setAttribute("skey","session范圍的值"); request.setAttribute("rkey","request范圍的值"); return"login"; }}除了ServletAPI參數(shù)類型外,還有輸入輸出流、表單實(shí)體類、注解類型、與Spring框架相關(guān)的類型等等。但特別重要的類型是org.springframework.ui.Model類型,該類型是一個(gè)包含Map的Spring框架類型。每次調(diào)用請(qǐng)求處理方法時(shí),SpringMVC都將創(chuàng)建org.springframework.ui.Model對(duì)象。請(qǐng)求處理方法常見(jiàn)的返回類型最常見(jiàn)的返回類型,就是代表邏輯視圖名稱的String類型。除了String類型外,還有Model、View以及其它任意的Java類型。552.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫(xiě)請(qǐng)求處理方法2.3.4Controller接收請(qǐng)求參數(shù)的常見(jiàn)方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute56通過(guò)實(shí)體bean接收請(qǐng)求參數(shù)通過(guò)一個(gè)實(shí)體bean來(lái)接收請(qǐng)求參數(shù),適用于get和post請(qǐng)求方式。需要注意的是,bean的屬性名稱必須與請(qǐng)求參數(shù)名稱相同。57<inputtype="text"name="uname"/><inputtype="password"name="upass"/><inputtype="password"name="reupass"/>packagepojo;publicclassUserForm{ privateStringuname;//與form表單的請(qǐng)求參數(shù)名稱相同 privateStringupass; privateStringreupass; //省略getter和setter方法}@RequestMapping("/login")publicStringlogin(UserForm
user,HttpSessionsession,Modelmodel){}通過(guò)處理方法的形參接收請(qǐng)求參數(shù)通過(guò)處理方法的形參接收請(qǐng)求參數(shù),也就是直接把表單參數(shù)寫(xiě)在控制器類相應(yīng)方法的形參中,即形參名稱與請(qǐng)求參數(shù)名稱完全相同。該接收參數(shù)方式適用于get和post請(qǐng)求方式。58 @RequestMapping("/register") /** *通過(guò)形參接收請(qǐng)求參數(shù),形參名稱與請(qǐng)求參數(shù)名稱完全相同 */ publicStringregister(Stringuname,Stringupass,Modelmodel){ if("zhangsan".equals(uname) &&"123456".equals(upass)){ return"login";//注冊(cè)成功,跳轉(zhuǎn)到login.jsp }else{ //在register.jsp頁(yè)面上可以使用EL表達(dá)式取出model的uname值 model.addAttribute("uname",uname); return"register";//返回register.jsp } }通過(guò)@RequestParam接收請(qǐng)求參數(shù)通過(guò)@RequestParam接收請(qǐng)求參數(shù),適用于get和post請(qǐng)求方式。59publicStringregister(@RequestParamStringuname,@RequestParamStringupass,Modelmodel){ if("zhangsan".equals(uname) &&"123456".equals(upass)){ return"login";//注冊(cè)成功,跳轉(zhuǎn)到login.jsp }else{ //在register.jsp頁(yè)面上可以使用EL表達(dá)式取出model的uname值 model.addAttribute("uname",uname); return"register";//返回register.jsp } }?請(qǐng)思考
通過(guò)@RequestParam接收請(qǐng)求參數(shù)與“通過(guò)處理方法的形參接收請(qǐng)求參數(shù)”的區(qū)別是?通過(guò)@ModelAttribute接收請(qǐng)求參數(shù)@ModelAttribute注解放在處理方法的形參上時(shí),用于將多個(gè)請(qǐng)求參數(shù)封裝到一個(gè)實(shí)體對(duì)象中,從而簡(jiǎn)化數(shù)據(jù)綁定流程,而且自動(dòng)暴露為模型數(shù)據(jù)用于視圖頁(yè)面展示時(shí)使用。而“通過(guò)實(shí)體bean接收請(qǐng)求參數(shù)”只是將多個(gè)請(qǐng)求參數(shù)封裝到一個(gè)實(shí)體對(duì)象,并不能暴露為模型數(shù)據(jù)(需要使用model.addAttribute語(yǔ)句才能暴露為模型數(shù)據(jù),數(shù)據(jù)綁定與模型數(shù)據(jù)展示,可參考第2.4節(jié)的內(nèi)容)。602.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫(xiě)請(qǐng)求處理方法2.3.4Controller接收請(qǐng)求參數(shù)的常見(jiàn)方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute612.3.5重定向與轉(zhuǎn)發(fā)在SpringMVC框架中,控制器類中處理方法的return語(yǔ)句默認(rèn)就是轉(zhuǎn)發(fā)實(shí)現(xiàn),只不過(guò)實(shí)現(xiàn)的是轉(zhuǎn)發(fā)到視圖。在SpringMVC框架中,不管重定向或轉(zhuǎn)發(fā),都需要符合視圖解析器的配置,如果直接重定向到一個(gè)不需要DispatcherServlet的資源,如:return"redirect:/html/my.html";62//轉(zhuǎn)發(fā)到一個(gè)請(qǐng)求方法(同一個(gè)控制器類里,可省略/index/)return"forward:/index/isLogin";//重定向到一個(gè)請(qǐng)求方法return"redirect:/index/isRegister";//轉(zhuǎn)發(fā)到一個(gè)視圖return"register";<mvc:annotation-driven/><mvc:resourceslocation="/html/"mapping="/html/**"></mvc:resources>2.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫(xiě)請(qǐng)求處理方法2.3.4Controller接收請(qǐng)求參數(shù)的常見(jiàn)方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute632.3.6應(yīng)用@Autowired進(jìn)行依賴注入SpringMVC框架本身就是一個(gè)非常優(yōu)秀的MVC框架,它具有一個(gè)依賴注入的優(yōu)點(diǎn)??梢酝ㄟ^(guò)org.springframework.beans.factory.annotation.Autowired注解類型將依賴注入到一個(gè)屬性(成員變量)或方法,如:在SpringMVC中,為了能被作為依賴注入,服務(wù)層的類必須使用org.springframework.stereotype.Service注解類型注明為@Service(一個(gè)服務(wù))。另外,還需要在配置文件中使用<context:component-scanbase-package="基本包"/>元素來(lái)掃描依賴基本包。64@AutowiredpublicUserServiceuserService;2.3基于注解的控制器2.3.1Controller注解類型2.3.2RequestMapping注解類型2.3.3編寫(xiě)請(qǐng)求處理方法2.3.4Controller接收請(qǐng)求參數(shù)的常見(jiàn)方式2.3.5重定向與轉(zhuǎn)發(fā)2.3.6應(yīng)用@Autowired進(jìn)行依賴注入2.3.7@ModelAttribute65綁定請(qǐng)求參數(shù)到實(shí)體對(duì)象(表單的命令對(duì)象)66@RequestMapping("/register")publicStringregister(@ModelAttribute("user")UserFormuser){ if("zhangsan".equals(user.getUname()) &&"123456".equals(user.getUpass())){ return"login"; }else{ return"register"; }
}上述代碼中“@ModelAttribute("user")UserFormuser”語(yǔ)句的功能有兩個(gè),一是將請(qǐng)求參數(shù)的輸入封裝到user對(duì)象中;一是創(chuàng)建UserForm實(shí)例,以“user”為鍵值存儲(chǔ)在Model對(duì)象中,與“model.addAttribute("user",user)”語(yǔ)句功能一樣。如果沒(méi)有指定鍵值,即“@ModelAttributeUserFormuser”,那么創(chuàng)建UserForm實(shí)例時(shí),以“userForm”為鍵值存儲(chǔ)在Model對(duì)象中,與“model.addAttribute("userForm",user)”語(yǔ)句功能一樣。注解一個(gè)非請(qǐng)求處理方法在控制器類中,被@ModelAttribute注解的一個(gè)非請(qǐng)求處理方法,將在每次調(diào)用該控制器類的請(qǐng)求處理方法前被調(diào)用。這種特性可以用來(lái)控制登錄權(quán)限,當(dāng)然控制登錄權(quán)限的方法很多,例如攔截器、過(guò)濾器等。67publicclassBaseController{
@ModelAttributepublicvoidisLogin(HttpSessionsession)throwsException{if(session.getAttribute("user")==null){thrownewException("沒(méi)有權(quán)限");}}}@Controller@RequestMapping("/admin")publicclassModelAttributeControllerextends
BaseController{ @RequestMapping("/add") publicStringadd(){} @RequestMapping("/update") publicStringupdate(){} @RequestMapping("/delete") publicStringdelete(){}}SpringBoot采用全注解驅(qū)動(dòng)1.組件注冊(cè):@Configuration、@SpringBootConfiguration@Bean、@Controller、@Service、@Repository、@Component、@Import、@ComponentScan2.條件注解@ConditionalOnXxx3.屬性綁定注解@ConfigurationProperties、@EnableConfigurationProperties683.屬性綁定@ConfigurationProperties@EnableConfigurationProperties將容器中任意組件(Bean)的屬性值和配置文件的配置項(xiàng)的值進(jìn)行綁定1.給容器中注冊(cè)組件(@Componet、@Bean)2.使用@ConfigurationProperties聲明組件和配置文件的哪些配置項(xiàng)進(jìn)行綁定694@Data自動(dòng)生成Getter/Setter@NoArgsConstructor自動(dòng)生成無(wú)參構(gòu)造器@AllArgsConstructor自動(dòng)生成全參構(gòu)造器70本章內(nèi)容712.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫(kù)與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.4表單標(biāo)簽庫(kù)與數(shù)據(jù)綁定2.4.1表單標(biāo)簽庫(kù)2.4.2數(shù)據(jù)綁定72本章內(nèi)容732.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫(kù)與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.5JSON數(shù)據(jù)交2.5.1JSON數(shù)據(jù)結(jié)構(gòu)2.5.2JSON數(shù)據(jù)轉(zhuǎn)換74對(duì)象結(jié)構(gòu)對(duì)象結(jié)構(gòu)以“{”開(kāi)始,以“}”結(jié)束。中間部分由0個(gè)或多個(gè)以英文“,”分隔的key/value對(duì)構(gòu)成,key和value之間以英文“:”分隔。其中,key必須為String類型,value可以是String、Number、Object、Array等數(shù)據(jù)類型。75{ key1:value1, key2:value2, …}數(shù)組結(jié)構(gòu)數(shù)組結(jié)構(gòu)以“[”開(kāi)始,以“]”結(jié)束。中間部分由0個(gè)或多個(gè)以英文“,”分隔的值的列表組成。76[ value1, value2, …]{ "sno":"201802228888", "sname":"陳恒", "hobby":["籃球","足球"], "college":{ "cname":"清華大學(xué)", "city":"北京" }}?請(qǐng)思考:組合情況。2.5JSON數(shù)據(jù)交2.5.1JSON數(shù)據(jù)結(jié)構(gòu)2.5.2JSON數(shù)據(jù)轉(zhuǎn)換772.5.2JSON數(shù)據(jù)轉(zhuǎn)換為實(shí)現(xiàn)瀏覽器與控制器類之間的JSON數(shù)據(jù)交互,SpringMVC提供了MappingJackson2HttpMessageConverter實(shí)現(xiàn)類默認(rèn)處理JSON格式請(qǐng)求響應(yīng)。該實(shí)現(xiàn)類利用Jackson開(kāi)源包讀寫(xiě)JSON數(shù)據(jù),將Java對(duì)象轉(zhuǎn)換為JSON對(duì)象和XML文檔,同時(shí)也可以將JSON對(duì)象和XML文檔轉(zhuǎn)換為Java對(duì)象。jackson-annotations.jar:JSON轉(zhuǎn)換注解包。jackson-core.jar:JSON轉(zhuǎn)換核心包。jackson-databind.jar:JSON轉(zhuǎn)換的數(shù)據(jù)綁定包。78JSON格式轉(zhuǎn)換注解在使用注解開(kāi)發(fā)時(shí),需要用到兩個(gè)重要的JSON格式轉(zhuǎn)換注解,分別是@RequestBody和@ResponseBody。@RequestBody:用于將請(qǐng)求體中的數(shù)據(jù)綁定到方法的形參中,該注解應(yīng)用在方法的形參上。@ResponseBody:用于直接返回JSON對(duì)象,該注解應(yīng)用在方法上。通過(guò)一個(gè)實(shí)例來(lái)演示JSON數(shù)據(jù)交互過(guò)程。在該實(shí)例中,針對(duì)返回實(shí)體對(duì)象、ArrayList集合、Map<String,Object>集合以及List<Map<String,Object>>集合分別處理。791.創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)的JAR包創(chuàng)建Web應(yīng)用ch2_4,除了導(dǎo)入如2.2.1節(jié)所示的JAR包外,還需將JSON相關(guān)的3個(gè)JAR包(jackson-annotations-2.12.0.jar、jackson-databind-2.12.0.jar和jackson-core-2.12.0.jar)復(fù)制到WEB-INF/lib目錄中。802.創(chuàng)建Web和SpringMVC配置文件應(yīng)用ch2_4的Web配置文件web.xml與【例2-3】一樣,為節(jié)省篇幅,不再贅述。在應(yīng)用ch2_4的src目錄下,創(chuàng)建名為config的包,并在該包中創(chuàng)建SpringMVC配置文件springmvc.xml。81<context:component-scanbase-package="controller"/><mvc:annotation-driven/><mvc:resourceslocation="/js/"mapping="/js/**"></mvc:resources>3.創(chuàng)建JSP頁(yè)面,并引入jQuery首先從jQuery官方網(wǎng)站/download/下載jQuery插件:jquery-3.5.1.min.js,將其復(fù)制到Web項(xiàng)目開(kāi)發(fā)目錄的WebContent/js目錄下。然后在JSP頁(yè)面中,通過(guò)<scripttype="text/javascript"src="js/jquery-3.5.1.min.js"></script>代碼將jquery-3.5.1.min.js引入當(dāng)前頁(yè)面中。在應(yīng)用ch2_4的WebContent目錄下創(chuàng)建JSP文件index.jsp,在該頁(yè)面中使用Ajax向控制器異步提交數(shù)據(jù)。824.創(chuàng)建實(shí)體類在應(yīng)用ch2_4的src目錄下,創(chuàng)建名為pojo的包,在該包中創(chuàng)建Person實(shí)體類。83packagepojo;publicclassPerson{ privateStringpname; privateStringpassword; privateIntegerpage; //省略set和get方法}5.創(chuàng)建控制器類在應(yīng)用ch2_4的src目錄下,創(chuàng)建名為controller的包,并在該包中創(chuàng)建TestController控制器類,在處理方法中使用@ResponseBody和@RequestBody注解進(jìn)行JSON數(shù)據(jù)交互。84@RequestMapping("/testJson")@ResponseBodypublicList<Map<String,Object>>testJson(@RequestBodyPersonuser){}6.測(cè)試應(yīng)用右擊應(yīng)用ch2_4,選擇RunAs/RunonServer發(fā)布并運(yùn)行應(yīng)用。85本章內(nèi)容862.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫(kù)與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.6攔截器2.6.1攔截器的定義2.6.2攔截器的配置2.6.3攔截器的執(zhí)行流程872.6.1攔截器的定義在SpringMVC框架中,定義一個(gè)攔截器可以通過(guò)兩種方式:一種是通過(guò)實(shí)現(xiàn)HandlerInterceptor接口或繼承HandlerInterceptor接口的實(shí)現(xiàn)類來(lái)定義;另一種是通過(guò)實(shí)現(xiàn)WebRequestInterceptor接口或繼承WebRequestInterceptor接口的實(shí)現(xiàn)類來(lái)定義。8889publicclassTestInterceptorimplementsHandlerInterceptor{ @Override publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler) throwsException{ } @Override publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler, ModelAndViewmodelAndView)throwsException{ } @Override publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex) throwsException{ }}實(shí)現(xiàn)HandlerInterceptor接口HandlerInterceptor接口中的方法preHandle()方法:該方法在控制器的處理請(qǐng)求方法前執(zhí)行,其返回值表示是否中斷后續(xù)操作。返回true表示繼續(xù)向下執(zhí)行,返回false表示中斷后續(xù)操作。postHandle()方法:該方法在控制器的處理請(qǐng)求方法調(diào)用之后,解析視圖之前執(zhí)行??梢酝ㄟ^(guò)此方法對(duì)請(qǐng)求域中的模型和視圖做進(jìn)一步的修改。afterCompletion()方法:該方法在控制器的處理請(qǐng)求方法執(zhí)行完成后執(zhí)行,即視圖渲染結(jié)束后執(zhí)行??梢酝ㄟ^(guò)此方法實(shí)現(xiàn)一些資源清理、記錄日志信息等工作。902.6攔截器2.6.1攔截器的定義2.6.2攔截器的配置2.6.3攔截器的執(zhí)行流程9192 <!--配置攔截器--> <mvc:interceptors> <!--配置一個(gè)全局?jǐn)r截器,攔截所有請(qǐng)求-->
<beanclass="interceptor.TestInterceptor"/> <mvc:interceptor> <!--配置攔截器作用的路徑--> <mvc:mappingpath="/**"/> <!--配置不需要攔截作用的路徑--> <mvc:exclude-mappingpath=""/> <!--定義在<mvc:interceptor>元素中,表示匹配指定路徑的請(qǐng)求才進(jìn)行攔截-->
<beanclass="interceptor.Interceptor1"/> </mvc:interceptor> <mvc:interceptor> <!--配置攔截器作用的路徑--> <mvc:mappingpath="/gotoTest"/>
<beanclass="interceptor.Interceptor2"/> </mvc:interceptor> </mvc:interceptors>2.6配置攔截器2.6攔截器2.6.1攔截器的定義2.6.2攔截器的配置2.6.3攔截器的執(zhí)行流程932.6.3攔截器的執(zhí)行流程在配置文件中,如果只定義了一個(gè)攔截器,程序首先將執(zhí)行攔截器類中的preHandle()方法,如果該方法返回true,程序?qū)⒗^續(xù)執(zhí)行控制器中處理請(qǐng)求的方法,否則中斷執(zhí)行。如果preHandle()方法返回true,并且控制器中處理請(qǐng)求的方法執(zhí)行后返回視圖前,將執(zhí)行postHandle()方法。返回視圖后,才執(zhí)行afterCompletion()方法。在需要Web應(yīng)用中,通常有多個(gè)攔截器同時(shí)工作,這時(shí)它們的preHandle()方法將按照配置文件中攔截器的配置順序執(zhí)行,而它們的postHandle()方法和afterCompletion()方法則按照配置順序的反序執(zhí)行。94【例2-5】多個(gè)攔截器的執(zhí)行過(guò)程1.創(chuàng)建Web應(yīng)用并導(dǎo)入相關(guān)的JAR包創(chuàng)建Web應(yīng)用ch2_5,將如2.2.1節(jié)所示的JAR包復(fù)制到WEB-INF/lib目錄中。2.創(chuàng)建Web配置文件web.xml在WEB-INF目錄下,創(chuàng)建web.xml文件,該文件中的配置信息與【例2-1】相同,為節(jié)省篇幅,不再贅述。953.創(chuàng)建控制器類在src目錄下,創(chuàng)建名為controller的包,并在該包中創(chuàng)建控制器類InterceptorController。96@ControllerpublicclassInterceptorController{ @RequestMapping("/gotoTest") publicStringgotoTest(){ System.out.println("正在測(cè)試攔截器,執(zhí)行控制器的處理請(qǐng)求方法中"); return"test"; }}4.創(chuàng)建攔截器類在src目錄下,創(chuàng)建一個(gè)名為interceptor的包,并在該包中創(chuàng)建攔截器類TestInterceptor、Interceptor1和Interceptor2。TestInterceptor的代碼與2.6.1節(jié)的示例代碼相同,為節(jié)省篇幅,不再贅述。975.創(chuàng)建配置文件springmvc.xml在src目錄下,創(chuàng)建名為config的包,并在該包中創(chuàng)建配置文件springmvc.xml。在配置文件配置一個(gè)全局?jǐn)r截器和兩個(gè)局部攔截器。98?請(qǐng)思考:全局?jǐn)r截器與局部攔截器的區(qū)別是什么?6.創(chuàng)建視圖JSP文件99在WEB-INF目錄下,創(chuàng)建一個(gè)jsp文件夾,并在該文件夾中創(chuàng)建一個(gè)JSP文件test.jsp。<body>
視圖 <%System.out.println("視圖渲染結(jié)束。");%></body>7.測(cè)試攔截器首先,將應(yīng)用ch2_5發(fā)布到Tomcat服務(wù)器,并啟動(dòng)Tomcat服務(wù)器。然后,通過(guò)地址http://localhost:8080/ch2_5/gotoTest測(cè)試攔截器。100?請(qǐng)思考:攔截器的執(zhí)行順序。本章內(nèi)容1012.1SpringMVC的工作原理2.2SpringMVC的工作環(huán)境2.3基于注解的控制器2.4表單標(biāo)簽庫(kù)與數(shù)據(jù)綁定2.5JSON數(shù)據(jù)交互2.6攔截器2.7文件上傳2.7文件上傳文件上傳是一個(gè)SpringMVC應(yīng)用中經(jīng)常使用的功能,SpringMVC通過(guò)配置一個(gè)MultipartResolver來(lái)上傳文件。在SpringMVC的控制器中,可以通過(guò)MultipartFile來(lái)接收單個(gè)文件上傳,通過(guò)List<MultipartFile>來(lái)接收多個(gè)文件上傳。由于SpringMVC框架的文件上傳是基于commons-fileupload組件的文件上傳。因此,需要將commons-fileupload組件相關(guān)的jar(commons-fileupload.jar和commons-io.jar)拷貝到SpringMVC應(yīng)用的WEB-INF/lib目錄下?!纠?-6】上傳多個(gè)文件。1021
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年骨科關(guān)節(jié)用藥合作協(xié)議書(shū)
- 2022-2023學(xué)年廣西欽州市四年級(jí)(上)期末數(shù)學(xué)試卷
- 2025年逆變式電焊機(jī)合作協(xié)議書(shū)
- 2025年九年級(jí)班主任心得樣本(2篇)
- 2025年買(mǎi)賣(mài)協(xié)議參考范文(2篇)
- 2025年五人股東合作的協(xié)議(2篇)
- 2025年代課教師勞動(dòng)合同標(biāo)準(zhǔn)版本(4篇)
- 2025年代交社會(huì)保險(xiǎn)協(xié)議(三篇)
- 2025年二年級(jí)美術(shù)教學(xué)工作總結(jié)(5篇)
- 2025年買(mǎi)賣(mài)房屋定金協(xié)議簡(jiǎn)單版(三篇)
- 吉林省吉林市普通中學(xué)2024-2025學(xué)年高三上學(xué)期二模試題 生物 含答案
- 高考日語(yǔ)閱讀理解練習(xí)2篇-高考日語(yǔ)復(fù)習(xí)
- 2025年湖南省通信產(chǎn)業(yè)服務(wù)限公司春季校園招聘76人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《電影之創(chuàng)戰(zhàn)紀(jì)》課件
- 印刷基礎(chǔ)知識(shí)培訓(xùn)資料
- NB/T 11536-2024煤礦帶壓開(kāi)采底板井下注漿加固改造技術(shù)規(guī)范
- 2024-2025學(xué)年人教版五年級(jí)(上)英語(yǔ)寒假作業(yè)(一)
- 【課件】九年級(jí)化學(xué)下冊(cè)(人教版2024)-【新教材解讀】義務(wù)教育教材內(nèi)容解讀課件
- 開(kāi)題報(bào)告-鑄牢中華民族共同體意識(shí)的學(xué)校教育研究
- GA/T 761-2024停車庫(kù)(場(chǎng))安全管理系統(tǒng)技術(shù)要求
- 2025屆貴州省六盤(pán)水市第二中學(xué)高三適應(yīng)性調(diào)研考試數(shù)學(xué)試題含解析
評(píng)論
0/150
提交評(píng)論