SpringMVC常見面試知識點(diǎn)
1.什么是SpringMVC ?簡單介紹下你對SpringMVC的理解?
Spring MVC是一個基于Java的實現(xiàn)了MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,通過把Model,View,Controller分離,將Web層進(jìn)行職責(zé)解耦,把復(fù)雜的web應(yīng)用分成邏輯清晰的幾部分,簡化開發(fā),減少出錯,方便組內(nèi)開發(fā)人員之間的配合
2.SpringMVC的流程?
1)
用戶發(fā)送請求至前端控制器DispatcherServlet
2)
DispatcherServlet收到請求后,調(diào)用HandlerMapping處理器映射器,請求獲取Handler
3)
處理器映射器根據(jù)請求url找到具體的處理器Handler,生成處理器對象及處理器攔截器(如果有則生成),一并返回給DispatcherServlet
4)
DispatcherServlet 調(diào)用 HandlerAdapter處理器適配器,請求執(zhí)行Handler
5)
HandlerAdapter 經(jīng)過適配調(diào)用 具體處理器進(jìn)行處理業(yè)務(wù)邏輯
6)
Handler執(zhí)行完成返回ModelAndView
7)
HandlerAdapter將Handler執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet
8)
DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進(jìn)行解析
9)
ViewResolver解析后返回具體View
10)
DispatcherServlet對View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)
11)
DispatcherServlet響應(yīng)用戶

