SpringMVC

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...)

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,方法执行结束形参销毁,多线程访问不同的方法都会有单独的空间
8.2 springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,多线程操作会共享成员变量,所以无法使用单例
8.3 经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl




posted @ 2019-01-22 04:28  kasi  阅读(181)  评论(0编辑  收藏  举报