• spring—springmvc整合


    1.在WEB应用中使用Spring
       1.创建IOC容器对象
       2.Web应用工作阶段:初始化阶段-->请求响应阶段--->卸载前清理
       3.Web应用初始化阶段【只创建一次】将IOC容器对象创建出来,并保存到application域中【让在同一个web应用下的都能访问同一个IOC容器】
           
           pageContext
           request
           session
           application/servletContext
           
       4.web应用创建IOC容器
         1.在web.xml文件中配置Spring提供的一个监听器创建IOC容器对象
            org.springframework.web.context.ContextLoaderListener
         2.配置Web应用的初始化参数告诉Spring,配置文件的位置
         3.需要导入Spring在web应用中专用的jar包
           spring-web-4.0.0.RELEASE.jar
           spring-webmvc-4.0.0.RELEASE.jar       

     1      <!-- 配置加载Spring IOC容器的监听器 -->
     2         <context-param>
     3             <param-name>contextConfigLocation</param-name>
     4             <param-value>classpath:applicationContext.xml</param-value>
     5         </context-param>
     6 
     7         <!-- Bootstraps the root web application context before servlet initialization -->
     8         <listener>
     9             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    10         </listener>     

      
    7.Spring整合SpringMVC!
       实际上SpringMVC就运行在Spring环境之下,还有必要整合么?
       SpringMVC和Spring都有IOC容器,是不是都需要保留呢?
     
      答案是:通常情况下,类似于数据源,事务,整合其他框架都是放在spring的配置
              文件中(而不是放在SpringMVC的配置文件中),实际上放入Spring配置文件对
              应的IOC容器中的还有Service和Dao.而SpringMVC也搞自己的一个IOC容器,在
              SpringMVC的容器中只配置自己的Handler信息。
              
        1.导入Spring和SpringMVC的所有jar包
            c3p0-0.9.1.2.jar
            com.springsource.net.sf.cglib-2.2.0.jar
            com.springsource.org.aopalliance-1.0.0.jar
            com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
            commons-logging-1.1.3.jar
            mysql-connector-java-5.1.37-bin.jar
            spring-aop-4.0.0.RELEASE.jar
            spring-aspects-4.0.0.RELEASE.jar
            spring-beans-4.0.0.RELEASE.jar
            spring-context-4.0.0.RELEASE.jar
            spring-core-4.0.0.RELEASE.jar
            spring-expression-4.0.0.RELEASE.jar
            spring-jdbc-4.0.0.RELEASE.jar
            spring-orm-4.0.0.RELEASE.jar
            spring-tx-4.0.0.RELEASE.jar
            spring-web-4.0.0.RELEASE.jar
            spring-webmvc-4.0.0.RELEASE.jar
            
         2.在web.xml文件中分别配置SpringMVC和Spring的配置信息
                   

     1     <!--spring配置-->
     2 <context-param>
     3                     <param-name>contextConfigLocation</param-name>
     4                     <param-value>classpath:applicationContext.xml</param-value>
     5                 </context-param>
     6 
     7                 <listener>
     8                     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     9                 </listener>
    10  <!--springmvc配置-->               
    11 <servlet>
    12                     <servlet-name>springDispatcherServlet</servlet-name>
    13                     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    14                     <init-param>
    15                         <param-name>contextConfigLocation</param-name>
    16                         <param-value>classpath:springmvc.xml</param-value>
    17                     </init-param>
    18                     <load-on-startup>1</load-on-startup>
    19                 </servlet>
    20 
    21                 <servlet-mapping>
    22                     <servlet-name>springDispatcherServlet</servlet-name>
    23                     <url-pattern>/</url-pattern>
    24                 </servlet-mapping>
    25                 <!--POST请求的乱码处理-->
    26                 <filter>
    27                     <filter-name>CharacterEncodingFilter</filter-name>
    28                     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    29                     <init-param>
    30                         <param-name>encoding</param-name>
    31                         <param-value>utf-8</param-value>
    32                     </init-param>
    33                 </filter>
    34                 <!--POST请求转化为PUT请求和DELETE请求-->
    35                 <filter-mapping>
    36                     <filter-name>CharacterEncodingFilter</filter-name>
    37                     <url-pattern>/*</url-pattern>
    38                 </filter-mapping>
    39                 
    40                 <filter>
    41                     <filter-name>HiddenHttpMethodFilter</filter-name>
    42                     <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    43                 </filter>
    44                 <filter-mapping>
    45                     <filter-name>HiddenHttpMethodFilter</filter-name>
    46                     <url-pattern>/*</url-pattern>
    47                 </filter-mapping>

             
           3.配置spring的配置文件和springmvc的配置文件
                 spring的配置文件:               

     1             <!-- 配置扫描的包 -->
     2                     <context:component-scan base-package="com.neuedu"></context:component-scan>
     3                     <!-- 加载properties文件中 信息 -->
     4                     <context:property-placeholder location="classpath:jdbc.properties"/>
     5                     <!-- 配置数据源 -->
     6                     <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
     7                         <property name="user" value="${jdbc.user}"></property>
     8                         <property name="password" value="${jdbc.passowrd}"></property>
     9                         <property name="jdbcUrl" value="${jdbc.url}"></property>
    10                         <property name="driverClass" value="${jdbc.driver}"></property>
    11                     </bean>
    12                     
    13                     <!-- 配置JdbcTemplate对应的bean, 并装配dataSource数据源属性-->
    14                     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    15                         <property name="dataSource" ref="comboPooledDataSource"></property>
    16                     </bean>
    17                     <!-- 为了执行带有具名参数的SQL语句,需要配置NamedParameterJdbcTemplate -->
    18                     <!-- 该NamedParameterJdbcTemplate类没有无参构造器,需要传入JdbcTemplate对象或者数据源对象[DataSource] -->
    19                     <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    20                         <!-- 不能使用property标签配置哦 -->
    21                         <constructor-arg ref="jdbcTemplate"></constructor-arg>
    22                     </bean>                   

                springmvc的配置文件:                            

    1        <context:component-scan base-package="com.neuedu"></context:component-scan>
    2                 
    3                 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    4                     <property name="prefix" value="/WEB-INF/views/"></property>
    5                     <property name="suffix" value=".jsp"></property>
    6                 </bean>
    7                 <mvc:default-servlet-handler/>
    8                 <mvc:annotation-driven></mvc:annotation-driven>         

            加入jdbc.properties文件         

            jdbc.user=root
                jdbc.passowrd=123456
                jdbc.url=jdbc:mysql://localhost:3306/jdbc_template
                jdbc.driver=com.mysql.jdbc.Driver

              
          4.创建Controller类与Service类,并创建这两个类的无参构造器,分别输出一句话!
          
          5.启动项目,会发现controller构造器和service构造器都执行了两次!
            问题:若Spring的IOC容器和SpringMVC的IOC容器扫描的包有重合的部分,就会导致有的
                 bean会被创建2次!
            解决:
                1.使Spring的IOC容器扫描的包和SpringMVC的IOC容器扫描的包没有重合的部分!
                  controller层都在controller包,service层都在service包
                2.但是有的时候开发的时候是分模块开发的,这样不太容易做到,所以:
                  可以在component-scan标签下面中使用如下子标签来规定只能扫描的注解:               

    1     <context:component-scan base-package="com.neuedu">
    2              <context:exclude-filter type="annotation" expression=""/>
    3              <context:include-filter type="annotation" expression=""/>
    4        </context:component-scan>        

                所以在springMVC的配置文件中我们可以按着如下配置,只扫描controller及ControllerAdvice注解:               

    1 <context:component-scan base-package="com.neuedu" use-default-filters="false">
    2          <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    3           <!-- 处理全局异常 -->          
    4          <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    5 </context:component-scan>              

                而在spring的配置文件中:              

    1   <context:component-scan base-package="com.neuedu">
    2            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    3            <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    4   </context:component-scan>      

           此时再重新启动项目就会发现spring和springmvc的对象都创建了一份!
           
          6.Spring的IOC容器和SpringMVC的IOC容器的关系
             注意:
                1.SpringMVC容器中的bean可以引用Spring容器中的bean,
                  也就是在Controller中我们可以注入service层对象【可以在controller层的requestMapping方法中打印service对象试一下】!
                2.反之则不行,就是说:在spring扫描的service层不能引用springmvc的handler
                  对象【注解一个小例子,启动项目就会出错】
                3.实际上Spring的容器和Spring容器有父子间关系,【参考图片】就想儿子可以继承父亲的基因一样,父亲没法继承儿子的基因!
                  而且从另一个角度也说明了Handler是可以依赖Service层的,但是Service层却不可以依赖Handler层!
                 

  • 相关阅读:
    数据结构与算法参考答案(第十三周)
    数据结构与算法参考答案(第十二周)
    数据结构与算法参考答案(第十一周)
    数据结构与算法参考答案(第十周)
    数学建模国赛注意事项(持续更新)
    数值分析期末复习秘籍
    2020第十一届蓝桥杯软件类省赛第二场C/C++ 大学 B 组 填空题题解(未拿省一的个人反思)
    2020第十一届蓝桥杯软件类省赛第二场C/C++ 大学 B 组 E: 七段码(DFS,二进制枚举+并查集判重)
    递归实现指数型枚举(DFS)
    Codeforces Round #678 (Div. 2)B. Prime Square(矩阵均匀构造)
  • 原文地址:https://www.cnblogs.com/kangxingyue-210/p/7488639.html
Copyright © 2020-2023  润新知