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