SpringMVC是一種基於Java,實現了Web MVC設計模式,請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將Web層進行職責解耦。基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,SpringMVC也是要簡化我們日常Web開發。
MVC
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式:
視圖
模型
控制器
Spring MVC
特點
(1)清晰地角色划分。Spring MVC在Model、View和Controller方面提供了一個非常清晰的角色划分。
(2)靈活的配置功能。因為Spring的核心是IoC,同樣在實現MVC上,也可以把各種類當作Bean來通過XML進行配置。
(3)提供了大量的控制器接口和實現類。開發者可以使用Spring提供的控制器實現類,也可以自己實現控制器接口。
(4)真正做到了與View層的無關。它不會強制開發者使用JSP,也可以根據項目需求使用Velocity、XSLT等技術、使用起來更加靈活。
(5)國際化支持。
(6)面向接口編程。
(7)Spring提供了Web應用開發的一整套流程、不僅僅是MVC,它們之間可以很方便地結合一起。
工作流程
(1)首先用戶發送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理,而是委托給其他的解析器進行處理,作為統一訪問點,進行全局的流程控制;
(2)DispatcherServlet——>HandlerMapping,映射處理器將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象;
(3)DispatcherServlet——>HandlerAdapter,處理器適配器將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持很多類型的處理器;
(4)HandlerAdapter——>調用處理器相應功能處理方法,並返回一個ModelAndView對象(包含模型數據、邏輯視圖名);
(5)ModelAndView對象(Model部分是業務對象返回的模型數據,View部分為邏輯視圖名)——> ViewResolver, 視圖解析器將把邏輯視圖名解析為具體的View;
(6)View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構;
(7)返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。
核心類與接口:
DispatcherServlet -- 前置控制器
HandlerMapping接口 -- 處理請求的映射
HandlerMapping接口的實現類:
SimpleUrlHandlerMapping 通過配置文件,把一個URL映射到Controller
DefaultAnnotationHandlerMapping 通過注解,把一個URL映射到Controller類上
HandlerAdapter接口 -- 處理請求的映射
AnnotationMethodHandlerAdapter類,通過注解,把一個URL映射到Controller類的方法上
Controller接口 -- 控制器
由於我們使用了@Controller注解,添加了@Controller注解注解的類就可以擔任控制器(Action)的職責,
所以我們並沒有用到這個接口。
HandlerInterceptor 接口--攔截器
無圖,我們自己實現這個接口,來完成攔截的器的工作。
ViewResolver接口的實現類
UrlBasedViewResolver類 通過配置文件,把一個視圖名交給到一個View來處理
InternalResourceViewResolver類,比上面的類,加入了JSTL的支持
View接口
JstlView類
LocalResolver接口
HandlerExceptionResolver接口 --異常處理
SimpleMappingExceptionResolver實現類
ModelAndView類
無圖。
使用Spring MVC
配置DispatcherServlet
DispatcherServlet是一個Servlet,所以可以配置多個DispatcherServlet。
DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要自已定義,把攔截下來的請求,依據某某規則分發到目標Controller(我們寫的Action)來處理。
web.xml:
1 <servlet> 2 <servlet-name>DispatcherServlet</servlet-name> 3 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 4 <init-param> 5 <param-name>contextConfigLocation</param-name> 6 <param-value>classpath:springmvc-servlet.xml</param-value> 7 </init-param> 8 </servlet> 9 <servlet-mapping> 10 <servlet-name>DispatcherServlet</servlet-name> 11 <url-pattern>/</url-pattern> 12 </servlet-mapping>
這里主要有點需要注意:
(1)classpath:springmvc-servlet.xml 用於加載類路徑下的springmvc配置文件,文件名可以自定義。如果不定義<init-param>標簽則默認加載配置文件的路徑是WEB-INF下。
(2)<url-pattern>/</url-pattern>表示所有請求都會被過濾。
springmvc-servlet.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context-2.5.xsd 10 http://www.springframework.org/schema/aop 11 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 12 http://www.springframework.org/schema/tx 13 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 14 http://www.springframework.org/schema/mvc 15 http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 16 17 <!-- 默認的注解映射的支持 --> 18 <mvc:annotation-driven /> 19 20 <!-- 靜態資源加載 --> 21 <mvc:resources location="/statics/" mapping="/statics/**" /> 22 23 <!-- 掃包 --> 24 <context:component-scan base-package="cn.xxxx.controller"/> 25 26 <!-- 視圖解析器 --> 27 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 28 <property name="prefix" value="/WEB-INF/jsp/"/> 29 <property name="suffix" value=".jsp"/> 30 </bean> 31 32 <!-- 全局異常處理 --> 33 <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 34 <property name="exceptionMappings"> 35 <props> 36 <prop key="cn.xxxx.exception.LoginException">error</prop> 37 </props> 38 </property> 39 </bean> 40 </beans>
<context:component-scan/> 掃描指定的包中的類上的注解,常用的注解有:
@Controller 聲明Action組件
@Service 聲明Service組件 @Service("myMovieLister")
@Repository 聲明Dao組件
@Component 泛指組件, 當不好歸類時.
@RequestMapping("/menu") 請求映射
@Resource 用於注入,( j2ee提供的 ) 默認按名稱裝配,@Resource(name="beanName")
@Autowired 用於注入,(srping提供的) 默認按類型裝配
@Transactional( rollbackFor={Exception.class}) 事務管理
@ResponseBody
@Scope("prototype") 設定bean的作用域
<mvc:annotation-driven /> 是一種簡寫形式,完全可以手動配置替代這種簡寫形式,簡寫形式可以讓初學都快速應用默認配置方案。<mvc:annotation-driven /> 會自動注冊DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter 兩個bean,是spring MVC為@Controllers分發請求所必須的。
並提供了:數據綁定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,讀寫XML的支持(JAXB),讀寫JSON的支持(Jackson)。
本文部分取自網絡:http://elf8848.iteye.com/blog/875830