Dict.CN 在线词典, 英语学习, 在线翻译

都市淘沙者

荔枝FM Everyone can be host

统计

留言簿(23)

积分与排名

优秀学习网站

友情连接

阅读排行榜

评论排行榜

struts+spring+hibernate感悟 (转)

三者的结合堪称完美
整合三者关键是配置文件
1.web.xml
用于 web 服务器装载过滤器, servlet ,以及配置文件
struts
在此被装载 org.apache.struts.action.ActionServlet ,还有它的配置参数 config 文件 struts-config.xml spring 在此被装载 org.springframework.web.context.ContextLoaderServlet 还有它的配置文件 applicationContext.xml ,其他省略不列出
例子:
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
 </context-param>
 <servlet-name>action</servlet-name>
  <servlet-class>
   org.apache.struts.action.ActionServlet
  </servlet-class>
  <init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/struts-config.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet>
  <servlet-name>context</servlet-name>
  <servlet-class>
   org.springframework.web.context.ContextLoaderServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <!-- Action Servlet Mapping -->
 <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>
2.struts-config.xml 这个文件

这个是 strust 专有配置文件,配置 form, 全局转发, action,message-resources( 用于显示提示信息 ) ,插件
格式如下:
<struts-config>
 <form-beans>
  <form-bean name="logonform" type="com.binghe.forms.LogonForm" />
  .....
</form-beans>
<global-forwards>
  <forward name="logon" path="/login.jsp" />
  .......
</global-forwards>
<action-mappings>
  <action path="/logon"
   type="org.springframework.web.struts.DelegatingActionProxy" name="logonform"
   input="/login.jsp" scope="request" validate="true">
   <forward name="logon" path="/login.jsp" />
   .....
  </action>
  ......
</action-mappings>
<controller locale="true" />
<message-resources parameter="com.binghe.struts.ApplicationResources" />
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
  <set-property property="pathnames"
   value="/WEB-INF/validator-rules.xml,
                            /WEB-INF/validation.xml" />
 </plug-in>
 <plug-in
  className="org.springframework.web.struts.ContextLoaderPlugIn">
  <set-property property="contextConfigLocation"
   value="/WEB-INF/applicationContext.xml" />
 </plug-in>
</struts-config>
3.applicationContext.xml.xml 
这个是 spring 的专有配置文件,里面配置代理 hibernate 资源和 struts
action
格式如下:

<beans>
 <bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource"
  destroy-method="close">
  <property name="driverClassName">
   <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
  </property>
  <property name="url">
   <value>jdbc:microsoft:sqlserver://127.0.0.1:1400;DatabaseName=books</value>
  </property>
  <property name="username">
   <value>sa</value>
  </property>
  <property name="password">
   <value>123</value>
  </property>
 </bean>

 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref local="dataSource" />
  </property>
  <property name="mappingResources">
   <list>
    <value>
     com/binghe/hibernate/booktype/BookType.hbm.xml
    </value>
    <value>
     com/binghe/hibernate/book/Book.hbm.xml
    </value>
  </list>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.SQLServerDialect
    </prop>
    <prop key="hibernate.show_sql">false</prop>
   </props>
  </property>
 </bean>
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory">
   <ref local="sessionFactory" />
  </property>
 </bean>
 <bean id="bookTypeDAO"
  class="com.binghe.spring.booktype.BookTypeDAOImp">
  <property name="sessionFactory">
   <ref local="sessionFactory" />
  </property>
 </bean>
 <bean id="bookDAO"
  class="com.binghe.spring.book.BookDAOImp">
  <property name="sessionFactory">
   <ref local="sessionFactory" />
  </property>
  <property name="bookTypeDAO">
   <ref bean="bookTypeDAOProxy" />
  </property>
 </bean>
   <bean id="bookTypeDAOProxy"
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager">
   <ref bean="transactionManager" />
  </property>
  <property name="target">
   <ref local="bookTypeDAO" />
  </property>
  <property name="transactionAttributes">
   <props>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="delete*">PROPAGATION_REQUIRED</prop>
    <prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
 </bean>
 <bean id="bookDAOProxy"
  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager">
   <ref bean="transactionManager" />
  </property>
  <property name="target">
   <ref local="bookDAO" />
  </property>
  <property name="transactionAttributes">
   <props>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="delete*">PROPAGATION_REQUIRED</prop>
    <prop key="zhuxiao*">PROPAGATION_REQUIRED</prop>
    <prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
 </bean>
  <bean name="/booktype"
  class="com.binghe.struts.action.booktype.BookTypeAction"
  singleton="false">
  <property name="bookTypeDAO">
   <ref bean="bookTypeDAOProxy" />
  </property>
 </bean>
 <bean name="/book"
  class="com.binghe.struts.action.book.BookAction"
  singleton="false">
  <property name="bookDAO">
   <ref bean="bookDAOProxy" />
  </property>
 </bean>
 </beans>
