一、引言
由来: 为了插入现有MVC开发架构,基于Spring框架所开发的一个控制器框架
概念: SpringMVC是一个轻量级的MVC中C层框架
优势: 与Struts2相比 速度更快 开发效率高 灵活(注解)
SpringMVC是在Spring框架基础上开发,和Spring框架进行无缝衔接
二、基础配置
1. 注册SpringMVC的配置文件
2. 书写SpringMVC配置文件
1)处理器映射器:解析请求
2)处理器适配器:绑定参数到控制器
3)处理器映射器 返回结果映射
<!-- 注解扫描 -->
<context:component-scan base-package="com.baizhi.action"/>
<!--处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<!--用于解析请求-->
</bean>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<!--用于绑定请求参数到控制器中-->
</bean>
<!--处理器映射器适配器优化版-->
<!--<mvc:annotation-driven/>-->
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置返回结果前缀后缀 完成返回结果映射-->
<property name="prefix" value="/"/><!--前缀-->
<property name="suffix" value=".jsp"/><!--后缀-->
</bean>
三、跳转方式
四、数据接收
1.基本数据类型接收:
在服务方法中定义同名参数,注意:Date类型默认格式为 yyyy/MM/dd hh:mm:ss
2. 对象类型接收:
在服务方法中定义对象类型参数,传递数据时,直接书写属性名=值,后续由SpringMVC自动封装数据
复杂情况:
1.接收的参数有对象类型并且还有基本类型,此时对象的属性名和接收参数的名字一致.SpringMVC会同时赋值
2.对象里边嵌套对象传递方式: 对象属性名.属性名
3.数组集合类型数据接收:
1.数组:传递数据时保证:传递数据的名字相同
2.集合:默认不支持集合类型接收 可以通过封装VO(ValueObject)对象进行接收
4.文件类型的接收:
上传文件使用 MultipartFile 类作为参数 ,必须在配置文件中配置上传解析器 CommonsMultipartResolver
文件下载需设置请求头和设置文件下载方式(inline | attachment)
response.setHeader("content-disposition","attachment:fileName=文件名")
五、作用域
1.使用原生作用域存储传递
将作用域作为参数书写在服务方法的内部
public void returnIndex(HttpServletRequest request,HttpSession session)
request.setAttribute("key","value");
session.setAttribute("key","value");
2.SpringMVC提供
将request作用域封装成了Model || ModelMap类型
3.重定向方式数据存储和传递
直接在返回值中拼接即可
return “redirect:/index.jsp?key=value”
4.页面数据获取和展示:
JSTL+EL表达式
六、拦截器
1.作用:存放冗余代码,提高程序的可维护性
2.特点:只拦截控制器相关请求;可以影响请求轨迹;拦截请求和响应
3.开发流程:
#1.实现 HandlierInterceptor
#2.SpringMVC配置文件注册拦截器
<!--注册拦截器-->
<bean class="com.baizhi.interceptor.LoginInterceptor" id="loginInterceptor"/>
#3.设置拦截器拦截那些请求
<mvc:interceptors>
<!--单个拦截器配置-->
<mvc:interceptor>
<!--设置要拦截的Controller方法 推荐使用**-->
<mvc:mapping path="/emp/**"/>
<!--设置不拦截哪些Controller方法-->
<mvc:exclude-mapping path="/emp/loginok"/>
<!--声明当前使用的拦截器-->
<ref bean="loginInterceptor"/>
</mvc:interceptor>
<!--多个拦截器执行顺序-->
</mvc:interceptors>
SpringMVC全局异常处理:实现 HeadlerExceptionResolver 配置文件注册
七、Spring和SpringMVC父子容器
两者的包扫描可能造成 Service 事务失效
解决方案:
1.细粒度的包扫描:SpringMVC只扫描 Controller; Spring扫描 Service
2.大范围扫描:指定Spring 和 SpringMVC 的扫描范围避免重叠
<context:component-scan base-package="com*" use-default-filters="false指定扫描策略 默认为true(全扫描)">
<!-- 扫描那些类 -->
<context:include-filter type="annontation" expression="包全限定名">
<!-- 不扫描那些类 -->
<context:exclude-filter type="annontation" expression="包全限定名">
</context:component-scan>