干貨!SpringMVC面試高頻問題整理
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
1.SpringMVC是什么? 請說出你對它的理解?
SpringMVC是Spring將Web層基于MVC封裝后的框架.
在沒有SpringMVC之前,Web層的Servlet負(fù)責(zé)的事情很多,很雜.
? 例如:接收請求,調(diào)用service層處理請求,封裝返回結(jié)果,響應(yīng)信息給瀏覽器.
SpringMVC將Servlet負(fù)責(zé)的事情分門別類,進(jìn)行具體的劃分.
? M-model: 封裝數(shù)據(jù)
? V-View: 封裝視圖
? C-Controller: 處理器方法,用于接收請求

?
2.SpringMVC的加載流程是什么?
加載流程,即服務(wù)器啟動時(shí),加載SpringMVC的環(huán)境:
?? ??? ?1.服務(wù)器啟動時(shí)從web.xml文件開始加載
??? 2.初始總控制器 DispatcherServlet
??? 3.在總控制器的初始化方法中(initStrategies:初始化策略),完成核心組件的加載
?? ??? ?處理器映射器:HandlerMapping
???????? 建立綁定路徑與方法全限定名的對應(yīng)關(guān)系
????? 處理器適配器:HandlerAdapter
???????? 適配處理器的實(shí)現(xiàn)方式,調(diào)用指定的類反射執(zhí)行處理器方法
????? 視圖解析器:ViewResolver
???????? 根據(jù)邏輯視圖生成對應(yīng)的物理視圖,并將物理視圖返回

?
3.SpringMVC的執(zhí)行流程是什么?
執(zhí)行流程,即瀏覽器發(fā)起請求后,框架內(nèi)部的執(zhí)行鏈路:
?? ??? ?1.瀏覽器發(fā)起請求給服務(wù)器
??? 2.DispatcherServlet攔截來自瀏覽器的請求
??? 3.總控制器調(diào)用處理器映射器,根據(jù)請求路徑找到對應(yīng)的方法全限定名,并返回給總控制器
??? 4.總控制器調(diào)用處理器適配器,找到對應(yīng)的方法適配實(shí)現(xiàn)方式,調(diào)用指定的實(shí)現(xiàn)類反射執(zhí)行方法
??? 5.總控制器調(diào)用視圖解析器,根據(jù)邏輯視圖找到對應(yīng)的物理視圖
??? 6.生成響應(yīng)

