Spring 和Spring MVC 問題彙總

1. 列表內容爲什麼使用Spring?

  • 方便解耦,簡化開發;通過Spring提供的Ioc容器,可以將對象之間的依賴關係交由Spring進
    行控制,避免硬編碼所造成的過度程序解耦。
  • AOP的支持;通過Spring提供的AOP功能。方便進行面向切面的編程,如性能監測、事物管理、日誌記錄等。
  • 聲明式事務的支持
  • 方便集成各種優秀的框架、
  • 降低Java EE API的使用難度;如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 框架支持以下5中bean的作用域?

  • singleton:默認值,bean在每個Spring IOC容器中只有一個實例
  • prototype:一個bean的定義可以有多個實例。
  • request:每次http請求都會創建一個bean,該作用域僅在基於web的Spring ApplicationContext情型下有效。
  • session:在一個HTTP Session中,一個bean定義對應一個實例,該作用域僅在基於web的Spring ApplicationContext情型下有效。
  • global-session: 在一個全局的HTTP Sesssion中,一個bean定義對應一個實例,該作用域僅在基於web的Spring ApplicationContext情型下有效。

6. 什麼是SpringMVC框架

  • Spring 配備構建WEB 應用的全功能MVC框架,Spring可以很便捷地和其他MVC框架集成,如Struts,Spring的MVC框架用控制反轉把業務對象和控制邏輯清晰的隔離,也允許以聲明的方式把請求參數和業務對象綁定。

7. 如何啓用註解

<context:annotation-config/>
    如果使用<context:component-scan base-package="com.tgb.web.controller.annotation"> </context:component-scan>
      則上面內容可以省略 

8. Spring MVC的請求流程

  • 第一步:發起請求到前端控制器(DispatcherServlet)
  • 第二步:前端控制器請求HanderMapping查找Handler可以根據xml配置、註解進行查找
  • 第三步:處理器映射HandlerMapping向前端控制器返回Handler
  • 第四步:前端控制器調用處理適配器去執行Handler
  • 第五步:處理器執行Handler
  • 第六步:Handler執行完成後,給適配器返回一個ModuleAndView
  • 第七步:處理器適配器向前端控制器返回ModelAndView
  • 第八步:前端控制器請求視圖解析器去經行視圖解析,根據邏輯視圖名解析成真正的視圖
  • 第九步:視圖解析器向前端控制器返回view
  • 第十步:前端控制器進行視圖的渲染,視圖渲染將模型數據填充到request中
    -第十一步:前端控制器向用戶響應結果

9.web.xml的配置

這裏寫圖片描述


10. 註解的處理器和適配器

一般使用mvc:annotation-driven 開啓註解


11. spring 和mybatis的整合過程

  • 第一步:整合DAO層,mybatis和spring整合,通過spring管理mapper接口,使用mapper的掃描器自動掃描註冊mapper接口在spring中進行註冊
  • 整合service層,通過spring管理service接口,使用配置方式將service接口配置在spring的配置文件中,實現事務的控制
  • 整合springMVC 由於Spring MVC是spring的模塊,因此可直接使用不需要整合

12.視圖解析器配置前綴和後綴

這裏寫圖片描述


13. mybatis的配置文件

這裏寫圖片描述


14. 配置數據源

這裏寫圖片描述


15. 事務控制

這裏寫圖片描述


16. 靜態資源的訪問

 <resources mapping="/resources/**" location="/resources/" />
 <resources mapping="/images/**" location="/images/" />
 <resources mapping="/js/**" location="/js/" />

17. @RequestMapping的作用

  • url映射
  • 窄化請求映射
  • 限制http的請求方法

