第一次整合ssm環境后,對請求流程的理解 ,以及一些配置(有錯就更新)


工程結構圖:

  

 

顯示層(handler/controller):

  request請求到springmvc的前端控制器,從處理器映射器找相應的handler(用@RequestMapping("  ")標注,映射成功后,由Springmvc生成一個handler對象,該對象中有一個方法,即映射成功的該方法),由相應的處理器適配器去執行該handler,handler中調用的是業務控制層(service)的方法接口。然后返回jsp地址的字符串或有地址和請求參數的ModelAndView對象(其中裝載着參數如name,id,和目標地址即相應的顯示頁面如jsp,看了部分源碼,是用Map存儲,然后放到request對象中)到前端控制器,然后前端控制器把ModelAndView傳給視圖解析器,加上解析器中設置的jsp地址的前綴和后綴,然后把視圖返回給前端控制器,再進行視圖的渲染(好像就是把map中數據填充的request對象中),返回給客戶端。

業務控制層(service):

  一個service接口,還有其相應的實現類serviceImpl,這樣做可以使業務控制層的開發和顯示層的開發並行進行,因為只要給顯示層一個service的接口即可。service層的實現類中用Spring的IOC(Autowired注解)自動注入了一個或多個mapper對象,即該對象是調用sqlSessionFactory的getSession的getBean方法獲得的。然后再調用mapper對象的相應方法,需要的時候還應該加入適當的控制流程(比如BeanUtils.copyProperties()方法進行屬性的拷貝或業務的校驗)。

持久層(dao/mapper):

  用逆向工程生成了相應的mapper.java即相應的mapper.xml,還有和數據庫表對應的pojo,這些可以實現比較簡單的單表查詢。

  如果有多表關聯的查詢,則需要自定義mapper,因為返回結果包括多個pojo中的屬性,不建議直接在pojo中添加相應屬性,而應該寫一個繼承某個pojo類的子類,然后在該子類中添加所需的其他pojo中的屬性,這樣返回類型即為該子類。其中查詢的參數為QueryVo類,其中組合了該上述子類和其他子類的對象,需要什么參數就往里寫什么對象。

Spring做的工作:

  appilicatonContext-dao.xml:

    配置dataSource,配置sqlSessionFactory,掃描mapper。

    

<context:property-placeholder location="classpath:db.properties" />
    
    <!-- 配置數據源dataSource -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driver}"  />
        <property name="jdbcUrl" value="${jdbc.url}"  />
        <property name="user" value="${jdbc.username}"  />
        <property name="password" value="${jdbc.password}"  />
    </bean>
    
    <!-- 配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
    </bean>
    
    <!-- 掃描mapper -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.kk.ssm.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

    其中掃描mapper后,則不必再mybatis的配置文件(sqlMapConfig.xml)中進行掃描。且該掃描為每個mapper接口生成了代理對象,注入了sqlSessionFactory對象。需要注意的是 掃描mapper的bean標簽中的第二個property標簽 name為sqlSessionFactoryBeanName,后面應該是value而不是ref。

如果name為sqlSessionFactory,則會使上面的db.properties讀取不出來。

  applicationContext-service.xml

     把service的實現類 通過bean標簽注入進去即可。

 

<bean id="itemsService" class="com.kk.ssm.service.impl.ItemsServiceImpl" />    

  

  applicationContext-transaction.xml

    事務管理,相比注解的方式來說,配置XML的方式能使方法的名稱更加規范。

  

<!-- 事務管理器 -->
<
bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name=
  "dataSource"
ref="dataSource"></property> </bean>
   <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="find*" propagation="SUPPORTS" read-only="true"/> <tx:method name="get*" propagation="SUPPORTS" read-only="true"/> <tx:method name="select*" propagation="SUPPORTS" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.kk.ssm.service.impl.*.*(..))"/> </aop:config>

 

  springmvc.xml  

    掃描controller,配置處理器映射器,處理器適配器和視圖解析器

   

<!-- 掃描controller -->
    <context:component-scan base-package="com.kk.ssm.controller" />
    
    <!-- 自動裝配處理器映射器和處理器適配器 和其他的 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    
    <!-- 配置視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前綴 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 后綴 -->
        <property name="suffix" value=".jsp"/>
    </bean>

     

    因為這是在學springmvc的時候做的整合工作,故還有一些一般項目都會用到的spirngmvc框架功能配置在springmvc.xml中:

    校驗器,全局異常處理器,文件上傳,攔截器

    

<!-- 校驗器 -->
    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <!-- hibernate校驗器-->
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
        <!-- 指定校驗使用的資源文件,在文件中配置校驗錯誤信息,如果不指定則默認使用classpath下的ValidationMessages.properties -->
        <property name="validationMessageSource" ref="messageSource" />
    </bean>
    <!-- 校驗錯誤信息配置文件 -->
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <!-- 資源文件名-->
        <property name="basenames">   
            <list>    
            <value>classpath:CustomValidationMessages</value> 
            </list>   
        </property>
        <!-- 資源文件編碼格式 -->
        <property name="fileEncodings" value="utf-8" />
        <!-- 對資源文件內容緩存時間,單位秒 -->
        <property name="cacheSeconds" value="120" />
    </bean>    
    
    <!-- 全局異常處理器 -->
    <bean class="com.kk.ssm.exception.CustomExceptionResolver"></bean>
    
    <!-- 文件上傳 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 設置上傳文件的最大尺寸為5MB -->
        <property name="maxUploadSize">
              <value>5242880</value>
        </property>
    </bean>
    
    <!-- 攔截器配置 -->
    <mvc:interceptors>
    <!--多個攔截器,順序執行 -->
    <!-- 登陸認證攔截器 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.kk.ssm.interceptor.LoginInteceptor"></bean>
    </mvc:interceptor>
    </mvc:interceptors>
    

 

 

mybatis工作:sqlMapConfig.xml:

  一些全局的settings,別名的設置。

  

<typeAliases>
        <package name="com.kk.mybatis.po"/>
</typeAliases>

 

web.xml:

  配置springmvc的前端控制器,springmvc配置文件的位置,加載spring容器。

  

<!-- springmvc前端控制器 -->
  <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      
  <!-- 配置springmvc加載的配置文件的位置 -->
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring/springmvc.xml</param-value>
      </init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>*.action</url-pattern>
  </servlet-mapping>
  
  <!-- 加載spring容器 -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/classes/spring/applicationContext-*.xml</param-value>
  </context-param>
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

 

log4j.properties:

  

# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

 

db.properties:

  

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/mybatis?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

 

 

     

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM