1. Springmvc框架
1.1 什么是Springmvc
- Springmvc是基于Spring框架的一个模块,springmvc和Spring无需通过中间整合层进行整合
- Springmvc是一个基于mvc的web框架
1.2 Springmvc框架
步骤:
- 第一步:发起请求到前端控制器(DispatcherServlet)
- 第二步:前端控制器请求HandlerMapping查找Handler
- 可以根据xml配置,注解进行查找
- 第三步:处理映射器HandlerMapping向前端控制器返回Handler
- 第四步:前端控制器调用处理器适配器去执行Handler
- 第五步:处理器适配器去执行Handler
- 第六步:Handler执行完成给适配器返回ModelAndView
- 第七步:处理器适配器向前端控制器返回ModelAndView
- ModelAndView是springmvc框架的一个底层对象,包括model和view
- 第八步:前端控制器请求视图解析器去进行视图解析
- 根据逻辑视图名解析成正真的视图
- 第九步:视图解析器向前端控制器返回view
- 第十步:前端控制器进行视图渲染
- 视图渲染将模型数据(在ModelAndView对象中)填充到request域
- 第十一步:前端控制器向用户响应结果
组件:
- 1.前端控制器DispatcherServlet(不需要程序员开发)
- 作用:接收请求响应结果,相当于转发器,中央处理器,有了DispatcherServlet减少了其他组件之间的耦合度
- 2.处理器映射器HandlerMapping(不需要程序员开发)
- 作用:根据请求的url查找handler
- 3.处理器适配器HandlerAdapter
- 作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
- 4.处理器Handler(需要程序员开发)
- 注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
- 5.视图解析器View resolver(不需要程序员开发)
- 作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
- 6.视图view(需要程序员开发jsp)
- view是一个接口,实现类支持不同的view类型(jsp,freemarker,pdf...)
- 1.前端控制器DispatcherServlet(不需要程序员开发)
2. 入门程序
2.1 导入Spring中所有jar包
2.2 配置前端控制器
- web.xml配置servlet,拦截请求
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>springmvc</display-name>
<!--Springmvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.Springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器,适配器等),如果不配置contextConfigLocation,
默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml) -->
<init-param>
<param-name>contextConfig</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 第一种:*.action,访问以.action结尾的有DispatcherServlet进行解析
第二种:/,所有访问地址都由DispatcherServlet解析, 对于静态文件需要配置不让其解析
第三种:/*,错误配置 -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
2.3 配置处理器适配器
- 具体执行处理器(Controller方法)的对象,将ModelAndView返回给DispatcherServlet渲染视图用的
<!-- 处理器适配器:所有处理器适配器都实现HandlerAdapter接口 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
2.4 开发Handler
- 创建mav对象,将Controller中需要返回给页面的数据放在里面
//创建ModelAndView对象
ModelAndView mav = new ModelAndView();
//相当于request的setAttribute,在jsp页面中通过itemlist获取数据
mav.addObject("itemlist",itemslist);
//指定视图
mav.setViewName("/WEB-INF/jsp/items.itemlist.jsp")
2.5 视图编写
- jsp页面
2.6配置Handler
<!-- 配置Handler -->
<bean name="demo.action" class="com.voion.ssm.Controller.demoController"/>
2.7 配置映射器
- 就是根据DispatcherServlet拿过来的用户请求某部分路径去寻找处理器(就是我们写的具体的某个方法)
<!-- 处理器映射器:将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
2.8 配置视图解析器
- 解析jsp,默认使用jstl标签,classpath下得有jstl的包
<!-- 视图解析器 -->
<!-- 视图解析器的前缀和后缀配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
3. 非注解的处理器映射器和适配器
3.1 非注解的映射器
- 多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理
- 处理器映射器(两个)
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" />
3.2 非注解的适配器
- 对于
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
- 要求编写的Handler实现Controller接口
- 对于
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
- 要求编写的Handler实现HttpRequestHandle接口
4. 注解的映射器适配器
4.1 注解的映射器
- 在Spring3.1之前使用
- 映射器:
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
- 适配器:
org.springframework.web.servlet.mvc.annotation.Annotation.AnnotationMethodHandlerAdapter
- 映射器:
- 在Spring3.1之后使用
- 映射器
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
- 适配器
org.springframework.web.servlet.mvc.annotation.Annotation.RequestMappingHandlerAdapter
- 映射器
4.2 配置注解的映射器和适配器
旧配置
<!-- 注解映射器 --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.class"/> <!-- 注解适配器 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.class"/>
新配置
- 使用mvc:annotation-driven代替上边的注解映射器和注解适配器配置
- mvc:annotation-driven默认加载了很多的参数绑定方法,比如json转换解析器就默认加载了,使用后就不用在配置上面的注解映射器和适配器
- 实际开发时使用mvc:annotation-driven
<!--替代原来注解映射器和适配器的功能--> <mvc:annotation-driven></mvc:annotation-driven>
4.3 注解开发Handler
- 使用注解的映射器和注解的适配器必须配对使用
- 配置完后在Spring文件中扫描注解
<!--扫描有注解的包-->
<context:component-scan base-package="com.voion.ssm.controller" />
5. 源码分析
通过前端控制器源码分析springmvc的执行过程
- 第一步;前端控制器接收请求
- 调用doDiapatch
- 第二步:前端控制器调用处理器映射器查找Handler
- 第三步:调用处理器适配器执行handler,得到执行结果ModelAndView
- 第四步:视图渲染:将model数据填充到request域
6. springmvc小结
- 通过入门程序理解springmvc的前端控制器,处理器映射器,处理器适配器和视图解析器的用法
6.1前端控制器配置
- 方式一:
*.action
,以后缀作为拦截 - 方式二:
/
,对于静态文件需哟啊配置不让DispatcherServlet解析
- 使用此种方式可以实现RESTful风格的url
6.2 处理器映射器
- 非注解处理器映射器(了解)
- 注解的处理器映射器(掌握)
- 对标记@Controller类中标识有@RequestMapping的方法进行映射,在@RequestMapping里面定义映射的url
- 使用注解的映射器不用再xml中配置url和handler的映射关系
6.3 处理器适配器
- 非注解处理器适配器(了解)
- 注解的处理器适配器(掌握)
- 注解处理器适配器和注解处理器映射器是配对使用
6.4 简化配置
<mvc:annotation-driven></mvc:annotation-driven>
可以代替注解的适配器和映射器的配置- 也是实际开发使用的方式
6.5 视图解析器
- 配置前后缀,程序中就不用再写前缀和后缀了
<!-- 视图解析器的前缀和后缀配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
7. springmvc和mybatis的整合
- 架构图
表现层 springmvc | Spring将各层进行整合: 1.通过Spring管理持久层的mapper(相当于到接口) 2.通过Spring管理业务层service,Service中可以调用mapper接口 3.Spring进行事务控制 4.通过Spring管理表现层Handler,Handler中可以调用Service接口 mapper,Service,handler都是javabean |
业务层 service接口 | |
持久层 mybatis | |
数据库 mysql |
- Spring将各层进行整合
- 通过Spring管理持久层的mapper(相当于mapper接口)
- 通过Spring管理业务层Service,Service可以调用mapper接口
- Spring进行实物控制
- 通过Spring管理表现出Handler,handler中可以调用Service接口
- mapper,service,handler都是javabean
- 可以分开三层配置
- sqlMapConfig.xml
- application-dao.xml
- application-Service.xml
- application-transaction.xml
- 也可以配置到一个文件夹中
7.1 第一步:整合dao层
- mybatis和Spring整合,通过Spring管理mapper接口
- 使用mapper的扫描器自动扫描mapper接口在Spring中进行注册
- mybatis配置文件(sqlMapConfig.xml)
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局setting配置,根据需要添加 -->
<!-- 配置别名 -->
<typeAliases>
<!-- 批量扫描别名 -->
<package name="com.voion.ssm.mapper"/>
</typeAliases>
<!-- 配置mapper:由于使用Spring和mybatis整合包进行mapper扫描,所以这里不需要配置
但是必须遵循:mapper.xml和mapper.java文件同名且在一个目录 -->
<!-- <mappers></mappers> -->
</configuration>
- Spring整合mybatis
- applicationContext-dao.xml
<!-- 1. 加载数据库配置的属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 2. 数据源dataSource C3P0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxPoolSize" value="${c3p0.pool.maxPoolSize}"/>
<property name="minPoolSize" value="${c3p0.pool.minPoolSize}"/>
<property name="initialPoolSize" value="${c3p0.pool.initialPoolSize}"/>
<property name="acquireIncrement" value="${c3p0.pool.acquireIncrement}"/>
</bean>
<!-- 3. SessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
</bean>
<!-- 4. DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.voion.ssm.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
7.2 第二步:整合service层
- Spring整合Service
- 只需要扫描Service包即可
<!-- 配置包扫描器,扫描@Service主键的类 -->
<context:component-scan base-package="com.taotao.service"/>
- Spring事务配置
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.taotao.service.*.*(..))" />
</aop:config>
7.3 第三步:整合springmvc
- 由于springmvc是Spring的模块,不需要整合,直接配置Spring的配置文件即可
- 配置springmvc.xml
<!-- 1.包扫描器,扫描@Controller注解 -->
<context:component-scan base-package="com.taotao.controller" />
<!-- 2.注解驱动 -->
<mvc:annotation-driven />
<!-- 3.视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 4.配置资源映射,加载静态资源 -->
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
7.4 第四步:配置web.xml文件
<!-- 1.加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 2.解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!-- <init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param> -->
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 3.springmvc的前端控制器 -->
<servlet>
<servlet-name>taotao-manager</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>taotao-manager</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
8. springmvc和struts2的区别
8.1. springmvc是基于方法开发的,struts2基于类开发
- Springmvc将url和Controller方法映射,映射成功后springmvc生成一个handler对象,对象中只包括了一个method,方法执行结束形参销毁,多线程访问不同的方法都会有单独的空间