Spring技術(shù)手冊(cè)筆記(四):Spring MVC 上
Posted on 2009-11-15 22:32 codingliyi 閱讀(926) 評(píng)論(0) 編輯 收藏 所屬分類: Java EE在SpringMVC框架中,擔(dān)任前端控制器的org.springframework.web.servlet.DispatcherServlet。Web.xml文件配置代碼如下:

2

3

4

5

6

7

8

9

10

11

12

13

14

DispatcherServlet負(fù)責(zé)分發(fā)請(qǐng)求至控制對(duì)象(Controller),控制對(duì)象要實(shí)現(xiàn)Controller接口中的handleRequest()方法:
ModelAndView handleRequest()HttpServletRequest request, HttpServletResponse response) throws Exception;
在web MVC架構(gòu)下,控制對(duì)象的作用為收集使用者的請(qǐng)求,進(jìn)行web層的相關(guān)操作,不應(yīng)當(dāng)在控制對(duì)象中執(zhí)行業(yè)務(wù)邏輯,也不應(yīng)當(dāng)讓Servlet相關(guān)的API浸入至業(yè)務(wù)層。
實(shí)際上,DispatcherServlet必須根據(jù)一個(gè)HandlerMapping對(duì)象,決定請(qǐng)求由哪一個(gè)Controller來(lái)處理,DispatcherServlet默認(rèn)用BeanNameUrlHandlerMapping,也就是根據(jù)Bean在定義時(shí)的“name”屬性及使用者請(qǐng)求的URL,決定使用哪個(gè)Controller實(shí)例。
在Controller返回ModelAndView后,DispatcherServlet會(huì)交由ViewR esolver對(duì)象來(lái)作View層的相關(guān)解析。例如InternalResourceViewResolver,需要設(shè)置viewClass,默認(rèn)是org.springframework.web.servlet.view.InternalResourceView。
InternalResourceViewResolver的prefix和suffix屬性會(huì)與ModelAndView返回的路徑信息結(jié)合。
一個(gè)簡(jiǎn)單的Spring MVC的Hello world例子如下:
編寫SayHelloController.java文件,實(shí)現(xiàn)Controller接口
2

3

4

5

6

7

8

9

10

11

12

13

14


2

3

4

5

6

7

8

9

項(xiàng)目的組織結(jié)構(gòu)如下圖:
Handler Mapping
BeanNameUrlHandlerMapping是簡(jiǎn)單的HandlerMapping,Spring中常用的是SimpleUrlHandlerMapping。
一段配置如下:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Handler Interceptor
在執(zhí)行Controller的前后,或是在View繪制之后打算作一些操作,可以實(shí)現(xiàn)HandlerInterceptor接口:

2

3

4

5

6

7

8

9

10

11

12

13

可以繼承HandlerInterceptorAdapter,它實(shí)現(xiàn)了HandlerInterceptor接口。然后在xml文件中配置上上段代碼。
ModelAndView
ModelAndView類代表了Spring MVC程序中,呈現(xiàn)畫面所使用的Model數(shù)據(jù)對(duì)象與View數(shù)據(jù)對(duì)象。由于Java程序的方法中一次只能返回一個(gè)對(duì)象,所以ModelAndView的作用是封裝這兩個(gè)對(duì)象,方便同時(shí)返回Model與View。
Model可以用一個(gè)Map封裝;View可以用一個(gè)簡(jiǎn)單字符串,也可以用一個(gè)實(shí)現(xiàn)了View接口的對(duì)象。一個(gè)實(shí)現(xiàn)View的實(shí)例是RediectView,它將使用重定向。而默認(rèn)是使用轉(zhuǎn)發(fā)。
View Resolver
View名稱的解析是委托給實(shí)現(xiàn)ViewResolver接口的實(shí)例。其一個(gè)實(shí)例是InternalResourceViewResolver。
還有其他的如BeanNameViewResolver。當(dāng)ModelAndView返回的view名稱是“hello”時(shí),會(huì)尋找id屬性是hello的View Bean。
ViewResolver在名稱解析完畢后,實(shí)際的View繪制于Model對(duì)象的轉(zhuǎn)換處理時(shí)交給實(shí)現(xiàn)View接口的實(shí)例。例如InternalResourceViewResolver默認(rèn)的viewClass是InternalResourceView。還有其他的如JstlView、TilesView、VelocityView等。