4.hibernate 的配置文件为 POJOClassName.bhm.xml POJOClassName 是你定义的一个 javabean ,你可以把这个配置文件放在和 pojobean 一个目录下,也可以放在其他目录,然后引用,格式如下:

<hibernate-mapping package="com.binghe.hibernate.reader">
 <class name="Reader" table="reader" lazy="false">
  <id name="id" column="id" type="integer">
   <generator class="native" />
  </id>
  <property name="code" column="code" type="string"
   not-null="false" />
  <property name="name" column="name" type="string"
   not-null="false" />
  <property name="userId" column="userid" type="integer"
   not-null="false" />
  <property name="typeId" column="typeid" type="integer"
   not-null="false" />
  <many-to-one name="user" class="com.binghe.utils.UserBean"
   insert="false" update="false">
   <column name="userid" />
  </many-to-one>
  <many-to-one name="readerType"
   class="com.binghe.hibernate.readertype.ReaderType" insert="false"
   update="false">
   <column name="typeid" />
  </many-to-one>
  <set name="borrowBills" lazy="false"
   inverse="true" cascade="none">
   <key column="readerid" />
   <one-to-many
    class="com.binghe.hibernate.borrowbill.BorrowBill" />
  </set>
</hibernate-mapping>
上面的所有配置信息是我从自己做的一个项目中抽取出来的

spring 中的依赖注入 / 控制反转是不错的,你可以定义任何接口,然后实现接口里面的方法,通过 spring 的配置文件把你的接口注入到任何地方,前提是你引用的必须是接口,在引用的地方必须有接口定义以及 getter 方法,不过你可以把这个接口当作类似 javabean 的一个属性一样来使用, javabean 都有 getter setter 方法的
spring
里面的事务代理也挺挺不错的
<property name="target">
   <ref local="bookTypeDAO" />
</property>
target 它是指向要注入的类,代理这个类所实现的接口
<property name="transactionAttributes">
   <props>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="delete*">PROPAGATION_REQUIRED</prop>
    <prop key="check*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
transactionAttributes 是对所代理的方法哪些方法提供事务,比如你定义一个以 add 开头的方法,那它就可以有事务管理了,对于它里面的所有操作,都可以实现事务机制,若有异常就回滚事务
hibernate
的映射机制是 orm ,面向对象的数据库查询,查询时必须提供查询类(如 find 方法 "from Book"hql 语句中的 Book 不是表名而是类名),以得到它的实例,对应数据库的 javabean 的属性必须都是对象型的, int double 必须定义为 Integer Double 类型,映射表有个 lazy 属性应该设置 false ,不然在查询数据库后加载一条记录时会报错。一对多双相关联:
一对多映射,复杂
<set name="borrowBills" lazy="false"
   inverse="true" cascade="none">
   <key column="readerid" />
   <one-to-many
    class="com.binghe.hibernate.borrowbill.BorrowBill" />
  </set>
cascade 属性不好用,如果有删除记录操作时我都把它设置成 none 值,双方都要设置,否则报错,因为没法相互通知

多对一映射,简单
<many-to-one name="name" type="com.ClassName" update="false" insert="false">
<column name="nameId" />
</many-to-one>
  

posted on 2007-02-02 09:19 都市淘沙者 阅读(272) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: