• Spring学习笔记


    1. Spring对Hibernate的集成

    Datasourse的构建 采用Spring Ioc注入 常用的数据库连接池为

    DHCP org.apache.commons.dbcp.BasicDataSource

    c3p0  com.mchange.v2.c3p0.ComboPooledDataSource

    例如:

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="${hibernate.connection.driver_class}"/>
            <property name="jdbcUrl" value="${hibernate.connection.url}"/>
            <property name="user" value="${hibernate.connection.username}"/>
            <property name="password" value="${hibernate.connection.password}"/>
            <!--  <property name="checkoutTimeout" value="30000"></property> --> 
            <property name="idleConnectionTestPeriod" value="${c3p0.idleTestPeriod}"></property> 
            <property name="initialPoolSize" value="${c3p0.initialPoolSize}"></property> 
            <property name="maxIdleTime" value="${c3p0.maxIdleTime}"></property>
            <property name="minPoolSize" value="${c3p0.minPoolSize}"></property>
            <property name="maxPoolSize" value="${c3p0.maxPoolSize}"></property> 
        </bean>

    sessionFactory的构建

     org.springframework.orm.hibernate3.LocalSessionFactoryBean是在Spring中配置和获取sessionFactory的最常用方式,构建时使用的是

     容器中已经构建好的datasource

     org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean就是为那些通过注解获取映射信息的sessionFactory的配置以及

    构建而准备的,该类是在LocalSessionFactoryBean基础上构建的,提供了额外的配置项,如annotatedClasses 、 annotatedPackages、packagesToScan

     

    HibernateDaoSupport 提供了一个基于HibernateTemplate的DAO基类

    因为hibernateDaoSupport中setSessionFactory()方式是final的, 不能被重写 , 但是可以在继承hibernateDaoSupport的子类中加入一个方法为SessionFactory注入值

    代码如下:

    @Resource(name = "sessionFactory")
    public void setSuperSessionFactory(SessionFactory sessionFactory){
    super.setSessionFactory(sessionFactory);
    }

    2. Spring对Ibatis的集成

    通过org.springframework.orm.ibatis.SqlMapClientFactoryBean 获得SqlMapClient的实例

    然后通过IOC的方式配置sqlMapClientTemplate

    <bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
            <property name="sqlMapClient" ref="sqlMapClient" />
            <property name="dataSource" ref="dataSource" />
     </bean>
        
      <bean id="baseDAO" abstract="true" class="com.lychee.base.BaseDAO">
            <property name="sqlMapClientTemplate" ref="sqlMapClientTemplate" />
       </bean>

     BaseDao继承SqlMapClientDaoSupport 这样就可以通过getSqlMapClientTemplate进行操作了 

    3. Spring MVC 学习

     org.springframework.web.servlet.DispatcherServlet 即负责接受web 请求,当web请求到达后Dispatch将寻求具体

    的HandingMapping 实例,以获取当前web请求的具体处理类,然后进行处理,最好返回一个ModeAndlView视图

    web.xml 的配置 

    <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    ContextLoaderListener为整个web应用加载顶层的WebApplicationContent,该WebApplicationContent默认所加载的配置文件为WEB-INF/applicationContext.xml,
    但是我们一般不会使用默认路径,因为应用中我们要根据不同的模块管理不同的配置文件,所以我们可以更改默认的加载路径,在web.xml中添加如下配置
    <context-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:applicationContext*.xml</param-value>
    </context-param>

    这时系统加载完毕后会将WebApplicationContent绑定到ServletContext中,所以我们就可以在程序中获得ServletContext中的WebApplicationContent,

    常用的方式如:

    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);

    这样我们就可以创建我们自己的listener,并且可以从WebApplicationContent获取我们想要的信息。

    然后是SpringMVC的配置

       <servlet>
             <servlet-name>exam</servlet-name>
             <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        </servlet>
         <servlet-mapping>
             <servlet-name>exam</servlet-name>
             <url-pattern>/</url-pattern>
        </servlet-mapping>

    类似于Struts2 ,Spring mvc也需要一个类似于struts.xml的配置文件,不过该配置文件有一定的规则,默认路径当然也是WEB-INF/目录下

    命名要遵照xxx-servlet.xml,xxx为上面配置信息中的<servlet-name>名字,即为exam-servlet.xml,该文件的作用是配置基于Spring MVC框架

    的web应用程序所需的各种web组件。

    DispatchServlet启动之后会加载xxx-servlet.xml 文件,并构建自己的WebApplicationContext,该WebApplicationContext将之前通过ContextLoaderListene加载的WebApplicationContent作为父容器,如下图

    由于单一的xxx-servlet.xml不太方便,我们需要分割开来,所以我们将可以在DispatchServlet中设置contextConfigLocation,

    指定多个文件,如下:

    <servlet>
          <servlet-name>exam</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
           <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>classpath:applicationContext-mvc.xml,applicationContext-servlet.xml</param-value>
            </init-param>
           <load-on-startup>1</load-on-startup>
       </servlet>

     web.xml中也可以配置org.springframework.web.filter.CharacterEncodingFilter统一编码,不过要放在DispatcherServlet之前

        <filter>
            <filter-name>encodingFilter</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>
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
    
        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>*.json</url-pattern>
        </filter-mapping>
        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>*.do</url-pattern>
        </filter-mapping>

    下面我们来看下xxx-servlet的配置信息

    org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping 是默认的handlerMapping,它将根据请求的url和配置文件中定义的bean

    的name进行匹配,进行请求的处理。

    然后我们就要配置对view处理的ViewResolver,org.springframework.web.servlet.view.InternalResourceViewResolver为JST/JSTL视图技术实现,同样

    你也可以选择其他的模板技术如freemarker

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/" />
            <property name="suffix" value=".jsp" />
     </bean>

    采用以上配置InternalResourceViewResolver就会需要[prefix]+viewname+[suffix]的视图模板文件。

    3.关于HandlerMapping学习 

    上面介绍了org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping下面来介绍另一HandlerMapping

    org.springframework.web.servlet.handler.SimpleUrlHandlerMapping 

    下面介绍一下它相对于BeanNameUrlHandlerMapping的好处吧 

    BeanNameUrlHandlerMapping强制我们bean的name必须匹配视图的连接地址

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
     <bean name="/toTTRateList.do" class="com.test.controller.TTRateListController">
          <property name="ttRateService" ref="com.test.service.TTRateService"/>
     </bean>

    采用SimpleUrlHandlerMapping 我们可以如下配置

     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
         <property name="mappings">
             <props>
                 <prop key="toTTRateList.do">ttRateListController</prop>
              </props>
           </property>
       </bean>
      <bean name="ttRateListController" class="com.test.controller.TTRateListController">
            <property name="ttRateService" ref="com.test.service.TTRateService"/>
      </bean>

    另外一个好处就是进行模糊匹配

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          <property name="mappings">
             <value>
               toTTRateList.do=ttRateListController
               /*/*List.do=genarateController
             </value>
          </property>
      </bean>
      <bean name="ttRateListController" class="com.test.controller.TTRateListController">
            <property name="ttRateService" ref="com.test.service.TTRateService"/>
     </bean>

      HandlerMapping的执行序列

     我们 可以同时配置多个HandlerMapping,DispatchServlet将会按照配置的优先顺序使用HandlerMapping

      <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
         <property name="order" value="1"></property>
            <property name="mappings">
               <value>
                 toTTRateList.do=ttRateListController
                 /*/*List.do=genarateController
               </value>
            </property>
       </bean>
       <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    没有指定order的话默认为 Integer.MAX_VALUE,值越大的话优先级就越低。

    5.Controller 的体系结构

    .

    使用ParameterMethodNameResolver和代理属性<继承MultiActionController>的例子
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.web.servlet.ModelAndView;
    
    public class ProductController{
     
      public ModelAndView view(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
          response.getOutputStream().print("Viewing");
          return null;
      }
    
      public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception {
          
          response.getOutputStream().print("index");
          return null;
      }
    }
    
    Spring-mvc.xml配置:
    
    <!--配置MultiActionController使用的方法对应策略ParameterMehtodNameResolver,用于解析请求中的特定参数的值,将该值作为方法名调用-->
    <bean id="paramResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
      <property name="paramName" value="method"></property>
     </bean>
    <!--配置MultiActionController,因为使用delegate,所以需要配置delegate和methodNameResolver两个属性,两个属性分别指明该MultiActionController的方法解析策略和delegate-->
     <bean name="/disp.sp" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
         <property name="methodNameResolver" ref="paramResolver"></property>
         <property name="delegate" ref="productController"></property>
     </bean>
    <!--配置MultiActionController所依赖的delegate-->
      <bean id="productController" class="com.wz.xktj.controller.ProductController" />

    6.ModelView

    可用的viewResolver分为两类 面向单一视图类型的ViewResolver和面向对视图类型的ViewResolver

    单一视图的FreeMaker

    <!-- 针对jsp的视图配置 -->
          <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
             <property name="prefix">
                 <value>/WEB-INF/jsp/</value>
             </property>
             <property name="suffix">
                 <value>.jsp</value> 
             </property>
              <property name="order" value="1"/>  
         </bean> 
         <!-- 针对freemarker的视图配置 -->
          <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
            <property name="cache" value="true" />
            <property name="prefix" value="" />
            <property name="suffix" value=".ftl" />
            <property name="contentType" value="text/html;charset=UTF-8"></property>
            <property name="requestContextAttribute" value="request" />
            <property name="exposeSpringMacroHelpers" value="true" />
            <property name="exposeRequestAttributes" value="true" />
            <property name="exposeSessionAttributes" value="true" />
             <property name="order" value="0"/>  
        </bean>
         <!-- 配置freeMarker的模板路径 -->  
        <bean id="freemarkerConfig"
            class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
            <property name="templateLoaderPath" value="/WEB-INF/view/" />
            <property name="freemarkerSettings">
                <props>
                    <prop key="template_update_delay">0</prop>
                    <prop key="default_encoding">UTF-8</prop>
                    <prop key="number_format">0.##########</prop>
                    <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                    <prop key="classic_compatible">true</prop>
                    <prop key="template_exception_handler">ignore</prop>
                </props>
            </property>
        </bean>

    7.基于注解的Controller

    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 和

    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping都会默认在DispatchServlet的

    WebapplicationContext中被注入。

    @RequestParam用于将请求参数区数据映射到功能处理方法的参数上。

    public String requestparam1(@RequestParam(value="name",required="false") String username)

     请求中包含name参数(如/requestparam1?name=zhang),则自动传入,这样就可以将请求参数绑定到新的方法参数上。

     org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping

    (<mvc:annotation-driven/>这个标签注册了Spring MVC分发请求到控制器所必须的DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter实例,貌似和ControllerClassNameHandlerMapping冲突)

    使用CoC,惯例优先原则(convention over configuration)的方式来配置SpringMVC可以帮我们声明Controller的时候省下很多功夫。

    只要我们的Controller是以XXXController的方式命名的话就可以使用到CoC带来的好处。

    例如,对于普通的Controller(非MultiActionController),CoC帮我们做以下的映射:

    HomeController映射到/home*请求URL

    DisplayShoppingCartController映射到/displayshoppingcart*请求URL

  • 相关阅读:
    《STL源码剖析》 stl_multimap.h [转]
    2007元旦粤北山区:英西峰林走廊,小赵州桥
    东师回忆录 之 二舍被拆记
    学生二三事
    2007元旦粤北山区:乳源大峡谷
    元旦粤北骑游计划
    通过配置php来屏蔽PHP错误
    什么是负载平衡
    ORACLE 日期函数大全
    linux 如何运行sh文件
  • 原文地址:https://www.cnblogs.com/heshan664754022/p/3182604.html
Copyright © 2020-2023  润新知