4.SpringMVC的核心組件有哪些?作用是什么?
??? DispatcherServlet: 總控制器/前端控制器
????? 接收請求,調(diào)度
??? HandlerMapping: 處理器映射器
????? SpringMVC框架加載時(shí),存放請求路徑與處理器方法之間的映射關(guān)系
??? HandlerAdapter: 處理器適配器
????? 適配處理器的實(shí)現(xiàn)方式,實(shí)現(xiàn)方式不同調(diào)用的適配器類不同.不同的適配器類,可以處理不同的處理器方法.
??? ViewResolver: 視圖解析器
????? 根據(jù)邏輯視圖,生成對應(yīng)的物理視圖,并將物理視圖返回給總控制器
??? Handler: 處理器
????? 我們自己編寫的用于處理器業(yè)務(wù)的方法
5.SpringMVC常用注解有哪些?
@RequestMapping
?? ?為處理器綁定瀏覽器訪問的路徑
@RequestBody
?? ?解析請求攜帶的json數(shù)據(jù),封裝到對應(yīng)的javaBean中
@ResponseBody
?? ?將響應(yīng)結(jié)果裝換成json并響應(yīng)給瀏覽器
@Controller
?? ?用于創(chuàng)建Controller層類對象,并將類對象存放到SpringMVC的IOC容器中
@ControllerAdvice
?? ?全局異常處理
? 全局?jǐn)?shù)據(jù)綁定
? 全局?jǐn)?shù)據(jù)預(yù)處理
6.@Controller注解的作用
用于創(chuàng)建Controller層類對象,并將類對象存放到SpringMVC的IOC容器中
7.@RequestMapping注解的作用
?注解書寫位置:
?? ?類上: 用于窄化請求路徑,訪問此類中的方法時(shí),方法路徑前都要加上此路徑
?? ?方法上: 為處理器方法綁定瀏覽器訪問的路徑
8.SpringMVC如何設(shè)置轉(zhuǎn)發(fā)和重定向?
請求轉(zhuǎn)發(fā):
?? ?邏輯視圖字符串 + 視圖解析器
?? ?響應(yīng)標(biāo)記 + 物理視圖字符串
重定向:
?? ?響應(yīng)標(biāo)記 + 物理視圖字符
9.SpringMVC中攔截器編寫方式?
SpringMVC中的攔截器實(shí)現(xiàn)方式有兩種:
?? ?1.編寫一個(gè)類實(shí)現(xiàn)HandlerInterceptor接口,重寫抽象方法
? 2.編寫一個(gè)類繼承HandlerInterceptorAdapter,選擇性的重寫方法
以上兩種方式需要在核心配置文件中配置攔截的路徑
10.SpringMvc的處理器是不是單例模式?如果是,有什么問題?怎么解決?
是單例模式,在多線程訪問的時(shí)候有線程安全問題.
解決方案: 在控制器里面不能寫可變狀態(tài)量,如果需要使用這些可變的量,可以使用ThreadLocal解決,為每個(gè)線程單獨(dú)生成一個(gè)變量,獨(dú)立操作,互不影響.
11.Springmvc的優(yōu)點(diǎn)?
1.可以支持各種視圖技術(shù),而不僅僅局限于JSP.
2.與Spring框架集成(如IoC容器、AOP等)
3.清晰的角色分配:總控制器(dispatcherServlet),請求到處理器映射(handlerMapping),處理器適配器(HandlerAdapter),視圖解析器(ViewResolver).
4.支持各種請求資源的映射策略。
?
其他小白零碎問題整理:
1、SpingMvc中的控制器的注解一般用那個(gè),有沒有別的注解可以替代
一般用@Conntroller注解,表示是表現(xiàn)層,不能用用別的注解代替.
2、@RequestMapping注解用在類上面有什么作用
用于類上,表示類中的所有響應(yīng)請求的方法都是以該地址作為父路徑。
3、怎么樣把某個(gè)請求映射到特定的方法上面
直接在方法上面加上注解@RequestMapping,并且在這個(gè)注解里面寫上要攔截的路徑
4、如果在攔截請求中,我想攔截get方式提交的方法,怎么配置
可以在@RequestMapping注解里面加上method=RequestMethod.GET
5、如果在攔截請求中,我想攔截提交參數(shù)中包含”type=test”字符串,怎么配置
可以在@RequestMapping注解里面加上params=”type=test”
6、我想在攔截的方法里面得到從前臺傳入的參數(shù),怎么得到
直接在形參里面聲明這個(gè)參數(shù)就可以,但必須名字和傳過來的參數(shù)一樣
7、如果前臺有很多個(gè)參數(shù)傳入,并且這些參數(shù)都是一個(gè)對象的,那么怎么樣快速得到這個(gè)對象
直接在方法中聲明這個(gè)對象,SpringMvc就自動會把屬性賦值到這個(gè)對象里面
8、怎么樣在方法里面得到Request,或者Session
直接在方法的形參中聲明request,SpringMvc就自動把request對象傳入
9、SpringMvc中函數(shù)的返回值是什么.
返回值可以有很多類型,有String, ModelAndView,當(dāng)一般用String比較好
10、SpringMvc怎么處理返回值的
SpringMvc根據(jù)配置文件中InternalResourceViewResolver的前綴和后綴,用前綴+返回值+后綴組成完整的返回值
11、SpringMVC怎么樣設(shè)定重定向和轉(zhuǎn)發(fā)的
在返回值前面加”forward:”就可以讓結(jié)果轉(zhuǎn)發(fā),譬如”forward:user.do?name=method4” 在返回值前面加”redirect:”就可以讓返回值重定向,譬如”redirect:http://www.baidu.com”
12、 SpringMvc用什么對象從后臺向前臺傳遞數(shù)據(jù)的
通過ModelMap對象,可以在這個(gè)對象里面用put方法,把對象加到里面,前臺就可以通過el表達(dá)式拿到
13、SpringMvc中有個(gè)類把視圖和數(shù)據(jù)都合并的一起的,叫什么
叫ModelAndView
14、怎么樣把ModelMap里面的數(shù)據(jù)放入Session里面
可以在類上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
15、SpringMvc怎么和AJAX相互調(diào)用的
通過Jackson框架就可以把Java里面的對象直接轉(zhuǎn)化成Js可以識別的Json對象
具體步驟如下
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解
16、當(dāng)一個(gè)方法向AJAX返回特殊對象,譬如Object,List等,需要做什么處理
要加上@ResponseBody注解
17、SpringMvc里面攔截器是怎么寫的
有兩種寫法,一種是實(shí)現(xiàn)接口,另外一種是繼承適配器類,然后在SpringMvc的配置文件中配置攔截器即可:?
1?
2?
3????"/modelMap.do"?/>
4????"com.et.action.MyHandlerInterceptorAdapter"?/>
5?
? 作者?|??再思
來源 |??cnblogs.com/wu-sheng/p/15552149.html

加鋒哥微信:?java3459?? 圍觀鋒哥朋友圈,每天推送Java干貨!
