Spring MVC的工作流程
1 用户请求
2 前端控制器
3 handlerMapping 找到对应的Controller
4 controller 返回执行链
5 前端控制器通过 HandlerAdapter去执行执行链,返回model and view
6 将model and view交给视图渲染器,渲染成视图
0x01使用配置
配置前端控制器,在Web.xml中添加
配置完成后,在classpath目录冲创建 spring文件夹,文件夹中创建spring Mvc配置文件
先不考虑service层和dao层,有了前端控制器,就需要配置HandlerMapping 映射器和HandlerAdapter 适配器,最后是视图解析器
为了简化配置,DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter被mvc标签代替
所以 spring-web.xml文件如下
0x02 Controller
- URL映射
简单URL映射的配置:
|
|
不过现在一律使用注解式映射
|
|
通过RequestMapping来限定url访问的方法,注意的是@Controller()和@RequestMapping()是需要成对出现的,否则无法访问,另外RequestMapping还有延伸,通过规范请求方式,请求头等来限定用户请求。
- 参数的绑定和自定义参数绑定
Spring MVC 自带参数绑定的功能,就是根据request中的key/value数据,找到对应名称和类型的入参,将参数绑定到对应的pojo对象上,特殊类型例如Date,可以通过自定义参数绑定,来讲参数绑定到pojo上
写几个案例:
|
|
还有N多注入方式,其原理大致一样:有兴趣百度:SpringMVC参数绑定
自定义参数绑定的方式是参数按照用户自己编写转换器处理后绑定
|
|
这样前端的字符串,就可以转换成其他任意类型了。
0x03 SpringMVC对事务的支持
service一般用来处理数据逻辑业务,校验数据等。这一层属于业务逻辑层,所以在某些业务上需要进行事物处理.
如何使用SpringMVC的事务管理呢,有两种方法
- 开启事务注解12345678<!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--数据库连接池,集成之后就不会出现红色--><property name="dataSource" ref="dataSource"/></bean><!--开启注解式事物--><tx:annotation-driven transaction-manager="transactionManager"/>
使用
- 配置AOP自动事务管理12345678910111213141516171819<!--切面通知--><tx:advice id="transactionInterceptor" transaction-manager="transactionManager"><tx:attributes><tx:method name="save*" propagation="REQUIRED"/><tx:method name="insert*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="select*" propagation="SUPPORTS" read-only="true"/><tx:method name="get*" propagation="SUPPORTS" read-only="true"/><tx:method name="find*" propagation="SUPPORTS" read-only="true"/></tx:attributes></tx:advice><!--配置AOP--><aop:config><aop:advisor advice-ref="transactionInterceptor"pointcut="execution(* com.zing.*.service.*.*(..))"></aop:advisor></aop:config>
前者简单,后者可以规范代码。都可以选择。
0x04 RESTful链接和静态资源的支持
可以将URL的链接某部分作为参数传入方法
静态资源可以用<mvc:resource >
标签来映射,否则可能会会被拦截
如图的配置,表示将WEB-INF下static文件夹用/rs/来映射,这样就可以通过http://localhost:8000/rs/js/jquery.min.js
来访问static目录下/js/jquery.min.js文件了
0x05 拦截器
Spring拦截器,编写一个类实现org.springframework.web.servlet.HandlerInterceptor;
就可以作为拦截器使用了
拦截器中有3个方法
配置拦截器方式
0x06全局异常的处理 ExceptionResolver
Spring中有现成的全局异常处理解决方法
可以看到返回的依旧是 ModelAndView ,处理完成后,可将想返回给用户的友好的界面。
将这个全局异常处理器配置到xml中, 直接当Bean放进去就行,Spring会默认将异常处理交给这个Resolver。