• 框架整合——Spring与SpringMVC框架整合步骤与优势讲解


    Spring与SpringMVC整合!

      问:实际上SpringMVC就运行在Spring环境之下,还有必要整合么?SpringMVCSpring都有IOC容器,是不是都需要保留呢?

      答案是:通常情况下,类似于数据源,事务,整合其他框架都是放在spring的配置文件中(而不是放在SpringMVC的配置文件中),实际上放入Spring配置文件对应的IOC容器中的还有ServiceDao.SpringMVC也搞自己的一个IOC容器,在SpringMVC的容器中只配置自己的Handler(Controller)信息。所以,两者的整合是十分有必要的,SpringMVC负责接受页面发送来的请求,Spring框架则负责整理中间需求逻辑,对数据库发送操作请求,对数据库的操作目前则先使用Spring框架中的JdbcTemplate进行处理。

    1.导入SpringSpringMVC的所有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文件中分别配置SpringMVCSpring的配置信息

      

       <!--  ContextLoaderListener 加载IOC容器,Spring框架的底层是listener -->
         <context-param>
    		<param-name>contextConfigLocation</param-name>
    		<!-- 指定Spring的配置文件的路径和名称 -->
    		<param-value>classpath:Spring.xml</param-value>
    	</context-param>
    	<!-- Bootstraps the root web application context before servlet initialization -->
    	<listener>
    		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    	</listener>
    
    
    	<!-- SpringMVC 配置文件 SpringMVC底层是servlet  -->
    	<servlet>
    		<servlet-name>springDispatcherServlet</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
                  <!-- 指定SpringMVC框架的配置文件的路径和名称 -->
                  <param-value>classpath:SpringMVC.xml</param-value>
    		</init-param>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    	<!-- Map all requests to the DispatcherServlet for handling -->
    	<servlet-mapping>
    		<servlet-name>springDispatcherServlet</servlet-name>
    		<url-pattern>/</url-pattern>
    	</servlet-mapping>
    
    
    	<!-- 设置编码,处理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>
    	</filter>
    	<filter-mapping>
    		<filter-name>CharacterEncodingFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    
    
    	<!-- post请求转化为put和delete -->
    	<filter>
    		<filter-name>HiddenHttpMethodFilter</filter-name>
    		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>HiddenHttpMethodFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    

      

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

     spring的配置文件:

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

      

    springmvc的配置文件:   

    <!-- 配置扫描的包 -->
    <context:component-scan base-package="com.neuedu"></context:component-scan>
    
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/views/"></property>
      <property name="suffix" value=".jsp"></property>
    </bean>
    
    <!-- 可以处理静态资源 -->
    <mvc:default-servlet-handler/>
    
    <!-- 可以从一个页面直接通过请求到达另一个页面,不用通过controller -->
    <!-- <mvc:view-controller path="/" view-name="/" /> -->
    <!-- 若只有mvc:default没有mvc:annotation-driven,正常的requestMapping不能被访问,所以它俩是标配 -->
    
    <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构造器都执行了两次!

    问题:若SpringIOC容器和SpringMVCIOC容器扫描的包有重合的部分,就会导致有的bean会被创建2次!

    解决:

        1.使SpringIOC容器扫描的包和SpringMVCIOC容器扫描的包没有重合的部分!

        controller层都在controller包,service层都在service

     2.但是有的时候开发的时候是分模块开发的,这样不太容易做到,所以:

        可以在component-scan标签下面中使用如下子标签来规定只能扫描的注解:

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

      

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

    <context:component-scan base-package="com.neuedu" use-default-filters="false">
      <!-- 扫描注解为@Controller的类 -->
      <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
      <!-- ControllerAdvice注解用来处理全局异常,可以标记在类上,故此处为扫描注解为@ControllerAdvice的类 -->
      <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>
    

      

      而在spring的配置文件中:

    <context:component-scan base-package="com.neuedu">
      <!-- 扫描除了注解为@Controller的类 -->
      <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
      <!-- 扫描除了注解为@ControllerAdvice的类 -->
      <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
    </context:component-scan>

       此时再重新启动项目就会发现springspringmvc的对象都创建了一份!

    6.SpringIOC容器和SpringMVCIOC容器的关系

    外边beans.xml为Spring的配置文件,黄色方格Spring-mvc.xml为SpringMVC的配置文件

    注意:

    1.SpringMVC容器中的bean可以引用Spring容器中的bean也就是在Controller中我们可以注入service层对象【可以在controller层的requestMapping方法中打印service对象试一下】!

    2.反之则不行,就是说:在spring扫描的service层不能引用springmvchandler(Controller)对象【注解一个小例子,启动项目就会出错】

    3.实际上Spring的容器和Spring容器有父子间关系,【参考图片】就像儿子可以继承父亲的基因一样,父亲没法继承儿子的基因!

      而且从另一个角度也说明了Handler(Controller)是可以依赖Service层的,但是Service层却不可以依赖Handler(Controller)层!

  • 相关阅读:
    MySQL InnoDB事务隔离级别脏读、可重复读、幻读
    数据结构与算法-Python/C
    Go语言 转至Nick老师博客
    短信验证功能、邮箱验证功能
    psutil模块
    简单邮件传输协议SMTP
    CSS3主要的几个样式笔记
    cURL的几个经典实例
    Socket进程通信机制
    对PDO的认识
  • 原文地址:https://www.cnblogs.com/Mr-zhaoz/p/7471000.html
Copyright © 2020-2023  润新知