【Java】關於Spring MVC框架的總結


SpringMVC是一種基於Java,實現了Web MVC設計模式,請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將Web層進行職責解耦。基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,SpringMVC也是要簡化我們日常Web開發。

MVC

MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式:

視圖

視圖是用戶看到並與之交互的界面。對老式的Web應用程序來說,視圖就是由 HTML元素組成的界面,在新式的Web應用程序中, HTML依舊在視圖中扮演着重要的角色,但一些新的技術已層出不窮,它們包括 Adobe Flash和像 XHTMLXML/ XSL, WML等一些標識語言和
MVC好處是它能為應用程序處理很多不同的 視圖。在視圖中其實沒有真正的處理發生,不管這些數據是聯機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數據並允許用戶操縱的方式。

模型

模型表示企業數據和業務規則。在MVC的三個部件中,模型擁有最多的處理任務。例如它可能用像 EJBs和ColdFusion Components這樣的構件對象來處理數據庫,被模型返回的數據是中立的,就是說模型與數據格式無關,這樣一個模型能為多個視圖提供數據,由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。

控制器

控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求,所以當單擊Web頁面中的超鏈接和發送 HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定調用哪個模型構件去處理請求,然后再確定用哪個視圖來顯示返回的數據。
 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM