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

原文地址:https://www.cnblogs.com/heshan664754022/p/3182604.html