zoukankan      html  css  js  c++  java
  • 第一次整合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
    #u5728u5f00u53d1u73afu5883u4e0bu65e5u5fd7u7ea7u522bu8981u8bbeu7f6eu6210DEBUGuff0cu751fu4ea7u73afu5883u8bbeu7f6eu6210infou6216error
    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

         

      

  • 相关阅读:
    poj 2516 Minimum Cost (最小费用流 )
    new start
    关于c语言中的声明和定义
    多态性与虚函数之对象切片
    C专家编程之typedef
    QGroupBox设置边框
    多态性与虚函数之继承中的virtual 晚捆绑
    使用Map
    遍历控件
    C专家编程之枚举
  • 原文地址:https://www.cnblogs.com/kkkkkk/p/5492222.html
Copyright © 2011-2022 走看看