一、springMVC概述
springMVC是spring下的一个模块,是基于MVC设计模式的web框架。
二、springMVC的核心流程
请求发给前端控制器(dispatcher),由前端控制器依据处理器映射器(handlerMapping)查找对应的处理器处理请求,返回handlerExecutionChain(包含handler和handlerInterceptor)给前端控制器,前端控制器会再调用处理器适配器(handlerAdapter)来调用对应的处理器(handler),处理器返回模型数据(ModelAndView)给前端控制器,前端控制器依据逻辑视图名调用视图解析器(ViewResolver),返回物理视图,进行视图渲染(就是把ModelAndView里的数据保存到request域中),完成响应。
三、前端控制器的配置
在web.xml里仿照servlet来配置
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>xxx</servlet-class>
<!--这里是配置用前端控制器来加载springMVC的配置文件-->
<init-param>
<param-name>contextConfigLocation<param-name>
<param-value>classpath:config/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--这里的URL映射有两种方式
*.action:匹配后缀
/:匹配所有,但此时要防止静态资源的被访问,这种方式支持RESTFUL风格
-->
<url-mapping>/<url-mapping>
</servlet-mapping>
复制代码
四、处理器映射器和处理器适配器配置
1、非注解的处理器适配器和处理品映射器
1.1、处理器适配器 *SimpleControllerHandlerAdapter:这个处理器适配器要求处理器要实现Controller接口,并且这个Controller接口里的方法返回ModelAndView对象
public ModelAndView handleRequest(HttpServletRequest,HttpServletResponse){
return new ModelAndView();
}
复制代码
*HttpRequestHandlerAdapter:它要求处理器实现HttpRequest接口
public void handlRequest(HttpServletRequest,HttpServletResponse){
}
复制代码
因为返回值为void类型所以它可以影响返回的数据类型和响应头 1.2、处理器映射器 *BeanNameUrlHandlerMapping:依据处理器配置的name属性的URL来映射 *SimpleUrlHandlerMapping
<bean class="xxx">
<property name="mappings">
<props>
<prop key="/items">controller的id</prop>
</props>
</property>
</bean>
复制代码
因此这个处理器映射器可以对同一个处理器进行多个虚拟路径的映射
2、注解的处理器适配器和处理器映射器
引入:如果我们没有在springMVC的配置文件里配置视图解析器以及处理器映射器和适配器时发现springMVC也能同样运行,其实如果我们不配置,那么前端控制器会到dispatcher.properties的文件里去加载默认配置的适配器、映射器以及解析器
3.1之前的处理器映射器
DefaultAnotationHandlerMapping
3.1之后的处理器映射器
RequestMappingHandlerMapping
3.1之前的处理器适配器
AnnotationMthodHandlerAdapter
3.1之后的处理器适配器
RequestMappingHandlerAdapter
复制代码
因此我们要配置springMVC的配置文件,不然前端控制器就要加载过时的处理器适配器和处理器映射器
配置注解的处理器映射以和处理器适配器
<mvc:annotaion-driven/>
*在编写的处理器上用@Controller来表示这是一个处理器
*在处理器中方法上添加@RequestMapping("/items")来映射这个方法的URL
复制代码
这样的快捷方式,默认绑定了很多的参数绑定器,比如json的装换器
3、视图解析器的配置
<bean id="viewResolver" class="xxxInternalResourceViewResolver">
<property prefix="/WEB-INF/jsps/"/>
<property suffix="*.jsp"/>
</bean>
复制代码
五、springMVC与mybatis的整合
1、为什么要整合
通过spring来整合表现层、业务层、持久层、是让spring来管理表现层的controller、业务层的service、持久层的mapper,从而让各层互相调用
2、springmvc整合mybatis的配置文件
1、整合DAO
<!--加载数据库配置文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="xxxComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--配置sqlSessionFactory-->
<bean id="sqlSessionFactory" class="xxxxSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--加载mybatis的全局配置文件-->
<property name="configLocation" value="classpath:config/mybatis/sqlMapCofig.xml"/>
</bean>
<!--配置mapper-->
<bean class="MapperScannerConfigurer">
<property name="basePackage" value="com.nmid.ssm.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
复制代码
2、整合service
<bean id="customService" class="xxxxcustomServiceImp"/>
复制代码
3、配置事务控制的配置文件
*配置事务管理器
*配置事务通知
*配置AOP
具体的配置请看我的spring精华知识中的spring事务配置那章
注意:对于把上面配置的所有配置文件包括加载进spring容器中的方法就是配置一个监听ServletContext的监听器
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conifg/spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>xxxContextLoaderListener</listener-class>
</listener>
复制代码
六、controller的返回值类型和@RequestMapping的作用
ModelAndView:返回模型数据对象,需要分别设置视图和数据
String:返回逻辑视图名和重定向以及转发
void:实现影响应头等
@RequestMapping可以加载类上来实现窄化请求,同时也可以限定访问的方法
七、springMVC的参数绑定
1、简单参数绑定
只要求页面的参数名字和形参的名字一样即可,否则可以使用@RequestMapping("")来指定
2、pojo类型的参数绑定
要求页面的参数名字与pojo对象里的属性名字一样即可绑定
3、自定义参数绑定
比如日期的参数绑定就要我们自己实现自定义的参数绑定
*在处理器是配置器上加上转换器
<mvc:annotaion-driven conversion-service="conversionService"/>
复制代码
*在springMVC配置文件里配置转换器
<bean id="conversionService" class="xxxFormattingConversionServiceFactoryBean">
<property name="convertes">
<list>
<bean class=""/>
</list>
</property>
</bean>
复制代码
八、springMVC与structs的区别
springMVC是基于方法开发而Struts是基于类开发,简单来说就是springMVC是基于URL和controller方法来映射,如果映射成功就会生成一个controller对象,而这个对象里只有映射成功的那个方法,传来的页面参数都会被映射为形参,而方法执行后形参就销毁,所以springMVC可以单例开发。
而Struts是基于类开发,通过成员变量接受参数,单例不安全,因此它是多例的。
九、springMVC的复杂参数绑定
1、对于包装类型的pojo
页面要属性.属性的方式传递包装pojo里pojo对应的属性值。
2、数组类型
页面参数的名字和数组的名字相同即可
3、list和map集合类型
对于list类型,要求要明确是对list里的那个po对象的那个属性赋值;而对于map类型就按map['key']的方式传递
十、springMVC的数据校验和数据回显
1、数据校验
引入:通常对于web开发而言,数据校验,前端页面要进行数据校验,服务器端也要进行数据校验,而服务器端的数据校验通常在表现层对传递而来的数据进行校验和在service层对业务接口使用到的数据进行校验。
springMVC使用的是hibernateValidator的数据校验器的接口。
如何配置
<!--配置数据校验器-->
<bean id="validator" class="xxxLocalValidatorFactoryBean">
<property name="providerClass" class="xxxHibernateValidator"/>
<property name="messageSource" ref="messageSource"/>
</bean>
<!--配置错误信息的配置文件-->
<bean id="messageSource" class="xxxReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:xxx</value>
</list>
</property>
<property name="fileEncodings" value="utf-8">
</property>
<property name="cacheSeconds" value="120"/>
</bean>
<!--在数据处理器的适配器上添加这个校验器-->
<mvc:annotation-driven validator="validator"/>
复制代码
2、数据回显
对于pojo类型的数据,springMVC自动把页面pojo以类名首字母小写作为key保存到了request域中,而如果要指定保存到request域中的key,可以使用@ModelAttribute("xx")来指定。同时@ModelAttribute("xx")放到方法上可以把方法返回值保存到request域中
而对于简单的数据类型,则只能使用Model来实现回显
十一、springMVC的全局异常处理器
springmvc里的异常处理器是:在表现层、业务层、持久层遇到预期异常都要抛出异常,最后由前端控制器交给全局的异常处理器处理。
全局异常处理器的处理思路:
如果全局异常处理器捕捉到的异常是预期异常那么就在页面回显异常信息,如果不是预期异常那么就要另做处理。
全局异常类只需要实现handlerExceptionResolver即可就可以了,然后实现其方法。
十二、springMVC对于图片的上传
一定要做springMVC的配置文件里配置多组件的解析器
<bean id="" class="xxxCommonsMutipartResolver">
<property name="maxUploadSize">
<value>xxx</value>
</proeprty>
</bean>
复制代码
其次是在形参上写MutipartFile mutipartfile的形参
图片上传代码的注意事项:
*图片是否为空
*解决图片的绝对路径和生成新的图片名
*设置图片保存的路径要以多目录形式同时要配置虚拟路径
*保存图片路径到数据库
十三、springMVC与json数据交互
*前端请求的是json数据格式的请求,后端要使用@RequestBody来吧json数据格式来转换成java对象,而后处理后要使用@ResponseBody把Java对象转为json数据返回
*前端请求的是key/value的数据格式,后端直接使用@ResponseBody把Java对象转换为json数据格式返回
一定要配置json数据转换的转换器
而如果是使用的注解便捷配置那么就不用配置json转换的转换器了,它自动配置好了
十四、springMVC与RESUTFUL风格
*要把前端控制器的url-mapping设置为“/”,但这时候要防止对静态资源的访问,所以还要配置对静态资源的访问
<mvc:resources location="/js/" mapping="/js/**"/>
复制代码
十五、拦截器
拦截器要实现HandlerIntercptor接口,里面的三个方法分别对应handler方法之前、进入handler方法中后modelAndView返回之前和模型数据返回后的这三个时间段进行调用的。
配置拦截器
springmvc把拦截器配置在了处理器映射器上,映射成功的处理器使用拦截器。
但springMVC也支持全局拦截器的配置,即自动为每个处理器器映射器配置了拦截器
<!--配置全局拦截器,多个拦截器时按顺序执行-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class=""/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class=""/>
</mvc:interceptor>
</mvc:interceptors>
复制代码