+ a! W& K& D" R* D. x
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处理请求的流程:
) O# x" D( W4 Z& h+ J o# o: f 四:项目案例 web.xml配置: - <?xml version="1.0" encoding="UTF-8"?>/ q G# a* n. \7 N N# B6 U
- <web-app version="2.4" % T# D2 m, y9 K, L
- xmlns="http://java.sun.com/xml/ns/j2ee"
3 b5 _ D+ `5 z# j - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9 a+ z N. [8 _. ?' E& _' K- N7 ~5 Q# L - xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee . T6 Y6 i8 I. p2 ~5 ^1 D/ z, `
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">0 J+ o2 b. \9 m, T2 f
- <servlet>
0 ] B' l- q1 v" r0 t: t& M - <servlet-name>springmvc</servlet-name>
# u r0 I* Y6 ?% d8 {* f5 E$ ~ - <servlet-class>1 G3 r, z; _) f5 y1 j
- org.springframework.web.servlet.DispatcherServlet
2 x% [7 \; _' j8 C5 Y; C5 u - </servlet-class>
1 ?# _) U0 Z* \- Q" O% e, ` - <init-param>( F+ Z: x& z( q6 l2 A1 ^
- <param-name>contextConfigLocation</param-name>% y% b( x3 X1 P+ V
- <param-value>classpath:applicationContext.xml</param-value>
0 ?( z, Y1 C, V4 V# I. K$ C) J - </init-param>) u ]% w3 {( D: P" i
- <load-on-startup>1</load-on-startup>! i$ c4 Y7 O$ E+ i P- m( A
- </servlet>; y' W4 P$ T2 f6 A+ o w
- <servlet-mapping>
$ W6 S0 D) Q/ @3 P' K4 n - <servlet-name>springmvc</servlet-name>
/ g& s* x# j* C# C - <url-pattern>*.do</url-pattern>$ Q+ W% F& c, L' Y
- </servlet-mapping>
7 U+ U! P; m/ Z) x+ ]; |! | - <filter>6 `# j; ]* u/ U2 `" j& J
- <filter-name>CharacterEncodingFilter</filter-name>2 q0 Q" {' b3 T9 p
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>1 R% c9 A, @- o& l" z; ]
- <init-param>
A) r9 G9 \& Z4 v, x+ {/ S! _ - <param-name>encoding</param-name>
1 r; c5 `. }" m8 X: k7 |1 p# W, h - <param-value>utf-8</param-value>$ g* Y) t7 W, a, |' Y3 w. ~. @
- </init-param>2 r) n$ j# I! `0 A9 t7 {3 `- X
- </filter>
0 @% H5 S! \& @4 W% M0 B - <filter-mapping>( H4 H+ k) s0 L0 j' ~, m
- <filter-name>CharacterEncodingFilter</filter-name>
/ ]: _* d( L7 g) T/ Q# s+ J" h6 P - <url-pattern>/*</url-pattern>
' s7 H: V: P; A/ K6 @; G - </filter-mapping>
8 e1 t9 M! p( c* l0 Q7 k9 v9 i - <welcome-file-list>( Q2 {- y+ Q) k
- <welcome-file>index.jsp</welcome-file>
1 _2 d, R2 z) |* M! @ - </welcome-file-list>
% P2 z3 D8 D. H0 @ - </web-app>1 g4 u$ O# u. G: I/ Q) }9 q
复制代码 applicationContext.xml配置:- <?xml version="1.0" encoding="UTF-8"?>
/ f% z6 V+ V9 x" h6 r' O8 q - <beans xmlns="http://www.springframework.org/schema/beans"
0 R# l; W. u5 n+ [5 h) d. Y$ `% q% o& f - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
$ _5 D1 h1 g3 s. C - xmlns:tx="http://www.springframework.org/schema/tx" 0 H; B! y2 j- z6 W1 r# W
- xmlns:aop="http://www.springframework.org/schema/aop". Z7 X" t8 U, O$ @0 c6 o! R
- xmlns:context="http://www.springframework.org/schema/context" # e. [ ^2 V+ ~- b( ]
- xmlns:jee="http://www.springframework.org/schema/jee"
! G1 h" a" k- O% }' B' R - xsi:schemaLocation="& a; Q5 m* G9 F6 g1 c" C8 m
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
4 U% q3 R2 z% o0 h2 r3 B- Y - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd: d! Z' t# ~& g: a" r
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" B' o# p1 h4 T& `
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd7 ]7 I4 G* k6 X# k9 Z* s S! e
- http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">. E& K7 d6 [# p6 `( ?/ q% C( }( I' _
- <!-- 定义映射处理器,指定请求和controller对应关系 -->
# R7 e6 a8 y0 N, X6 U - <bean id="handlerMapping"
6 t, i4 J b- |$ u+ g8 L - class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">% I- c! R& k5 X# \2 p
- <property name="mappings">
7 V$ g8 y2 g: J9 A% p. ]( ~ - <props>3 j. u& A) J# U9 m
- <prop key="welcome.do">welcomeController</prop>
, r$ B4 n, q* ^1 J: n. b - <prop key="login.do">loginController</prop>
& ^3 o5 W" h' U, [2 N& k - <prop key="toLogin.do">toLoginController</prop>2 s" l' b" }0 S3 _' U+ t& T
- </props>
8 z' G7 G+ G% [# h2 s7 i - </property>" ?) j, f/ I% i0 S( E! _
- </bean>* q) k0 H1 T( k) O' G
- <!-- 定义视图解析器,根据ModelAndView信息定位视图组件 -->
3 y7 Q+ M) y8 B - <bean id="viewResolver" % L; p! I4 `9 S8 R
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
' D' R! \" ?8 w3 k - <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>/ ?) ~) M9 x9 p9 n4 i/ Q
- <!-- 配置视图后缀 --> 4 M& ^# c* z+ ~8 Q" M' j4 g R
- <property name="suffix" value=".jsp"></property>) ]! L! `; G( Z* ~
- <!-- 配置视图前缀 -->
q9 B/ V, \ R5 y% B J4 b - <property name="prefix" value="WEB-INF/jsp/"></property>1 f( `" N$ w3 {4 D* j) ]
- </bean>
. Q, l/ O; F/ E- H; g+ t6 s - <!-- 定义Controller组件,等价于原来的Action -->( I, H1 Y% `- I) v! B
- <bean id="welcomeController" scope="prototype" class="itstyle.action.WelcomeController"></bean>
7 R$ m& w) f* O5 I% @3 f+ C4 I* M; U7 I - <bean id="loginController" scope="prototype" class="itstyle.action.LoginController"> ; x* G* E8 t' b/ `
- <property name="commandClass"
$ h6 }+ Y- y! j. k, } - value="itstyle.entity.User">2 O8 O0 N$ t' b2 `1 z. P: D7 a/ r
- </property>( X. ~: V+ s$ a2 G8 }, K
- </bean>; ^" H2 V0 H, K+ o
- <bean id="toLoginController" scope="prototype" class="itstyle.action.ToLoginController"></bean>
, I# F5 Z2 d+ k - </beans>
复制代码 项目测试通过 包含所有的jar包和配置文件 导入即可。
8 Q2 g8 w4 i- r9 K* {
- q* G, V0 b' u3 A7 O' N' U
|