Spring技術(shù)手冊筆記(四):Spring MVC 上
Posted on 2009-11-15 22:32 codingliyi 閱讀(926) 評論(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ā)請求至控制對象(Controller),控制對象要實(shí)現(xiàn)Controller接口中的handleRequest()方法:
ModelAndView handleRequest()HttpServletRequest request, HttpServletResponse response) throws Exception;
在web MVC架構(gòu)下,控制對象的作用為收集使用者的請求,進(jìn)行web層的相關(guān)操作,不應(yīng)當(dāng)在控制對象中執(zhí)行業(yè)務(wù)邏輯,也不應(yīng)當(dāng)讓Servlet相關(guān)的API浸入至業(yè)務(wù)層。
實(shí)際上,DispatcherServlet必須根據(jù)一個HandlerMapping對象,決定請求由哪一個Controller來處理,DispatcherServlet默認(rèn)用BeanNameUrlHandlerMapping,也就是根據(jù)Bean在定義時的“name”屬性及使用者請求的URL,決定使用哪個Controller實(shí)例。
在Controller返回ModelAndView后,DispatcherServlet會交由ViewR esolver對象來作View層的相關(guān)解析。例如InternalResourceViewResolver,需要設(shè)置viewClass,默認(rèn)是org.springframework.web.servlet.view.InternalResourceView。
InternalResourceViewResolver的prefix和suffix屬性會與ModelAndView返回的路徑信息結(jié)合。
一個簡單的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

項目的組織結(jié)構(gòu)如下圖:
Handler Mapping
BeanNameUrlHandlerMapping是簡單的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ù)對象與View數(shù)據(jù)對象。由于Java程序的方法中一次只能返回一個對象,所以ModelAndView的作用是封裝這兩個對象,方便同時返回Model與View。
Model可以用一個Map封裝;View可以用一個簡單字符串,也可以用一個實(shí)現(xiàn)了View接口的對象。一個實(shí)現(xiàn)View的實(shí)例是RediectView,它將使用重定向。而默認(rèn)是使用轉(zhuǎn)發(fā)。
View Resolver
View名稱的解析是委托給實(shí)現(xiàn)ViewResolver接口的實(shí)例。其一個實(shí)例是InternalResourceViewResolver。
還有其他的如BeanNameViewResolver。當(dāng)ModelAndView返回的view名稱是“hello”時,會尋找id屬性是hello的View Bean。
ViewResolver在名稱解析完畢后,實(shí)際的View繪制于Model對象的轉(zhuǎn)換處理時交給實(shí)現(xiàn)View接口的實(shí)例。例如InternalResourceViewResolver默認(rèn)的viewClass是InternalResourceView。還有其他的如JstlView、TilesView、VelocityView等。