18.Controller方法的返回值

  • 返回MoudlerAndView,需要方法的結束時,組裝一個MoudelAndView,將model和view分別經行設置
  • 返回String
    1. 表示返回的邏輯視圖名,真正視圖爲前綴+邏輯視圖名+後綴
    2. redirect重定向:返回字符串格式爲:”redirect:xxxxxxx“;
    3. forward頁面轉發:返回字符串格式爲:”forword:xxxxxxxx”;

  • 返回void
    1. 使用request來實現頁面的跳轉,如:request.getRequestDispatcher(“頁面路徑”).forward(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串"); 
    

19. 參數綁定

  • 默認支持類型,直接在controller方法形參上定義下邊類型的對象,就可以使用這些對象。在參數綁定過程中如果遇到下邊類型可直接綁定。

    1. HttpServletRequest: 通過request對象獲取請求信息
    2. HttpServletResponse: 通過response處理響應信息
    3. HttpSession: 通過session對象得到session中存放的對象
    4. Model/ModuleMap: model是一個接口,modelMap是一個接口的實現,作用:將model中的數據填充到request域中
  • 簡單類型
    通過@RequestParam對簡單類型的參數進行綁定,如果不使用@RequestParam,要求request傳入參數名稱和controller方法的形參名稱一致,方可綁定成功;通過required屬性指定參數是否必須傳入,如果設置爲true,沒有參數將報錯

  • POJO的綁定
    頁面中表單中的name屬性值必須與對應POJO形參中的屬性名稱一致,將頁面中數據綁定到POJO

  • 自定義參數綁定實現日期類型綁定
    對於controller形參中pojo對象,如果屬性中有日期類型,需要自定義參數綁定,將請求日期數據串轉換成日期類型,要轉換的日期類型和pojo中日期類型保持一致


20. SpringMVC 與Struts2的對比

  • Struts是類級別的攔截器,一個類對應一個request上下文,SpringMVC 是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,所以說從架構本身上SpringMVC就容易實現restful url
  • 由上邊的原因,SpringMVC的方法之間基本上是獨立的,獨享request response 數據,請求數據通過參數獲取,處理結果通過ModelMap交回給框架,方法之間不共享變量,而Struts2雖然方法之間也是獨立的,但其所有的Action的變量是共享的,這個不會影響程序運行,卻給我們編碼,讀程序時帶來麻煩,每次接受一個請求就創建一個新的Action,一個Action對應一個request上下文
  • 由於Struts2需要對每個request進行封裝,把request,session等servlet生命週期的變量封裝成一個一個map,供給每個Action使用,並保證線程安全,所以在原則上,是比較消耗內存的。
  • SpringMVC 集成了AJAX,使用非常方便,只需要一個註解@ResponseBoay就可以實現,然後直接返回響應文本即可,而Struts2在Action中處理時,一般必須安裝插件或者自己寫代碼集成進去,使用起來也相對不方便
  • springmvc面向方法開發的,更接近service接口的開發方式,struts2面向類開發
  • springmvc 可以單列開發,struts2只能時多列開發

21. 亂碼處理

  • post亂碼,在web.xml添加post亂碼的filter:CharacterEncodingFilter
  • 對於get親求中文參數出現亂碼解決方法有兩個
    1. 修改tomcat配置文件添加編碼與工程編碼一致,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
  1. 對參數進行重新編碼:
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默認編碼,需要將tomcat編碼後的內容按utf-8編碼

22. 集合類型綁定

  • 數組綁定:controller方法參數使用:(Integer[] itrmId)頁面統一使用:itemId作爲name
  • list綁定:pojo屬性爲: itemList,頁面:itemList[index].屬性名
  • map綁定:pojo屬性名爲:Map

24. spring校驗

  • 項目中,通知使用較多時前端的校驗,比如頁面中js校驗,對於安全要求較高點建議在服務端進行校驗
  • springmvc 使用hiberbate的校驗框架validation(和bibernate沒有任何關係)
  • 校驗思路:頁面提交請求的參數,請求到controller方法,使用validation進行校驗,如果檢驗出錯,將錯誤信息展示到頁面

25. 數據回顯

  • @ModelAttribute還可以將方法的返回值傳到頁面:在方法上加註解@ModuleAttribute
  • 最簡單方法使用model,可以不使用@ModelAttribute:model.addAttribute(“id”,id)
  • springmvc 默認對pojo數據進行回顯,pojo數據傳入controller方法後,springmvc自動將pojo數據放到request域中,key等於pojo類型(首字母小寫)
  • public String testParam(PrintWriter out,@RequestParam(“username”) String name)

26. 異常處理

  • springmvc提供全局處理器(一個系統只有一個異常處理器)進行異常處理
  • 系統出現異常,在程序中手動拋出,dao拋出geiservice、service給controller、controller拋給前端控制器,前端控制器調用全局異常處理器

這裏寫圖片描述


27. 上傳圖片

  • 在頁面from提交enctype = ”multipart/form-data“的數據時,需要springmc對multipart類型的數據進行解析
  • 在springmvc.xml中配置multipart類型的解析器
    這裏寫圖片描述

  • 方法中使用:MultipartFile attach (單個文件上傳)或者MultipartFile[] attachs(多個文件上傳)


28. JSON的處理

  • 加載json轉換的jar包,springmvc 中使用jackson的包進行json轉換(@RequestBody和@ResponseBody使用下面的包經行json轉換)
  • 配置json轉換器,在註解適配器RequestMappingHandlerAdapter中加入messageConverts,如果使用了則會自動加入
  • ajax
    這裏寫圖片描述
  • Controller(ResponseBody、RequestBody)

這裏寫圖片描述

  • 注意ajax中contentType如果不設置爲json類型,則傳的參數爲key/value類型,上面設置後。傳的是json類型

29 攔截器

  • 定義攔截器,實現HandlerInterceptor接口,接口中提供的方法

    1. preHandle:進入Handler方法之前執行,用於身份驗證、身份授權
    2. postHandle:進入Handler方法之後,返回modelAndView之前執行,應用場景從modelAndView出發;將公用的模型數據(比如菜單導航)在這裏傳到視圖,也可以在這裏統一視圖
    3. afterCompletion:執行Handler完成執行此方法,應用場景:統一異常處理,統一日誌處理
  • 攔截器配置

    1. 針對HandlerMapping配置(不推薦):springmvc攔截器針對HandlerMapping經行攔截設置,如果在某個HandlerMapper中配置攔截,經過該HandlerMapping映射成功的handler最終使用該攔截器
    2. 類似全局攔截器:springmvc配置類似全局的攔截器,springmvc框架將配置的類似的全局的攔截器注入到HadlerMapping中
      這裏寫圖片描述

30. spring 中自動裝配的方式

  • NO:即不開啓自動配置
  • byName:通過屬性的名字的方式查找JavaBean依賴的對象併爲其注入,比如說類Conmputer有個屬性printer,指定其autowire屬性爲byName後,Spring Ioc容器會在配置文件中查找id/name屬性爲printrer的bean,然後使用Seter方法爲其注入
  • byType:通過屬性類型查找JavaBean依賴的對象併爲其注入,比如類Computer有個屬性priter,類型爲Printer,那麼指定其autowire屬性爲byType後,Spring IOC容器會查找Class屬性爲Printer的bean,使用Seter方法爲其注入
  • constructor: 與通過byType一樣,也是通過類型查找依賴對象,與byType的區別在於它不是使用Seter方法注入,而是使用構造方法注入
  • autodetect: byType和constructor之間自動選擇注入方式
  • default:由上級標籤的 default-autowire屬性確定

31. Spring 中AOP的應用場景、AOP的原理和好處

  • AOP–Aspect Oriented Programming面向切面編程
  • 主要在以下場景中使用:Authentication權限、Caching緩存、Context passing 內容傳遞,Error handling 錯誤處理Lazy loading 懶加載、Debugging調試、logging tracting、profiling and monitoring 記錄跟蹤優化 校準 、性能優化、Resoure pooling 資源池、Synchronization 同步、Transaction 事物
  • 原理:AOP 是面向切面編程,是通過動態代理的方式爲程序添加統一功能,集中解決一些公共的問題

  • 優點: 各個步驟之間的良好隔離性耦合性大大降低;源代碼無關性,再擴展功能的同不對源碼進行修改操作


32. Spring 中的IOC的作用於原理?對象的創建過程

IOC—-Inversion of Control 控制反轉,當某個角色需要另外一個角色協助的時候,在傳統的程序設計過程中,通常由調試者來創建被調用者的實例對象。但在spring中創建的對象不再是由調用者來完成,因此稱爲控制反轉。創建被調用者的工作由spring 來完成,然後注入,調用者直接使用


33. Spring 常見的創建對象的註解

  • @Component @Controller @Service @Repository

34. Spring 中使用的設計模式

  • 工廠模式 代理模式、單例模式、適配器、包裝器、觀察者、策略 、模板方法

35. Spring 的優點

  • 降低了組件之間的耦合性,實現了軟件各層之間的解耦
  • 可以使用衆多服務,事物管理、消息服務等
  • 容器提供單例模式支持
  • 容器提供了AOP技術,利用它很容易實現如權限攔截運行監控等功能
  • 容器提供了衆多的輔助類,能加快應用的開發
  • spring對於主流的應用框架提供了集成支持,如JPA、 redis等
  • spring 輸入低侵入式設計,代碼的污染極低
  • 獨立於各種應用服務器
  • spring的DI機制降低了業務對象替換的複雜性
  • Spring的高度開放性,並不強制應用完全依賴於spring,開發者可以自由選擇spring的部分或全部

36. Spring管理事務有幾種方式?

  • 編程式事務
  • 聲明式事務(基於xml的聲明式事務、基於註解的聲明式事務)

37. spring 中核心類有哪些 各有什麼作用

  • BeanFactory: 產生一個新的實例,可以實現單例模式
  • BeanWrapper: 提供統一的get和set方法
  • ApplicationContext:提供框架的實現,包括BeanFactory的所用功能

38. Bean 的調用方式?

有三種方式可以得到Bean並進行調用:
1、使用BeanWrapper
HelloWorld hw=new HelloWorld(); 
BeanWrapper bw=new BeanWrapperImpl(hw); 
bw.setPropertyvalue(”msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(”msg”));
2、使用BeanFactory
InputStream is=new FileInputStream(”config.xml”);
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);
system.out.println(hw.getMsg()); 
3、使用ApplicationConttext
ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);
HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());

39. spring有兩種代理方式

  • 若目標對象實現了若干接口,spring使用JDK的java.lang.reflect.Proxy類代理。
    優點:因爲有接口,所以使系統更加鬆耦合
    缺點:爲每一個目標類創建接口
  • 若目標對象沒有實現任何接口,spring使用CGLIB庫生成目標對象的子類。
    優點:因爲代理類與目標類是繼承關係,所以不需要有接口的存在。
    缺點:因爲沒有使用接口,所以系統的耦合性沒有使用JDK的動態代理好。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章