Hibernate、Spring、Struts、DWR 配置 复习学习
<!--[if !supportLists]-->第一部分 Hibernate 配置 复习学习
配置文件概览 hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!—配置Hibernate数据源相关信息-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!—配置Hibernate映射文件-->
<mapping resource="com/hibernate/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
1、hibernate 通过DBCP方式 在tomcat中配置jdbc连接 与连接池(绑定到JNDI上)
2、hibernate的配置文件的名字叫做 hibernate.cfg.xml
3、一般的映射类文件名为 xxx.hbm.xml
4、类映射文件名 配置在 hibernate.cfg.xml文件中
5、hibernate.cfg.xml主要配置 hibernate的session-factory工厂 ,工厂中可以配置数据源和数据库XML文件的映射
6、多数据库配置时可以配置多个hibernate.cfg.xml文件 包含hibernateConfig和sessionfactory
名词 POJO (plain old java object)简单Java对象
7、sessionFactory是单例; 它可以打开session; sessionFactory线程安全 session非线程安全
8、创建 sessionFactory方法
SessionFactory factory = new Configration.config().buildSessionFactory();
9、获取Session factory.getSession(); session使用完需要关闭
10、通过session可以打开Transaction事务 session.beginTranscation();
11、提交事务 transcation.commit();
JTA 容器里的事务、Transaction 事务 、JCA 连接器、JMX (java管理扩展)、
12、通过Configration可以动态配置XML映射文件和porperties配日文件
Configration cfg = new Configration();
cfg.addFile(...);//添加xml映射文件
cfg.addClass(...);//添加xml类映射文件
cfg.setProperties(...);//添加properties属性文件
13、可以使用动态JDBC打开一个Session,同一个连接不能打开两个并行的Session;
14、hibernate SQL方言 (hibernate.dialect)
15、hibernate事务配置
<property name="hibernate.transaction.JDBCTransactionFactory">(默认JDBC事务)
或者 hibernate.Transaction.JTATransactionFactory
15、绑定SessionFactory到JNDI 使用 hibernate.session_factory_name配置
可以简化查找工厂和创建新的session
16、记录日志 在classpath中引入log4j.properties文件
17、创建多sessionFactory
SessionFactory sf = new Configration.getConfig("不同的hibernate.cfg.xml文件名").buildSeesionFactory();
18、POJO持久化类需要有默认的构造器,可以设置hibernate回调方法(实现Liftcycle接口),onSave、onUpdate、onDelete、onLoad,可以设置检查(实现Validateble接口),方法:validate
19、乐观锁和悲观锁 悲观锁对数据永远处于独占的处理;乐观锁通过version进行检查,当更新数据时version版本较高时可以更新,否则将认为是过期数据不予更新。
乐观锁策略:version(常用)检查version字段、all检查所有字段、dirty检查修改过的字段、none不检查
20、id生成策略:generator 10种 (常用的有sequence、native、uuid)
21、设置联合主键 composite-id 类必须重载equals和hashcode方法与实现序列号接口
hibernate查询数据 load方式属于延时加载、get方式即时加载
22、关联映射
1、多对一(即在多的一方添加主键)many-to-one
<many-to-one name="group" column="groupId" cascade="save-update"/>
group:多大一方添加的类对象,groupId对应Group类的外键
程序保存对象时先要保存一的一方(除非设置了级联cascade“all/save-update/delete/none”)。级联:操作一张表的同时操作关联的表
2、一对一 one-to-one(唯一主键关联)
一方的主键策略使用foreign <param name="property">另一方主键</param>
<one-to-one name="另一方类对象"/>
保存时要保存设置foreign的一方
(双向主键关联)双方都添加<one-to-one name="另一方类对象"/>
<one-to-one>对数据存储的方向不起作用,必须要保存设置foreign的一方
(唯一外键关联)即多对一的特殊情况 需在many-to-one 中添加unique="true"
unique=true是指这个字段的值在多的一方不能重复,所有记录值都要唯一
(双向外键关联)
在唯一外键配置的前提下在另一方配置<one-to-one>
添加property-ref="对方表外键字段名" 即可
3、一对多 (即在多的一方添加主键) one-to-many
(单向)一的一方添加set对象集
<set name="set对象名">
<key column="另一方表中字段名">//(此字段不能设置为非空)
<one-to-many class="另一方类名">
</set>
(双向)在添加单向一对多的前提下
在多的一方添加<many-to-one name="" column="指向与一对多相同的表字段名">
只使多的一方为何关系,在一的一方添加反转属性,此属性只影响存储
<set name="set对象名" inverse="true">// inverse反转控制
4、多对多 (即增加中间表) many-to-many
(单向)在一方添加set对象集
<set name="set对象名" table="中间表名">
<key column="与中间表对应的表字段名">
<many-to-many class="另一方类名" column="中间表的另一表字段名">
</set>
(双向)在单向的前提下 在另一方类中添加set对象集
在该类的xxx.hbm.xml中添加配置,同之前单向,对应的表字段名相应调整即可。
23、在Servlet中获得SessionFactory
SessionFactory sf = (SessionFactory)getServletContext().getAtrribute("my.session.factory")
24、session操作非线程安全, 执行后需要刷新、提交和关闭session
session.flush(); session.commit(); session.close();
<!--[if !supportLists]-->第二部分 Spring 配置 复习学习
Spring 优点降低耦合度 集成多种功能(如hibernate、strauts、事务)
1、控制反转(IOC) 即由外部容器负责创建和维护对象
2、依赖注入(CI) 即运行时由外部容器动态的创建对象
3、面向切面 (AOP)
4、实例化spring容器
ApplicationContext acx = new ClassPathXmlApplicationContex(new String[]{"配置文件名",""})
5、spring管理bean的配置
<bean id="唯一值" class="实现类">
使用时直接从spring容器中获取即可 如:acx.getBean("spring容器中的id名")
6、bean实例的作用域
<bean id="唯一值" name="与id作用相同,可以添加特殊字符如/" class="实现类" scope="实例类型(单例或多例)">//默认单例、propoType(每次新实例)
7、lazy-init延时加载, init-method设置初始化方法,destory-method设置销毁加载方法
8、spring的注入方式有构造器注入、get/set方法注入、注解方式
Bean中的属性注入<property name="属性名" ref="注入的bean的id">
9、使用注入方式注入基本类型的默认值
<property name="基本类型属性名" value="默认值">
10、set、list、map、properties类型注入
--=====================================================set
<property name="属性名">
<set>
<value>集合值1</value>
<value>集合值2</value>
</set>
</property>
--=====================================================list 同set注入 只需将set标签改为list即可
--=====================================================properties
<property name="属性名">
<props>
<value key="key1">值1</value>
<value key="key2">值2</value>
</props>
</property>
--=====================================================map
<property name="属性名">
<map>
<entry key="key1">值1</value>
<entry key="key2">值2</value>
</map>
</property>
11、构造器注入配置
<bean id="" class="">
<constructor-arg index="构造器参数位置" type="属性类路径" ref="纳入spring管理的beanID"/>//此种方式适用于自定义对象
<constructor-arg index="构造器参数位置" value="基本类型值"/>//此种方式适用于基本类型
</bean>
Spring配置文件中开启注解方式 添加<context:annotation-config />
12、spring注解注入 包含autowrite 、resource、
13、spring自动装配 在bean后添加属性autowrite(按:类型、名称、构造器)
14、spring自动扫描classpath (Spring2.5开始提供)
<context:component-scan base-packag="路径" >
通过注解进行类注入@Component(组件)、@Service(业务组件)、@Controller(控制组件)、@Repository(dao组件)、@Scope(作用域)
15、AOP xml配置方式、注解方式
Spring——AOP(面向切面)
一、Spring 注解方式实现AOP
1、配置
a、引入命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
b、开启AOP配置
<aop:aspectj-autoproxy/>
c、各业务及操作类需纳入Spring管理
2、注解类
@Aspect //AOP切面
public Class AOP切面类{
@Pointcut("execution(* 请求AOP操作的业务类路径.*(..))") //切入点(切入方法)
//*1返回类型任意、*2方法名任意、..参数任意
public void 切入点方法(){}
@Before("切入点方法名") //前置通知
//@Before("切入点方法名 && args(参数名)") //截获业务方法传人参数的前置通知
//在前置通知中 参数名即为业务方法中传人的参数,无需参数时参数可省略
public void doBefore(String 参数名){}
@AfterReturning("切入点方法名") //后置通知
//业务方法有返回值的后置通知
//@AfterReturning(pointcut="切入点方法名",returning="参数名")
//参数名即为业务方法返回的类型值作为后置通知的传人参数,无需参数时参数可省略
public void doAfterReturning(String 参数名){}
@After("切入点方法名") //最终通知
public void doAfte(){}
@AfterThrowing("切入点方法名") //异常通知
//@AfterThrowing(pointcut="切入点方法名",throwing="e") //截获异常的异常通知
//无需参数时参数可省略
public void doAfterThrowing(Exception e){}
@Around("切入点方法名") //环绕通知
//格式固定、各参数及返回类型固定、必须进行proceed方法
public Object doAround(ProceedingJoinPoint pjp)throws Throwable {
Object result = pjp.proceed();
return result
}
}
二、Spring 配置方式实现AOP
1、切面类纳入Spring管理
<bean id="切面类bean的id " class=""/>
2、配置
<aop:config>
<aop:aspect id="" ref="切面类bean的id">
<aop:pointcut id="切入点id" expression="execution(* 请求AOP操作的业务类路径.*(..))"/>
<aop:before pointcut-ref="切入点的id" method="前置通知方法名"/>
<aop:after-returning pointcut-ref="切入点的id" method="后置通知方法名"/>
<aop:after-throwing pointcut-ref="切入点的id" method="异常通知方法名"/>
<aop:after pointcut-ref="切入点的id" method="最终通知方法名"/>
<aop:around pointcut-ref="切入点的id" method="环绕通知方法名"/>
</aop:aspect>
</aop:config>
16、spring配置文件加载属性文件
注解方式
<context:property-placeholder location="classpath:properties属性文件名"/>
配置方式
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>properties属性文件名</value>
</list>
</property>
</bean>
17、Spring配置JDBC
配置数据源
<bean id="dataSource" class="org.apach.commons.dbcp.BasicDateSource" destory-method="close">
<property name="driverClassName" value=""/>
<property name="url" value=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</bean>
18、配置事务————注解方式
<bean id="txManager"
class="org.springframework.jdbc.datasource.DateSourceTranscationManager" >
<property name="dataSource" ref="dataSource">
</bean>
<!--配置注解处理器 -->
<tx:annotation-driven transaction-manager="txManager" />
配置命名空间
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
操作类实现
将数据源注入到操作类中,操作类可以定义jdbcTemplate对象操作数据源。
在操作类前添加注解符@Transactional,此操作类中所有方法将利用spring提供的事务进行管理
此事务默认在运行时异常时进行回滚操作
配置事务————配置方式
<bean id="txManager"
class="org.springframework.jdbc.datasource.DateSourceTranscationManager" >
<property name="dataSource" ref="dataSource">
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="方法名前缀*" read-only="true" />
<!--可进行回滚的异常-->
<tx:method name="方法名前缀*" rollback-for="Exception"/>
<!--不进行回滚的异常-->
<tx:method name="方法名前缀*" no-rollback-for="Exception" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="切入点id" expression="execution(* 请求AOP操作的业务类路径.*(..))"/>
<aop:advisor pointcut-ref="切入点的id" advice-ref="txAdvice"/>
</aop:config>
18、Spring集成hibernate
<!--配置hibernate的sessionfactory-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<!--配置hibernate的数据源-->
<property name="dataSource" ref="dataSource"/>
<!--配置hibernate的映射文件-->
<!--
<property name="mappingResources">
<list>
<value>com/hibernate/tables/SYSUSERS.hbm.xml</value>
</list>
</property>
-->
<property name="mappingLocations">
<!--**表示包含所有子路径,*表示所有文件名-->
<value>classpath:映射文件路径/**/*.hbm.xml</value>
</property>
<!--配置hibernate操作数据库的各属性-->
<property name="hibernateProperties">
<value>
hibernate.dialect=数据库方言
hibernate.show_sql=true
hibernate.format_sql=true
</value>
</property>
</bean>
<!--配置事务管理器(hibernate)-->
<bean id="txManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
配置事务管理器——注解方式
<tx:annotation-driven transaction-manager="txManager"/>
配置事务管理器——配置方式(AOP)
业务类可通过注入方式获取hibernate的sessionfactory
19、Spring集成Struts 1(struts 1 通过servlet方式添加到容器中)
在web.xml文件中添加spring的监听,以便通过容器监听器实例spring
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>spring配置文件名,多文件时可用","分隔</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
将action纳入spring管理
spring配置
<bean name="spring管理的actionID" class="action类文件名"/>
struts配置(struts-config.xml)
<action path="spring管理的actionID"></action>
<!--添加spring控制器-->
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
在action业务类获取spring的applicationContext,当spring管理action后,业务类中便不用编写以下代码,直接通过spring的注入方式便可对业务类中各属性对象进行操作。
WebApplicationContext act =
WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());
20、spring集成struts 2(struts 2 通过filter方式添加到容器中)
在web.xml文件中添加以下内容
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
spring配置
<bean name="spring管理的actionID" class="action类文件名"/>
struts配置(struts2配置文件名为:struts.xml)
在struts.xml文件中添加
<!--spring控制器,表示其中所有action全部由spring负责创建管理-->
<constant name="struts.objectFactory" value="spring" />
<package name="chapter1" namespace="/命名空间名" extends="struts-default">
<action name="action_*" class="spring管理的actionID" method="{1}">
<result name="success">/WEB-INF/index.jsp</result>
</action>
</package>
21、spring处理struts1中的乱码问题(通过filter过滤器)
在web.xml文件中加入
<filter>
<filter-name>Encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilte</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
第三部分 Struts 配置 复习学习
1、struts 1 配置 参见http://zht1933.iteye.com/blog/1176252
Web.xml文件配置 集成struts 1
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.appache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
struts-config.xml文件配置
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<!--type:继承ActionForm的实现类 -->
<form-bean name="logonForm" type="com.zht.struts.LoginActionForm" />
</form-beans>
<action-mappings>
<!--path:访问路径,type:继承Action的实现类,
name:对ActionForm的引用,scope:请求的作用域,默认为session -->
<action path="/login"
type="com.zht.struts.LoginActon"
name="logonForm"
scope="request">
<forward name="success" path="/success.jsp" />
<forward name="error" path="/error.jsp" />
</action>
</action-mappings>
</struts-config>
2、struts 2 配置
struts2的配置文件struts.xml必须放置在classes目录下
3、struts 2 action类文件可以是POJO,也可以继承SupportAction获得更好的支持
4、struts 2 拥有较强大的标签库 OGNL
5、struts.xml配置文件默认继承struts-default
第四部分 DWR 配置 复习学习
1、集成DWR配置
在web.xml文件中添加
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<!--用于拦截 http://localhost:8080/dwr-->
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
2、在dwr.xml配置文件中添加
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<!--将JavaBean转换为Js页面可直接使用的bean对象,对象名为javascript中设置的名字-->
<convert converter="bean" match="com.kerryeas.dto.*" />
<convert converter="bean" javascript="Customer" match="com.kerryeas.model.Customer" />
<!--在与spring集成后 new改为spring,name值改为beanName,value的值改为纳 入spring管理bean的id-->
<create creator="new" javascript="js中使用的名字">
<param name="class" value="dwr类路径及文件名" />
</create>
</allow>
</dwr>
第五部分 Spring 配置 补充
Spring定时器配置
1、文件名:applicationContext-quartz.xml
2、内容:
<bean id="定时任务类beanID" class="定时器调用的类路径及类名" />
<bean id="定时任务调用方法ID"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="定时任务类beanID"></property>
<!—设置定时任务调用的方法-->
<property name="targetMethod" value="调用的方法名"></property>
<property name="concurrent" value="false"></property>
</bean>
(配置方式1——定时启动)
<bean id="Spring定时任务id"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail"
ref="定时任务调用方法ID">
</property>
<!—设置确定启动定时任务的时间-->
<property name="cronExpression">
<value>0 10 2 * * ?</value>
</property>
</bean>
(配置方式2——循环启动)
<!—设置循环启动定时任务的间隔时间-->
<bean id="Spring定时任务id"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="定时任务调用方法ID"></property>
<!—延迟时间(单位毫秒)-->
<property name="startDelay" value="6000"></property>
<!—间隔时间(单位毫秒)-->
<property name="repeatInterval" value="1800000" />
</bean>
注意:方式1与方式2所使用的Spring提供的class类文件不同,且配置方式不同
3、配置定时启动任务列表
<bean id="startQuertz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!—延迟时间(单位秒)-->
<property name="startupDelay" value="10" />
<property name="triggers">
<list>
<ref bean="Spring定时任务id" />
</list>
</property>
</bean>