===============Spring+Hibernate+Struts配置===============
spring加載log4j
web.xml
<
context
-
param
>
<
param
-
name
>
log4jConfigLocation
</
param
-
name
>
<
param
-
value
>/
WEB
-
INF
/
classes
/
log4j.properties
</
param
-
value
>
</
context
-
param
>
<
listener
>
<
listener
-
class
>
org.springframework.web.util.Log4jConfigListener
</
listener
-
class
>
</
listener
>
一.spring+struts
1.加載springContext
通過struts-config.xml中增加plug-in插件來加載springContext
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
</plug-in>
applicationContext.xml為spring的配置文件
2.將strutsAction交給Spring容器進行管理
修改struts-config.xml中的action屬性,action的type值不指定具體的實現類,統一修改成代理類
<action input="/login.jsp"
name="loginActionForm"
path="/loginAction"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy"
validate="false">
<forward name="success" path="/success.jsp" />
<forward name="failure" path="/failure.jsp" />
</action>
3.在applicationContext.xml中的bean name值設定與struts-config.xml中action path值相對應,以使代理類DelegatingActionProxy能夠根據傳入的path在springContext中找到相應的bean,并將實例返回給struts.
<bean name="/loginAction" class="com.derek.action.LoginAction" singleton="false">
<property name="login">
<ref bean="loginBOProxy" />
</property>
</bean>
二.spring+hibernate
1.dateSource
在springContext中設置dateSource Bean
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"></property>
<property name="url" value="jdbc:jtds:sqlserver://192.168.56.32:1433/testDB"></property>
<property name="username" value="it"></property>
<property name="password" value="it"></property>
</bean>
2.sessionFactory
在springContext中設置sessionFactory Bean
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mappingResources">
<list>
<value>hbm\OvertimeRecord.hbm.xml</value><!--hbm映射文件-->
<value>hbm\OvertimePermit.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
</props>
</property>
</bean>
3.transactionManager
在springContext中設置transactionManager Bean
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
4.DAO bean
<bean id="Ilogin" class="com.derek.business.Login">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
public class Login extends HibernateDaoSupport implements LoginInterface
DAO 繼承HibernateDaoSupport
HibernateSupport實現了HibernateTemplate和SessionFactory實例的關聯, HibernateTemplate對Hibernate Session操作進行了封裝,HibernateTemplate.execute方法則是一封裝機制的核心. 借助HibernateTemplate我們可以脫離每次數據操作必須首先獲得Session實例、啟動事務、提交/回滾事務以及煩雜的try/catch/finally的繁瑣操作.
Spring中的事務管理實際上是基于動態AOP機制實現,為了實現動態AOP,Spring在默認情況下會使用Java DynamicProxy,但是,Dynamic Proxy要求其代理的對象必須實現一個接口,該接口定義了準備進行代理的方法。而對于沒有實現任何接口的Java Class,需要采用其他方式,Spring通過CGLib實現這一功能。
5.DAOProxy 代理bean
通過代理,將上面的DAO bean 納入到spring容器的事務管理中,并在其中設置對哪些方法進行事務管理
<bean id="loginBOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="Ilogin" /> <!--所代理的bean-->
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop> <!--以insert開頭的方法加入事務管理-->
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <!--以get開頭的方法只讀-->
</props>
</property>
</bean>
6.action bean
<bean name="/loginAction" class="com.derek.action.LoginAction" singleton="false">
<property name="login">
<ref bean="loginBOProxy" /> <!--要將其使用的DAO bean加入事務管理,就必須ref他的代理bean,且在LoginAction中該屬性須由其接口強制類型轉換-->
</property>
</bean>
示例代碼:
struts-conifg.xml
<?
xml version
=
"
1.0
"
encoding
=
"
UTF-8
"
?>
<!
DOCTYPE struts
-
config PUBLIC
"
-//Apache Software Foundation//DTD Struts Configuration 1.1//EN
"
"
http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd
"
>
<
struts
-
config
>
<
form
-
beans
>
<
form
-
bean name
=
"
loginActionForm
"
type
=
"
com.derek.form.LoginActionForm
"
/>
</
form
-
beans
>
<
action
-
mappings
>
<
action input
=
"
/login.jsp
"
name
=
"
loginActionForm
"
path
=
"
/loginAction
"
scope
=
"
request
"
type
=
"
org.springframework.web.struts.DelegatingActionProxy
"
validate
=
"
false
"
>
<
forward name
=
"
success
"
path
=
"
/success.jsp
"
/>
<
forward name
=
"
failure
"
path
=
"
/failure.jsp
"
/>
</
action
>
</
action
-
mappings
>
<
plug
-
in className
=
"
org.springframework.web.struts.ContextLoaderPlugIn
"
>
<
set
-
property property
=
"
contextConfigLocation
"
value
=
"
/WEB-INF/applicationContext.xml
"
/>
</
plug
-
in
>
</
struts
-
config
>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans SYSTEM "D:\JAVA\MyWork\SpringDemo\SpringWeb\WEB-INF\spring-beans.dtd">
<!--DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"-->
<!--
- Root application context for the Countries application.
- Web-specific beans are defined in "countries-servlet.xml".
-->
<beans>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"></property>
<property name="url" value="jdbc:jtds:sqlserver://192.168.56.32:1433/testDB"></property>
<property name="username" value="it"></property>
<property name="password" value="itservice"></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mappingResources">
<list>
<value>hbm\OvertimeRecord.hbm.xml</value>
<value>hbm\OvertimePermit.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!---------------使用JNDI數據源----------------
bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/cqccms</value>
</property>
<property name="jndiEnvironment">
<props>
<prop key="java.naming.factory.initial">
weblogic.jndi.WLInitialContextFactory
</prop>
<prop key="java.naming.provider.url">t3://172.16.101.42:7001</prop>
<prop key="java.naming.security.principal">weblogic</prop>
<prop key="java.naming.security.credentials">weblogic</prop>
</props>
</property>
</bean>
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate" singleton="true"
lazy-init="default" autowire="default" dependency-check="default">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
weblogic.jndi.WLInitialContextFactory
</prop>
<prop key="java.naming.provider.url">t3://172.16.101.42:7001</prop>
<prop key="java.naming.security.principal">weblogic</prop>
<prop key="java.naming.security.credentials">weblogic</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" singleton="true"
lazy-init="default" autowire="default" dependency-check="default">
<property name="jndiTemplate">
<ref local="jndiTemplate" />
</property>
<property name="userTransactionName">
<value>weblogic/transaction/UserTransaction</value>
</property>
</bean>
--------------------------------->
<bean id="RecordDao" class="com.derek.business.RecordDao">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="RecordDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="RecordDao" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="Ilogin" class="com.derek.business.Login">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="loginBOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="Ilogin" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean name="/loginAction" class="com.derek.action.LoginAction" singleton="false">
<property name="login">
<ref bean="loginBOProxy" />
</property>
</bean>
</beans>
LoginInterface
package com.derek.myinterface;
public interface LoginInterface {
public boolean check(String name,String pwd);
}
Login
package com.derek.business;
import com.derek.myinterface.LoginInterface;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import java.util.List;
public class Login extends HibernateDaoSupport implements LoginInterface{
private SessionFactory sessionFactory;
private String hsql = "from OvertimePermit where account=? and password=?";
public Login() {}
public boolean check(String name,String pwd){
String condition[] = {name, pwd};//查詢條件
/**
* 借助HibernateTemplate我們可以脫離每次數據操作必須首先
* 獲得Session實例 、啟動事務、提交/回滾事務以及煩雜的try/catch/finally的繁瑣操作
*/
List l = this.getHibernateTemplate().find(hsql, condition);
if (l.size() > 0) return true;
else return false;
}
}
RecordDaoInterface
package com.derek.myinterface;
import java.util.List;
import hbm.OvertimeRecord;
public interface IRecordDao {
public List findAll(String hsql);
public void insert(OvertimeRecord or);
}
RecordDao
package com.derek.business;
import com.derek.myinterface.IRecordDao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.hibernate.SessionFactory;
import hbm.OvertimeRecord;
public class RecordDao extends HibernateDaoSupport implements IRecordDao{
private SessionFactory sessionFactory;
public RecordDao() {
}
public List findAll(String hsql) {
return this.getHibernateTemplate().find(hsql);
}
public void insert(OvertimeRecord or) {
this.getHibernateTemplate().saveOrUpdate(or);
}
}
LoginAction通過容器注入的Login實例完成業務操作(必須由接口強制類型轉化)
package com.derek.action;
import javax.servlet.http.*;
import com.derek.form.*;
import org.apache.struts.action.*;
import org.apache.log4j.Logger;
import com.derek.myinterface.LoginInterface;
public class LoginAction extends Action {
private LoginInterface login;
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest servletRequest,
HttpServletResponse servletResponse) {
Logger log = Logger.getLogger(this.getClass().getName());
LoginActionForm loginActionForm = (LoginActionForm) actionForm;
String name = loginActionForm.getName();
String pwd = loginActionForm.getPwd();
boolean TF = login.check(name,pwd);
if(TF){ log.warn("LoginSuccess------------");;return actionMapping.findForward("success");}
else{ log.warn("LoginFailure------------");;return actionMapping.findForward("failure");}
}
public void setLogin(LoginInterface Ilogin) {this.login = Ilogin;}
public LoginInterface getLogin() {return login;}
}
類中直接通過Context獲得bean實例(必須通過代理類獲得實例且由其接口強制類型轉化)
package com.derek.pub;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.derek.myinterface.IRecordDao;
import java.util.List;
import hbm.OvertimeRecord;
public class Untitled1 {
public Untitled1() {
ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
IRecordDao recordDao = (IRecordDao)ctx.getBean("RecordDaoProxy");
OvertimeRecord newor = new OvertimeRecord("004104","dada","100120","it","2006/04/02","2006/04/02","001145","david","001145","david","00","00","1","1","1","1");
newor.setMark("0");
recordDao.insert(newor);
List l = recordDao.findAll("from OvertimeRecord");
for(int i=0;i<l.size();i++){
OvertimeRecord or = (OvertimeRecord)l.get(i);
System.out.println(or.getId());
}
}
public static void main(String[] a){
Untitled1 u = new Untitled1();
}
}
一個Spring application context的定義能夠被很多種不同的上下文實現所讀取, 比如FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext以及XmlWebApplicationContext。 默認的情況下,一個web應用程序會從”WEB-INF/applicationContext.xml”中得到root context。 在所有的Spring應用中,XML文件中定義的application context會把所有相關的application beans連接起來, 包括Hibernate session factory以及數據訪問和業務對象(就像上面定義的那些bean)。 它們中的大部分都不會意識到被Spring容器所管理,甚至在同其他bean合作的時候, 因為它們僅僅遵循JavaBeans的規范。一個bean屬性及可以表示值參數,也可以是其他的合作bean。 下面的bean定義能夠作為Spring web MVC context的一部分,在最基礎的 application context中訪問business beans。
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
ProductService productService = (ProductService) context.getBean("myProductService");
ApplicationContext context =
new FileSystemXmlApplicationContext("C:/myContext.xml");
ProductService productService =
(ProductService) context.getBean("myProductService");
ApplicationContext context =
new ClassPathXmlApplicationContext("myContext.xml");
ProductService productService =
(ProductService) context.getBean("myProductService");
posted on 2006-05-10 14:22
Derek.Guo 閱讀(6623)
評論(13) 編輯 收藏 所屬分類:
Java