前端控制器DispatcherServlet
:接收請求、響應(yīng)結(jié)果,相當(dāng)于轉(zhuǎn)發(fā)器,有了DispatcherServlet 就減少了其它組件之間的耦合度
處理器映射器 HandlerMapping
:根據(jù)請求的URL來查找Handler
處理器適配器 HandlerAdapter
:負(fù)責(zé)執(zhí)行Handler
處理器 Handler
:處理器,需要程序員開發(fā)
視圖解析器 ViewResolver
:進(jìn)行視圖的解析,根據(jù)視圖邏輯名將ModelAndView解析成真正的視圖(view)
視圖View
:View是一個接口, 它的實現(xiàn)類支持不同的視圖類型,如jsp,freemarker,pdf等等
3.SpringMVC的優(yōu)點(diǎn)
1)可以支持各種視圖技術(shù),而不僅僅局限于JSP
2)與Spring框架集成(如IoC容器、AOP等)
3)清晰的角色分配:前端控制器(dispatcherServlet) ,請求到處理器映射(handlerMapping),處理器適配器(HandlerAdapter),視圖解析器(ViewResolver)
4) 支持各種請求資源的映射策略
4.SpringMVC怎么樣設(shè)定重定向和轉(zhuǎn)發(fā)的?
1)轉(zhuǎn)發(fā):在返回值前面加”forward:”,譬如”forward:user.do?name=method4”
2)重定向:在返回值前面加”redirect:”,譬如”redirect: http://www.baidu.com “
5.SpringMVC常用的注解有哪些?
@RequestMapping
:用于處理請求 url 映射的注解,可用于類或方法上。用于類上,則表示類中的所有響應(yīng)請求的方法都是以該地址作為父路徑
@RequestBody
:注解實現(xiàn)接收http請求的json數(shù)據(jù),將json轉(zhuǎn)換為java對象
@ResponseBody
:注解實現(xiàn)將conreoller方法返回對象轉(zhuǎn)化為json對象響應(yīng)給客戶
6.SpingMVC中的控制器的注解一般用哪個?有沒有別的注解可以替代?
一般用
@Controller
注解,也可以使用
@RestController
,
@RestController注解相當(dāng)于@ResponseBody + @Controller
,表示是表現(xiàn)層,除此之外,一般不用別的注解代替
7.SpringMVC里面攔截器是怎么寫的?
有兩種寫法,一種是
實現(xiàn)HandlerInterceptor接口
,另外一種是
繼承適配器類,接著在接口方法當(dāng)中,實現(xiàn)處理邏輯
;然后在SpringMvc的配置文件中配置攔截器即可:
<!-- 配置SpringMvc的攔截器 -->
<mvc:interceptors>
<!-- 配置一個攔截器的Bean就可以了 默認(rèn)是對所有請求都攔截 -->
<bean id="myInterceptor"class="com.pz.controller.MyHandlerInterceptor"></bean>
<!-- 只針對部分請求攔截 -->
<mvc:interceptor>
<mvc:mapping path="/modelMap.do" />
<bean class="com.pz.controller.MyHandlerInterceptorAdapter" />
</mvc:interceptor>
</mvc:interceptors>
8.SpringMVC怎么和AJAX相互調(diào)用的?
通過
Jackson框架
就可以把Java里面的對象直接轉(zhuǎn)化成Js可以識別的Json對象。具體步驟如下 :
1)加入Jackson.jar
2)在配置文件中配置json的映射
3)在接受Ajax方法里面可以直接返回
Object、List
等,但方法前面要加上
@ResponseBody注解
9.SpringMVC的異常處理 ?
可以將異常拋給Spring框架,由Spring框架來處理
我們只需要配置簡單的異常處理器,在異常處理器中添視圖頁面即可
10.SpringMVC的控制器是不是單例模式?如果是,有什么問題?怎么解決?
是單例模式,在多線程訪問的時候有
線程安全問題
解決方案是
在控制器里面不能寫可變狀態(tài)量
如果需要使用這些可變狀態(tài),可以使用
ThreadLocal機(jī)制
解決,為每個線程單獨(dú)生成一份變量副本,獨(dú)立操作,互不影響
11.如果在攔截請求中,我想攔截get方式提交的方法,怎么配置?
可以在
@RequestMapping
注解里面加上
method=RequestMethod.GET
12.怎樣在方法里面得到Request,或者Session?
直接在
方法的形參中聲明request
,SpringMvc就
自動把request對象傳入
13.如果想在攔截的方法里面得到從前臺傳入的參數(shù),怎么得到?
直接在
形參里面聲明這個參數(shù)
就可以,但必須
名字和傳過來的參數(shù)一樣
14.如果前臺有很多個參數(shù)傳入,并且這些參數(shù)都是一個對象的,那么怎么樣快速得到這個對象?
直接在
方法中聲明這個對象
,SpringMvc就
自動會把屬性賦值到這個對象里面
15.SpringMVC中函數(shù)的返回值是什么?
有
String,ModelAndView
ModelAndView類
把視圖和數(shù)據(jù)都合并的一起的,但
一般用String比較好
16.SpringMVC用什么對象從后臺向前臺傳遞數(shù)據(jù)的?
通過
ModelMap
對象,可以在這個對象里面
調(diào)用put方法
,把對象加到里面,前端就可以通過
el表達(dá)式
拿到
17.怎么樣把ModelMap里面的數(shù)據(jù)放入Session里面?
可以在類上面加上
@SessionAttributes
注解,
里面包含的字符串
就是要
放入session里面的key
18.Restful風(fēng)格
Restful風(fēng)格的API是一種軟件架構(gòu)風(fēng)格
,設(shè)計風(fēng)格而不是標(biāo)準(zhǔn),只是提供了一組設(shè)計原則和約束條件
主要用于客戶端和服務(wù)器交互類的軟件。基于這個風(fēng)格設(shè)計的軟件可以更簡潔,更有層次,更易于實現(xiàn)緩存等機(jī)制
在Restful風(fēng)格中,用戶請求的url使用同一個url而用請求方式:get,post,delete,put…等方式對請求的處理方法進(jìn)行區(qū)分,這樣可以在前后臺分離式的開發(fā)中使得前端開發(fā)人員不會對請求的資源地址產(chǎn)生混淆和大量的檢查方法名的麻煩,形成一個統(tǒng)一的接口
在Restful風(fēng)格中,現(xiàn)有規(guī)定如下:
GET(SELECT)
:從服務(wù)器查詢,可以在服務(wù)器通過請求的參數(shù)區(qū)分查詢的方式
POST(CREATE)
:在服務(wù)器新建一個資源,調(diào)用insert操作
PUT(UPDATE)
:在服務(wù)器更新資源,調(diào)用update操作
PATCH(UPDATE)
:在服務(wù)器更新資源(客戶端提供改變的屬性)。(目前jdk7未實現(xiàn),tomcat7也不行)
DELETE(DELETE)
:從服務(wù)器刪除資源,調(diào)用delete語句
