学习淘淘商城第十课(SSM框架整合之springmvc整合及父子容器的关系)

 上节课我们一起学习了整合service层,这节我们一起学习下怎样整合web层即springmvc。

        我们在taotao-manager-web工程的src/main/resource目录下新建一个spring文件夹,在该目录下新建一个springmvc.xml文件,如下图所示。


       springmvc.xml文件的内容如下:

[html]  view plain  copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  6.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  
  8.         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd  
  9.         http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
  10.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">  
  11.           
  12.       
  13.     <mvc:annotation-driven />  
  14.       
  15.     <bean  
  16.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  17.         <property name="prefix" value="/WEB-INF/jsp/" />  
  18.         <property name="suffix" value=".jsp" />  
  19.     bean>  
  20.       
  21.     <context:component-scan base-package="com.taotao.controller"/>  
  22. beans>  

      可以看到我们springmvc.xml文件中配置的扫描包是com.taotao.controller,因此我们需要创建这么一个目录,如下图所示。

 

      下面我们需要配置编码和前端控制器,我们需要在taotao-manager-web工程下的web.xml文件中配置。

       web.xml文件配置内容如下,其中前端控制器配置中1这句话的意思是tomcat启动之后便加载DispatcherServlet,如果不配置的话,需要等请求访问的时候才会加载DispatcherServlet。另外可以看到,我们并没有配置父容器(ContextLoaderListener),这是因为我们在taotao-manager工程中已经配置过了,而且配置了Dao和Service。因此我们表现层不需要再配置一遍父容器了。

[html]  view plain  copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.      id="WebApp_ID"  
  4.      xmlns="http://java.sun.com/xml/ns/javaee"  
  5.      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  7.      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  8.      <display-name>taotao-managerdisplay-name>  
  9.      <welcome-file-list>  
  10.         <welcome-file>index.jspwelcome-file>  
  11.      welcome-file-list>  
  12.       
  13.     <filter>  
  14.         <filter-name>CharacterEncodingFilterfilter-name>  
  15.         <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>  
  16.         <init-param>  
  17.             <param-name>encodingparam-name>  
  18.             <param-value>utf-8param-value>  
  19.         init-param>  
  20.     filter>  
  21.     <filter-mapping>  
  22.         <filter-name>CharacterEncodingFilterfilter-name>  
  23.         <url-pattern>/*url-pattern>  
  24.     filter-mapping>  
  25.       
  26.     <servlet>  
  27.         <servlet-name>taotao-manager-webservlet-name>  
  28.         <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>  
  29.           
  30.         <init-param>  
  31.             <param-name>contextConfigLocationparam-name>  
  32.             <param-value>classpath:spring/springmvc.xmlparam-value>  
  33.         init-param>  
  34.         <load-on-startup>1load-on-startup>  
  35.     servlet>  
  36.     <servlet-mapping>  
  37.         <servlet-name>taotao-manager-webservlet-name>  
  38.           
  39.         <url-pattern>/url-pattern>  
  40.     servlet-mapping>  
  41. web-app>  
       说到这里,我们一般会对父子容器(同一个工程下)比较感兴趣,想知道是怎么回事,请看下面这张图。Spring父容器一般配置的是Dao层和Service层,而Spring子容器一般配置的是Controller层,父子容器的访问关系是, 子容器可以访问父容器中的对象,但是父容器无法访问子容器中的对象。比如controller可以把Dao和Service注入进来,但是Dao和Service无法把Controller注进来。


         我们在service配置扫描包的时候配置的扫描范围是"com.taotao.service",如果我们配置成com.taotao,那么就会把com.taotao.controller也扫描到父容器中,这样父子容器中就都有controller层了,但是在父容器中扫进来controller是没有用的,我们在表现层访问的时候,访问的还是子容器的controller。同理,如果把子容器的扫描范围扩大,变为com.taotao,那么它便会把Dao和Service也扫描到子容器当中,这样当我们访问表现层的时候,访问的便是子容器中的Dao和Service,子容器中的Dao和Service是没有事务的,但是父容器中的Dao和Service是有事务的,这样就会导致虽然我们在父容器中配置了事务,但由于子容器扫描范围太大,而导致访问子容器中的Dao和Service没有事务的问题。

      由于子容器可以直接访问父容器中的对象,因此我们在子容器中不用配置Dao和Service便可以直接使用它们。

      子容器其实也可以完全当父容器使用,之所以搞出父子容器,是为了让父容器有更好的扩展性,子容器只需要消费父容器就可以了。

你可能感兴趣的:(淘淘商城)