Hibernate、Spring、Struts、DWR 配置 复习学习

 

HibernateSpringStrutsDWR 配置 复习学习

<!--[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>

1hibernate 通过DBCP方式 tomcat中配置jdbc连接 与连接池(绑定到JNDI上)

2hibernate的配置文件的名字叫做 hibernate.cfg.xml

3一般的映射类文件名为 xxx.hbm.xml

4类映射文件名 配置在 hibernate.cfg.xml文件中

5hibernate.cfg.xml主要配置 hibernatesession-factory工厂 ,工厂中可以配置数据源和数据库XML文件的映射

6多数据库配置时可以配置多个hibernate.cfg.xml文件 包含hibernateConfigsessionfactory

名词 POJO plain old java object)简单Java对象

7sessionFactory是单例; 它可以打开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

14hibernate SQL方言 (hibernate.dialect)

15hibernate事务配置

<property name="hibernate.transaction.JDBCTransactionFactory">(默认JDBC事务)

或者 hibernate.Transaction.JTATransactionFactory

15绑定SessionFactoryJNDI   使用 hibernate.session_factory_name配置

可以简化查找工厂和创建新的session

16记录日志 classpath中引入log4j.properties文件

17创建多sessionFactory

SessionFactory sf = new Configration.getConfig("不同的hibernate.cfg.xml文件名").buildSeesionFactory();

18POJO持久化类需要有默认的构造器,可以设置hibernate回调方法(实现Liftcycle接口),onSaveonUpdateonDeleteonLoad,可以设置检查(实现Validateble接口),方法:validate

19乐观锁和悲观锁 悲观锁对数据永远处于独占的处理;乐观锁通过version进行检查,当更新数据时version版本较高时可以更新,否则将认为是过期数据不予更新。

乐观锁策略:version(常用)检查version字段、all检查所有字段、dirty检查修改过的字段、none不检查

20id生成策略:generator 10 (常用的有sequencenativeuuid

21设置联合主键 composite-id 类必须重载equalshashcode方法与实现序列号接口

hibernate查询数据 load方式属于延时加载、get方式即时加载

22关联映射

         1、多对一(即在多的一方添加主键)many-to-one

                   <many-to-one name="group" column="groupId" cascade="save-update"/>

                   group:多大一方添加的类对象,groupId对应Group类的外键

                   程序保存对象时先要保存一的一方(除非设置了级联cascadeall/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中添加配置,同之前单向,对应的表字段名相应调整即可。

 

23Servlet中获得SessionFactory

SessionFactory sf = SessionFactorygetServletContext().getAtrribute("my.session.factory")

24session操作非线程安全, 执行后需要刷新、提交和关闭session

session.flush();         session.commit();    session.close();

<!--[if !supportLists]-->第二部           Spring 配置 复习学习

Spring 优点降低耦合度 集成多种功能(如hibernatestrauts、事务)

1控制反转(IOC 即由外部容器负责创建和维护对象

2依赖注入(CI 即运行时由外部容器动态的创建对象

3面向切面 AOP

4实例化spring容器

ApplicationContext acx = new ClassPathXmlApplicationContex(new String[]{"配置文件名",""})

5spring管理bean的配置

<bean id="唯一值" class="实现类">

使用时直接从spring容器中获取即可 如:acx.getBean("spring容器中的id")

6bean实例的作用域

<bean id="唯一值" name="id作用相同,可以添加特殊字符如/"  class="实现类" scope="实例类型(单例或多例)">//默认单例、propoType(每次新实例)

7lazy-init延时加载, init-method设置初始化方法,destory-method设置销毁加载方法

8spring的注入方式有构造器注入、get/set方法注入、注解方式

Bean中的属性注入<property name="属性名" ref="注入的beanid">

9使用注入方式注入基本类型的默认值

<property name="基本类型属性名" value="默认值">

10setlistmapproperties类型注入

--=====================================================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 />

12spring注解注入      包含autowrite resource

13spring自动装配      bean后添加属性autowrite(按:类型、名称、构造器)

14spring自动扫描classpath Spring2.5开始提供)

         <context:component-scan base-packag="路径" >

         通过注解进行类注入@Component(组件)、@Service(业务组件)@Controller(控制组件)、@Repositorydao组件)、@Scope(作用域)

15AOP 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="切面类beanid " class=""/>

2、配置

<aop:config>

         <aop:aspect id="" ref="切面类beanid">

                   <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>

 

16spring配置文件加载属性文件

注解方式

<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>

 

17Spring配置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>

 

18Spring集成hibernate

<!--配置hibernatesessionfactory-->

<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)

业务类可通过注入方式获取hibernatesessionfactory

19Spring集成Struts 1struts 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业务类获取springapplicationContext,当spring管理action后,业务类中便不用编写以下代码,直接通过spring的注入方式便可对业务类中各属性对象进行操作。

WebApplicationContext act =

 WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());

 

20spring集成struts 2struts 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>

 

21spring处理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 配置 复习学习

1struts 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>

 

2struts 2 配置

struts2的配置文件struts.xml必须放置在classes目录下

3struts 2 action类文件可以是POJO,也可以继承SupportAction获得更好的支持

4struts 2 拥有较强大的标签库 OGNL

5struts.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>

2dwr.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改为springname值改为beanNamevalue的值改为纳 spring管理beanid-->

        <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>

 

你可能感兴趣的:(Hibernate、Spring、Struts、DWR 配置 复习学习)