1背景介绍
SSM框架,是Spring + Spring MVC + MyBatis的缩写,Spring依赖注入DI来管理各层的组件,使用面向切面编程AOP管理事物、日志、权限等。SpringMVC代表了Model(模型)View(视图)Controller(控制)接收外部请求,进行分发和处理。Mybatis是基于jdbc的框架,主要用来操作数据库,并且将业务实体和数据表联系起来。
2知识剖析
SSM整合思路
spring在进行管理时,是很有条理的,每个层都由spring管理,然后不同的层可以调用其它层,Handler调用service,service调用mapper等。
1整合dao层。mybatis和spring整合,通过spring管理mapper接口。使用mapper的扫描器自动扫描mapper接口在spring中进行注册。
2整合service层。通过spring管理 service接口。使用配置方式将service接口配置在spring配置文件中。实现事务控制。
3整合springmvc。由于springmvc是spring的模块,不需要整合。
application.xml
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:db.properties"></property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"></property> <property name="url" value="${url}"></property> <property name="username" value="${user}"></property> <property name="password" value="${password}"></property> <property name="initialSize" value="${InitialPoolSize}"></property> <property name="maxActive" value="${MaxActive}"></property> <property name="maxIdle" value="${MaxIdleTime}"></property> <property name="defaultAutoCommit" value="false"></property> <!--最后一个属性设置为defaultAutoCommit为false,这样数据库进行操作时就不会每进行一个数据库操作就自动提交一次事务了。--> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="typeAliasesPackage" value="com.task2.pojo"></property> <!--Mapper.xml文件与mapper接口在同一个包下时可以不用注入--> <!--<property name="mapperLocations" value="classpath*:com/task2/mapper/UserMapper.xml"></property>--> </bean> <!--指定扫描的包名,如果有多个包就用逗号隔开--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--扫描映射文件mapper--> <property name="basePackage" value="com.task2.mapper"></property> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <bean id="page" class="com.task2.pojo.Page"> </bean> <bean id="userServiceImpl" class="com.task2.service.UserServiceImpl"> </bean>
<!--扫描controller层--> <context:component-scan base-package="com.task2.controller"></context:component-scan> <!-- Spring MVC不处理静态资源 --> <mvc:default-servlet-handler/> <!-- 一个配置解决映射器和适配器的配置注解配置 --> <mvc:annotation-driven enable-matrix-variables="true"></mvc:annotation-driven> <!--对模型视图添加前后缀--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> <!--p:prefix="WEB-INF/pages/" p:suffix=".jsp"--> </bean> <bean id="timeInterceptor" class="com.task2.aspectJ.TimeInterceptor"></bean> <aop:config> <aop:aspect id="aspect" ref="timeInterceptor"> <aop:pointcut id="point2" expression="execution(* com.task2.controller.UserController.*(..))"/> <aop:around method="doAroundCT" pointcut-ref="point2" ></aop:around> </aop:aspect> </aop:config>
SpringMVC流程:
服务器发送Http request请求,请求被前端控制器(DispatcherServlet)捕获。
前端控制器根据xml文件中的配置(或者注解)对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用处理器映射器(HandlerMapping)获得处理该请求的Handler以及Handler对应的拦截器,最后以 HandlerExecutionChain 对象的形式返回。前端控制器根据获得的Handler,选择一个合适的处理器适配器(HandlerAdapter)去执行该Handler。处理器适配器提取request中的模型数据,填充Handler入参,执行处理器(Handler)(也称之为Controller)。Handler(Controller)执行完成后,向处理器适配器返回一个ModelAndView对象,处理器适配器再向前端控制器返回该ModelAndView对象(ModelAndView只是一个逻辑视图)。
根据返回的ModelAndView,前端控制器请求一个适合的视图解析器(ViewResolver)(必须是已经注册到Spring容器中的ViewResolver)去进行视图解析,然后视图解析器向前端控制器返回一个真正的视图View(jsp)。
前端控制器通过Model解析出ModelAndView中的参数进行解析,最终展现出完整的View并通过Http response返回给客户端。
3常见问题
3.1put和delete方法不支持
3.2静态资源无法访问
4解决方案
4.1配置rest风格的过滤器
<!--配置rest风格过滤器--> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> <init-param> <param-name>methodParam</param-name> <param-value>_method</param-value> </init-param> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
4.2
<!-- Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler/>
5参考文献
https://blog.csdn.net/eson_15/article/details/51689023
https://blog.csdn.net/eson_15/article/details/51700519