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

2

3

4

5

6

7

8

9

10

11

12

13

14

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

3

4

5

6

7

8

9

10

11

12

13

14


2

3

4

5

6

7

8

9

項目的組織結構如下圖:
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
在執行Controller的前后,或是在View繪制之后打算作一些操作,可以實現HandlerInterceptor接口:

2

3

4

5

6

7

8

9

10

11

12

13

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