Dwr联手spring
我在实战dwr那篇文章里面介绍了怎么调用服务器端的java类,这次我要把数据库的调用通过spring容器注入到这个类里面,然后用dwr来调用这个类里面的方法访从数据库中取得数据
首先,要保证hibernate所需的jar文件都齐全了
其次,写好你的spring-application.xml文件把里面的bean都配置好了。
介绍一下:
关于对数据库的调用,我的习惯是采用3层架构,即web,service,dao。Web层即表现层,就是最终调用层。Service层是业务逻辑层,可以对数据加工。Dao层是最终访问数据库层。Dao层我采用spring的事务代理器TransactionProxyFactoryBean代理;service我采用spring的普通的bean代理器ProxyFactoryBean代理;web层就是上面所说的那个java类,在这里,我也把它配置到spring容器里面了,作为一个spring的bean来使用。通过spring容器,我把dao层注入到service层,把service层注入到web层即那个java类,作为它的一个属性来使用。
我把实例写出来看看:
spring-application.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/VSPN18DATASOURCE</value>
</property>
</bean>
<bean id="dtatImportSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list> <value>com/vstsoft/dataimport/dto/Dealer.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</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="dtatImportSessionFactory" />
</property>
</bean>
<bean id="impDealerDAO"
class="com.vstsoft.dataimport.dao.impl.DealerDAOImpl">
<property name="sessionFactory">
<ref local="dtatImportSessionFactory" />
</property>
</bean>
<bean id="dealerDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="impDealerDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="dealerManage"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.vstsoft.dataimport.service.DealerManage</value>
</property>
<property name="target">
<ref bean="dealerManageTarget" />
</property>
</bean>
<bean name="dealerManageTarget"
class="com.vstsoft.dataimport.service.impl.DealerManageTarget">
<property name="dealerDAO">
<ref bean="dealerDAOProxy" />
</property>
</bean>
<bean name="monitor" singleton="false"
class="com.vstsoft.dataimport.dto.Monitor">
<property name="dealerManage">
<ref bean="dealerManage" />
</property>
</bean>
</beans>
要注意的是这个bean”monitor”它就是最终调用即我们的那个调用类。我把它当作一个spring容器的bean来管理,并且把service层注入了它里面。
那,接下来,我们要修改dwr.xml了:
原来的配置
<create creator="new" javascript="DealerMonitor">
<param name="class"
value="com.vstsoft.dataimport.dto.Monitor" />
</create>
联手spring之后的配置
<create creator="spring" javascript="DealerMonitor">
<param name="beanName" value="monitor"></param>
<!-- 指定Spring配置文件的位置,如果没设置DWR会根据web.xml找到主配置文件,不过速度上就慢了
<param name="location" value="applicationContext.xml"></param>-->
</create>
这里的creater改成了spring,并且声明了要调用的spring容器中的bean
Java类Monitor相应的变成了:
package com.vstsoft.dataimport.dto;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.vstsoft.dataimport.service.DealerManage;
/**
* author:sunjianbin <br>
* email:volcano_hosan@sina.com
*/
public class Monitor {
private static Log log = LogFactory.getLog(Monitor.class);
private DealerManage dealerManage;
/**
* 从数据库中取得数据
*/
public List findDealers() {
if (dealerManage == null) {
log.info("dealerManage 没有注入");
}
List list = dealerManage.findDealers();
log.info("list size:" + list.size());
return list;
}
public DealerManage getDealerManage() {
return dealerManage;
}
public void setDealerManage(DealerManage dealerManage) {
this.dealerManage = dealerManage;
}
}