javascript
Spring和SpringMVC总结篇
作者:肥宅兜
鏈接:https://www.cnblogs.com/doudouxiaoye/p/5693399.html
1.為什么使用Spring ?
通過Spring提供的IoC容器,可以將對象之間的依賴關系交由Spring進行控制,避免硬編碼所造成的過度程序耦合。
通過Spring提供的AOP功能,方便進行面向切面的編程,如性能監測、事務管理、日志記錄等。
如對JDBC,JavaMail,遠程調用等提供了簡便封裝
2. 什么是IOC,為什使用IOC ?
IOC全稱Iversion of Controller,控制反轉。
這概念是說你不用創建對象,而只需要描述它如何被創建。你不在代碼里直接組裝你的組件和服務,但是要在配置文件里描述哪些組件需要哪些服務,之后一個容器(IOC容器)負責把他們組裝起來。
它能指導我們如何設計出松耦合、更優良的程序。
3. 什么是AOP,為什么使用AOP ?
AOP全稱:Aspect-Oriented Programming,面向切面編程。
AOP,面向切面編程,就是把可重用的功能提取出來,然后將這些通用功能在合適的時候織入到應用程序中,比如事務管理、權限控制、日志記錄、性能統計等。
AOP并沒有幫助我們解決任何新的問題,它只是提供了一種更好的辦法,能夠用更少的工作量來解決現有的一些問題,使得系統更加健壯,可維護性更好。
4. 什么是Spring的事務管理?
事務就是對一系列的數據庫操作(比如插入多條數據)進行統一的提交或回滾操作,如果插入成功,那么一起成功,如果中間有一條出現異常,那么回滾之前的所有操作。這樣可以防止出現臟數據,防止數據庫數據出現問題。
開發中為了避免這種情況一般都會進行事務管理。
Spring的聲明式事務通常是指在配置文件中對事務進行配置聲明,其中包括了很多聲明屬性,它是通過Spring Proxy幫你做代理,自己不用額外的寫代碼,只要在Spring配置文件中聲明即可;通常用在數據庫的操作里面;
編程式事務就是指通過硬編碼的方式做事務處理,這種處理方式需要寫代碼,事務中的邏輯可以自己定制;可以是數據庫的東東,也可以是其他的操作。
Spring中也有自己的事務管理機制,一般是使用TransactionMananger進行管理,可以通過Spring的注入來完成此功能。
5. Spring框架支持以下五種bean的作用域:
- singleton : 默認值,bean在每個Spring ioc 容器中只有一個實例。
- prototype:一個bean的定義可以有多個實例。
- request:每次http請求都會創建一個bean,該作用域僅在基于web的Spring ApplicationContext情形下有效。
- session:在一個HTTP Session中,一個bean定義對應一個實例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
- global-session:在一個全局的HTTP Session中,一個bean定義對應一個實例。該作用域僅在基于web的Spring ApplicationContext情形下有效。
6. 什么是Spring的MVC框架?
Spring配備構建Web應用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring的MVC框架用控制反轉把業務對象和控制邏輯清晰地隔離。它也允許以聲明的方式把請求參數和業務對象綁定。
Spring mvc是一個基于mvc的web框架。Spring mvc是Spring框架的一個模塊,Spring mvc和Spring無需通過中間整合層進行整合。
7. 如何啟用注解:
在spring的xml配置中添加<mvc:annotation-drivern>即可
<beans?xmlns="http://www.springframework.org/schema/beans"??
?xmlns:context="http://www.springframework.org/schema/context"??
?xmlns:p="http://www.springframework.org/schema/p"??
?xmlns:mvc="http://www.springframework.org/schema/mvc"??
?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
?xsi:schemaLocation="http://www.springframework.org/schema/beans??
??????http://www.springframework.org/schema/beans/spring-beans-3.0.xsd??
??????http://www.springframework.org/schema/context??
??????http://www.springframework.org/schema/context/spring-context.xsd??
??????http://www.springframework.org/schema/mvc??
??????http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
??????<!--?注解掃描?-->
??????<context:component-scan?base-package="club.sscai.annotation"/>
??????<!--使用mvc注解聲明??-->
??????<mvc:annotation-driven/>
??????<!--?不使用mvc注解聲明則要注入以下兩個bean
??????<bean?class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
??????<bean?class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
???????-->
??????<bean?id="viewResolver"?class="org.springframework.web.servlet.view.InternalResourceViewResolver">
????????<property?name="prefix"?value="/"></property>
????????<property?name="suffix"?value=".jsp"></property>
????</bean>
</beans>
8. Spring MVC的請求流程:
- 第一步:發起請求到前端控制器(DispatcherServlet)
- 第二步:前端控制器請求HandlerMapping查找Handler可以根據xml配置、注解進行查找
- 第三步:處理器映射器HandlerMapping向前端控制器返回Handler
- 第四步:前端控制器調用處理器適配器去執行Handler
- 第五步:處理器適配器去執行Handler
- 第六步:Handler執行完成給適配器返回ModelAndView
- 第七步:處理器適配器向前端控制器返回ModelAndView。ModelAndView是springmvc框架的一個底層對象,包括 Model和view
- 第八步:前端控制器請求視圖解析器去進行視圖解析,根據邏輯視圖名解析成真正的視圖(jsp)
- 第九步:視圖解析器向前端控制器返回View
- 第十步:前端控制器進行視圖渲染。視圖渲染將模型數據(在ModelAndView對象中)填充到request域
- 第十一步:前端控制器向用戶響應結果
9. web.xml的配置
10. 注解的處理器映射器和適配器
spring3.1之前默認加載映射器是org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping,3.1之后要使用:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
在springmvc.xml中配置RequestMappingHandlerMapping:
<bean?class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
使用RequestMappingHandlerMapping需要在Handler中使用@controller
標識此類是一個控制器(Handler),使用@requestMapping指定Handler方法所對應的url。
spring3.1之前默認加載映射器是
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter,3.1之后要使用:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
<bean?class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"?/>
RequestMappingHandlerAdapter,不要求Handler實現任何接口,
它需要和RequestMappingHandlerMapping注解映射器配對使用,主要解析Handler方法中的形參。
11. spring 與 mybatis整合過程
- 第一步:整合dao層
mybatis和spring整合,通過spring管理mapper接口。
使用mapper的掃描器自動掃描mapper接口在spring中進行注冊。 - 第二步:整合service層
通過spring管理 service接口。
使用配置方式將service接口配置在spring配置文件中。
實現事務控制。 - 第三步:整合springmvc 由于springmvc是spring的模塊,不需要整合。 主要配置有:
- mybatis配置文件sqlMapConfig.xml配置別名自動掃描(實體類)
- mapper掃描器(接口,數據庫訪問接口)
- 數據庫連接池配置
- 聲明式事務配置
- 啟用注解掃描:
- 配置注解映射器和適配器:
- 視圖解析器:
- 配置控制類: DispatcherServlet前端控制器
- 配置spring配置文件加載類:ClassLoadListener
12. 前端控制器從上邊的文件中加載處理映射器、適配器、視圖解析器等組件,如果不在springmvc.xml中配置,使用默認加載的 DispatcherSerlvet.properties。
13. 視圖解析器配置前綴和后綴:
14. sqlMapConfig.xml,mybatis自己的配置文件。
15. 配置數據源:
16. 事務控制(applicationContext-transaction.xml),在applicationContext-transaction.xml中使用spring聲明式事務控制方法。
17. 加載spring配置
18. 靜態資源訪問不被攔截:
<resources?mapping="/resources/**"?location="/resources/"?/><resources?mapping="/images/**"?location="/images/"?/>
<resources?mapping="/js/**"?location="/js/"?/>
19. @RequestMapping的作用
20. controller方法的返回值
需要方法結束時,定義ModelAndView,將model和view分別進行設置。
如果controller方法返回string,
???2).?redirect重定向:返回字符串格式為:"redirect:queryItem.action"
???3).?forward頁面轉發:返回字符串格式為:“forward:queryItem.action”
在controller方法形參上可以定義request和response,使用request或response指定響應結果:
???2).?也可以通過response頁面重定向:response.sendRedirect("url")
???3).?也可以通過response指定響應結果,例如響應json數據如下:
???????response.setCharacterEncoding("utf-8");
???????response.setContentType("application/json;charset=utf-8");
???????response.getWriter().write("json串");
21. 參數綁定:
直接在controller方法形參上定義下邊類型的對象,就可以使用這些對象。在參數綁定過程中,如果遇到下邊類型直接進行綁定。
1). HttpServletRequest:通過request對象獲取請求信息
2). HttpServletResponse:通過response處理響應信息
3). HttpSession:通過session對象得到session中存放的對象
4). Model/ModelMap:model是一個接口,modelMap是一個接口實現 。作用:將model數據填充到request域。
通過@RequestParam對簡單類型的參數進行綁定。
如果不使用@RequestParam,要求request傳入參數名稱和controller方法的形參名稱一致,方可綁定成功。
如果使用@RequestParam,不用限制request傳入參數名稱和controller方法的形參名稱一致。
通過required屬性指定參數是否必須要傳入,如果設置為true,沒有傳入參數,會報錯。
頁面中input的name和controller的pojo形參中的屬性名稱一致,將頁面中數據綁定到pojo。(usename,age;不需要user.username,user.age)
對于controller形參中pojo對象,如果屬性中有日期類型,需要自定義參數綁定。將請求日期數據串轉成 日期類型,要轉換的日期類型和pojo中日期屬性的類型保持一致。
22. Spring MVC 和 Struts2 對比
之間也是獨立的,但其所有Action變量是共享的,這不會影響程序運行,卻給我們編碼 讀程序時帶來麻煩,每次來了請求就創建一個Action,一個Action對象對應一個request上下文。
23. 亂碼處理
在web.xml添加post亂碼filter:CharacterEncodingFilter
???<Connector?URIEncoding="utf-8"?connectionTimeout="20000"?port="8080"?protocol="HTTP/1.1"?redirectPort="8443"/>
???2).?對參數進行重新編碼:
???String?userName?=?new?String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
???ISO8859-1是tomcat默認編碼,需要將tomcat編碼后的內容按utf-8編碼
24. 集合類型綁定
controller方法參數使用:(Integer[] itemId)
頁面統一使用:itemId 作為name
pojo屬性名為:itemsList
頁面:itemsList[index].屬性名
pojo屬性名為:Map itemInfo = new HashMap();
頁面:<input type="text" name="itemInfo['name']"/>
25. spring 校驗
校驗思路:頁面提交請求的參數,請求到controller方法中,使用validation進行校驗。如果校驗出錯,將錯誤信息展示到頁面。
26. 數據回顯
27. 異常處理
springmvc提供全局異常處理器(一個系統只有一個異常處理器)進行統一異常處理。
系統遇到異常,在程序中手動拋出,dao拋給service、service給controller、controller拋給前端控制器,前端控制器調用全局異常處理器。
28. 上傳圖片
29. Json處理
詳見:http://www.cnblogs.com/Jtianlin/p/5224885.html
30. 攔截器:
a. preHandle :進入 Handler方法之前執行,用于身份認證、身份授權,比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行
b. postHandle:進入Handler方法之后,返回modelAndView之前執行,應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這里傳到視圖,也可以在這里統一指定視圖
c. afterCompletion:執行Handler完成執行此方法,應用場景:統一異常處理,統一日志處理
a. 針對HandlerMapping配置(不推薦):springmvc攔截器針對HandlerMapping進行攔截設置,如果在某個HandlerMapping中配置攔截,經過該 HandlerMapping映射成功的handler
最終使用該 攔截器。 (一般不推薦使用)
b. 類似全局的攔截器:springmvc配置類似全局的攔截器,springmvc框架將配置的類似全局的攔截器注入到每個HandlerMapping中
我創建了一個用來記錄自己學習之路的公眾號,感興趣的小伙伴可以關注一下微信公眾號:niceyoo
總結
以上是生活随笔為你收集整理的Spring和SpringMVC总结篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 爬虫知识点 - 淘宝商品检
- 下一篇: jQuery基础,javascript