struts+spring+hibernate感悟 (轉(zhuǎn))
三者的結(jié)合堪稱完美
整合三者關(guān)鍵是配置文件
1.web.xml 用于 web 服務(wù)器裝載過濾器, servlet ,以及配置文件
struts 在此被裝載 org.apache.struts.action.ActionServlet ,還有它的配置參數(shù) 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>
整合三者關(guān)鍵是配置文件
1.web.xml 用于 web 服務(wù)器裝載過濾器, servlet ,以及配置文件
struts 在此被裝載 org.apache.struts.action.ActionServlet ,還有它的配置參數(shù) 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 這個(gè)文件
這個(gè)是 strust 專有配置文件,配置 form, 全局轉(zhuǎn)發(fā), 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?
這個(gè)是 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>
??<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 這個(gè)文件
這個(gè)是 strust 專有配置文件,配置 form, 全局轉(zhuǎn)發(fā), 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?
這個(gè)是 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>
???<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>
??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 是你定義的一個(gè) javabean ,你可以把這個(gè)配置文件放在和 pojobean 一個(gè)目錄下,也可以放在其他目錄,然后引用,格式如下:
<hibernate-mapping package="com.binghe.hibernate.reader">
??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 是你定義的一個(gè) javabean ,你可以把這個(gè)配置文件放在和 pojobean 一個(gè)目錄下,也可以放在其他目錄,然后引用,格式如下:
<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>
??<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>???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>
上面的所有配置信息是我從自己做的一個(gè)項(xiàng)目中抽取出來的
spring 中的依賴注入 / 控制反轉(zhuǎn)是不錯(cuò)的,你可以定義任何接口,然后實(shí)現(xiàn)接口里面的方法,通過 spring 的配置文件把你的接口注入到任何地方,前提是你引用的必須是接口,在引用的地方必須有接口定義以及 getter 方法,不過你可以把這個(gè)接口當(dāng)作類似 javabean 的一個(gè)屬性一樣來使用, javabean 都有 getter 和 setter 方法的
spring 里面的事務(wù)代理也挺挺不錯(cuò)的
<property name="target">
???<ref local="bookTypeDAO" />
</property>
target 它是指向要注入的類,代理這個(gè)類所實(shí)現(xiàn)的接口
<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 是對(duì)所代理的方法哪些方法提供事務(wù),比如你定義一個(gè)以 add 開頭的方法,那它就可以有事務(wù)管理了,對(duì)于它里面的所有操作,都可以實(shí)現(xiàn)事務(wù)機(jī)制,若有異常就回滾事務(wù)
hibernate 的映射機(jī)制是 orm ,面向?qū)ο蟮臄?shù)據(jù)庫查詢,查詢時(shí)必須提供查詢類(如 find 方法 "from Book"hql 語句中的 Book 不是表名而是類名),以得到它的實(shí)例,對(duì)應(yīng)數(shù)據(jù)庫的 javabean 的屬性必須都是對(duì)象型的, int 、 double 必須定義為 Integer 和 Double 類型,映射表有個(gè) lazy 屬性應(yīng)該設(shè)置 false ,不然在查詢數(shù)據(jù)庫后加載一條記錄時(shí)會(huì)報(bào)錯(cuò)。一對(duì)多雙相關(guān)聯(lián):
一對(duì)多映射,復(fù)雜
<set name="borrowBills" lazy="false"
???inverse="true" cascade="none">
???<key column="readerid" />
???<one-to-many
????class="com.binghe.hibernate.borrowbill.BorrowBill" />
??</set>
cascade 屬性不好用,如果有刪除記錄操作時(shí)我都把它設(shè)置成 none 值,雙方都要設(shè)置,否則報(bào)錯(cuò),因?yàn)闆]法相互通知
多對(duì)一映射,簡單
<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 都市淘沙者 閱讀(275) 評(píng)論(0) 編輯 收藏