7 K& u; q9 d4 L/ t7 V% ]
Spring Web MVC是一种基于java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。 另外还有一种基于组件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF等。 Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。 二:Spring Web MVC能帮我们做什么 √让我们能非常简单的设计出干净的Web层和薄薄的Web层; √进行更简洁的Web层的开发; √天生与Spring框架集成(如IoC容器、AOP等); √提供强大的约定大于配置的契约式编程支持; √能简单的进行Web层的单元测试; √支持灵活的URL到页面控制器的映射; √非常容易与其他视图技术集成,如Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用); √非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API; √提供一套强大的JSP标签库,简化JSP开发; √支持灵活的本地化、主题等解析; √更加简单的异常处理; √对静态资源的支持; √支持Restful风格。 三:Spring Web MVC架构 Spring Web MVC框架也是一个基于请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理。首先让我们整体看一下Spring Web MVC处理请求的流程:
) \1 m5 B* ~! ^. R3 J 四:项目案例 web.xml配置: - <?xml version="1.0" encoding="UTF-8"?> t& o: n0 L2 p3 R# t s9 i
- <web-app version="2.4"
4 |& ^$ e/ q+ Y* \ - xmlns="http://java.sun.com/xml/ns/j2ee" 0 i+ y1 q/ g: x) u! H4 z
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" * O: o! B' v% K: X2 [. z7 C8 k
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 7 ~) Q! W$ I) U) R" Z
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
8 `. J& A# I' h( U* ~5 U* W - <servlet>% H- G3 f( y8 w
- <servlet-name>springmvc</servlet-name>
/ }( h- a. G e0 ]/ R5 T% R! N - <servlet-class>. a2 a* ?, N$ q- ]5 b! {& `2 S
- org.springframework.web.servlet.DispatcherServlet7 V' s C5 M% D& R+ S
- </servlet-class>
( T3 m8 k0 m+ `, i2 C - <init-param>
* Y7 P: m$ ^- Z3 Q - <param-name>contextConfigLocation</param-name>+ f+ ?) O" h4 t: r* i/ o- g9 M
- <param-value>classpath:applicationContext.xml</param-value>
2 \1 e$ o4 v) m7 v1 [: c% o& m - </init-param>
1 z1 h ]4 d. l$ `. M: U - <load-on-startup>1</load-on-startup>
! R) `6 Z A9 \ - </servlet>9 S4 a$ K$ v# [( U
- <servlet-mapping>1 I% U! O% \6 W7 I% `
- <servlet-name>springmvc</servlet-name>
( f# i; ^5 r* H( T; ^ - <url-pattern>*.do</url-pattern>) ]6 u& {- `# z! `
- </servlet-mapping>1 d1 @& M; w5 U3 l% g8 N: y! f) r* u
- <filter>+ k b3 j) m) S' z q: I; V
- <filter-name>CharacterEncodingFilter</filter-name>( g- F ]" \ T6 L. u1 [
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
. o$ ]4 q4 ]/ L1 @; H7 x! _ - <init-param>
8 f' |$ ]( g7 C2 M) B - <param-name>encoding</param-name>5 L0 Z3 K& C* W: \: d
- <param-value>utf-8</param-value>
$ g, f# \6 A! J8 C# S7 D. v$ d - </init-param>; t9 ~6 b- B/ G& }
- </filter>
2 [4 w( |- A! C+ Z3 h. R5 C! f - <filter-mapping>3 K4 _. j3 n& R8 Y
- <filter-name>CharacterEncodingFilter</filter-name>' Z9 ?6 @* L8 A1 k, K/ A4 U+ j
- <url-pattern>/*</url-pattern>
7 Z& w" d7 q, c! \/ F4 W+ o - </filter-mapping>% t d+ g" @4 d1 a+ F
- <welcome-file-list>
& f5 b* s9 ]3 w- f5 ?5 j' ? - <welcome-file>index.jsp</welcome-file>
, W' f) E2 i3 J - </welcome-file-list>
8 P9 ~+ [% L; R, Q - </web-app>
3 J+ t: S+ p; `9 f" \
复制代码 applicationContext.xml配置:- <?xml version="1.0" encoding="UTF-8"?>
. I! ?% [2 F! v- v* x/ j- v - <beans xmlns="http://www.springframework.org/schema/beans"
, B! R7 Q( w' h2 [ k - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
! g* S9 m! z$ X2 A! J - xmlns:tx="http://www.springframework.org/schema/tx" 7 K0 S2 U# x4 P& m# D. v
- xmlns:aop="http://www.springframework.org/schema/aop"
' {& J: r4 s% p- X6 \ - xmlns:context="http://www.springframework.org/schema/context" / A) N) M% k1 l( x4 w1 R
- xmlns:jee="http://www.springframework.org/schema/jee"& H; V2 b* l5 l: L
- xsi:schemaLocation="
: ]8 R, T. I8 h6 g - http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
' m" s% @. I- A$ W$ q. b2 n - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd& {! m) K/ _* R! a3 Y9 c( D, h' H
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
9 j/ f* V6 ~0 k7 d/ M3 i$ u) ^) Y& m - http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd3 y B; y, \- J
- http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
& l! }' H5 M+ [- C4 Z7 A - <!-- 定义映射处理器,指定请求和controller对应关系 -->
: Z, t3 h6 ?9 X7 w! P& y! S' f - <bean id="handlerMapping" ) D) ^9 f |2 {, U& a: a7 b
- class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">) Y; Y0 |* [" H* u
- <property name="mappings">' F# P5 ?1 ~9 T2 d+ e% m8 f5 T5 n
- <props>: J- n6 [2 M5 o# l
- <prop key="welcome.do">welcomeController</prop>$ r/ i t9 h' v& f Q
- <prop key="login.do">loginController</prop>) r) N9 _# O% O- [
- <prop key="toLogin.do">toLoginController</prop>) r6 q; L8 T- ?" F/ ]6 n# f5 v
- </props>
2 V# D* i/ i4 |. L - </property>
& w5 I; c/ k( i m - </bean>
& o. f2 ~2 D: r0 [; a U& A - <!-- 定义视图解析器,根据ModelAndView信息定位视图组件 -->7 U- n9 d2 M& i
- <bean id="viewResolver"
# {, f6 D! H) m. { - class="org.springframework.web.servlet.view.InternalResourceViewResolver">$ [! R- B4 J T. g; G
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
2 q" x J5 V/ j' P# g - <!-- 配置视图后缀 --> " i; b/ m: K6 M$ n
- <property name="suffix" value=".jsp"></property>3 c$ O% E9 h B9 @$ x
- <!-- 配置视图前缀 -->
) O5 l+ U5 ^4 ?) U6 H* ? k* E - <property name="prefix" value="WEB-INF/jsp/"></property>
) N, u! N- N* ^0 V8 X8 G$ O. k - </bean>! `9 I- Q9 E, p. S% q' H5 D. ~4 X
- <!-- 定义Controller组件,等价于原来的Action -->
" E' J6 L% k; |* c$ h: Y! k5 w - <bean id="welcomeController" scope="prototype" class="itstyle.action.WelcomeController"></bean>
$ D8 H9 ?* M2 H. l+ H; { - <bean id="loginController" scope="prototype" class="itstyle.action.LoginController"> & J ~" E: n7 `& d. q& m
- <property name="commandClass" 8 t2 T) E, R1 Q# c7 Q
- value="itstyle.entity.User"># @( Z' F: U6 f% m) F# _( S
- </property>
, @- _. b; }6 d, Y% } t - </bean>. H4 V9 ?0 [* _8 \( U( t! D
- <bean id="toLoginController" scope="prototype" class="itstyle.action.ToLoginController"></bean>
, U( z3 d) P* e% `: v - </beans>
复制代码 项目测试通过 包含所有的jar包和配置文件 导入即可。
' s; G8 n u) g, n* H: q/ y0 Q3 a
* e/ t0 {9 C! ]: Y2 C( x3 P+ z
|