【第1步】配置Spring配置文件
== applicationContext.xml ==
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http:
//www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
<bean id="loginbean" class="Service.LoginBean">
</bean>
</beans>
说明:Spring配置文件applicationContext.xml中就只有<bean>配置,从字面上去理解,就知道Spring是对Bean进行管理的,在上面
是对Service包下的LoginBean.java进行托管,并且取逻辑名为loginbean。在程序中如果要创建LoginBean.java的对象的时候,
可通过逻辑名创建。
==============================================
【第2步】定义接口
== LoginInterface接口 ==
public interface LoginInterface {
public boolean verify(String username,String password);
}
==============================================
【第3步】实现接口
== LoginBean.java ==
public class LoginBean implements LoginInterface {
public boolean verify(String username,String password)//实现接口的方法
{
... ... ...
}
}
==============================================
【第4步】在程序中通过Spring配置文件调用实现接口的类中的方法,进行逻辑运算
== LoginAction.java ==
import org.springframework.context.support.*;
import org.springframework.context.ApplicationContext;
import Service.LoginInterface;
//Struts中的Action调用逻辑层的方法,进行逻辑处理
public class LoginAction extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
... ... ...
ApplicationContext ctx=new FileSystemXmlApplicationContext("c://a//applicationContext.xml");//加载Spring文件
LoginInterface bean=(LoginInterface)ctx.getBean("loginbean");//通过配置好的逻辑名创建Bean对象。(面向接口)
boolean flag=bean.verify(username, password);//调用方法,进行逻辑运算
... ... ...
}
}
说明:FileSystemXmlApplicationContext类的参数是Spring配置文件的绝对路径名;当通过逻辑名创建Bean对象的时候,使用接口
LoginInterface去指向实现接口的对象。
========================================================================================
2.在spring中对Bean的属性依赖注入
①给基本数据类型的属性注入值
... ... ...
<bean id="loginbean" class="Service.LoginBean">
<property name="i">
<value>3</value>
</property>
</bean>
说明:上面的定义相当于是创建了一个LoginBean.java的对象,应用名为loginbean,并且给loginbean的属性i,赋值为3。
相当于:
Service.LoginBean loginbean=new Service.LoginBean();
loginbean.setI(3);
注意:当<property name="i" value="3"/> 时,程序会自动调用Service.LoginBean.java中的public void setI(int i)方法,
所以,对于在Bean中每个属性必须要有GET,SET 方法。
②给类对象属性注入值
... ... ...
<bean id="loginbean" class="Service.LoginBean">
<property name="dao">
<ref bean="logindao"/>
</property>
</bean>
<bean id="logindao" class="dao.LoginDao" singleton="false"></bean>
说明:上面的定义还是相同,只是,这次赋值的属性不再是基本数据类型,而是实体Bean。
相当于:
dao.LoginDao logindao=new dao.LoginDao();
Service.LoginBean loginbean=new Service.LoginBean();
loginbean.setDao(logindao);
注意:<property>的value属性没有了,而是采用了ref属性。value属性用于注入基本的数据类型值,而ref属性用于注入已经定义好的
Bean。<property>还有另一个属性:singleton。当设置为false时,表示此类不是单态模式,默认的情况是true.
③给集合属性注入值
... ... ...
<bean id="loginbean" class="Service.LoginBean">
<property name="arrayList">
<list>
<value>aa</value>
<value>aa2</value>
<value>aa3</value>
</list>
</property>
</bean>
说明:上面的定义相当于是创建了一个LoginBean.java的对象,应用名为loginbean,并且给loginbean的集合属性arrayList赋值。
相当于:
List list=new ArrayList();
list.add("aa");
list.add("aa2");
list.add("aa3");
Service.LoginBean loginbean=new Service.LoginBean();
loginbean.setArrayList(list);
========================================================================================
3.通过Spring与Struts的整合
【第1步】修改Struts配置文件
== struts-config.xml ==
... ... ...
<action-mappings >
<action attribute="loginForm" input="/login.jsp" name="loginForm" path="/login" scope="request" >★1
<forward name="success" path="/success.jsp" />
<forward name="failure" path="/failure.jsp" />
</action>
</action-mappings>
<controller>
<set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>★2
</controller>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">★3
<set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />★4
</plug-in>
... ... ...
说明:
★1:这里和普通的Sturts配置一样的,但要把type配置去掉,因为,所有的Action都由Spring托管,所有,在这里不能指定具体的
Action类。
★2:DelegatingRequestProcessor是Spring定义好的请求处理器委托类,所有的Action被调用前被执行。
★3:ContextLoaderPlugIn是Spring定义好的文本加载类,主要加载Sping的配置文件
★4:contextConfigLocation是ContextLoaderPlugIn的属性,这里是将Spring的配置文件加载到程序中,用ContextLoaderPlugIn类的
contextConfigLocation属性去接收。
附加:
Struts配置文件的另一种配置:
... ... ...
<action attribute="loginForm" input="/login.jsp" name="loginForm" path="/login" scope="request"
type="org.springframework.web.struts.DelegatingActionProxy">★1
... ... ...
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/classes/applicationContext.xml" />
</plug-in>
... ... ...
说明:
★1:这里指定了具体的Action要处理的类,只不过这个Action是Spring扩展的DelegatingActionProxy类,这个类是Action的委托类。
其他的都一样。
==================================================
【第2步】修改Spring配置文件
== applicationContext.xml ==
... ... ...
<bean name="/login" class="action.LoginAction">★1
<property name="bean">
<ref bean="loginbean"/>
</property>
</bean>
<bean id="loginbean" class="Service.LoginBean">★2
<property name="dao">
<ref bean="logindao"/>
</property>
</bean>
<bean id="logindao" class="dao.LoginDao"></bean>★3
说明:
★1:这里是对Struts中的Action进行配置,注意:这里的name所配置的不是指Action类中的属性,而是指触发表单的名字,与Struts
中的path属性相对应。当login表单触发事件时,将调用此配置好的LoginAction
★2:很明显这里是对逻辑层的Bean进行配置,主要作控制层action.LoginAction中的属性。
★3:这里是对数据层的Bean进行配置,主要作逻辑层Service.LoginBean中的属性
==================================================
【第3步】程序中的运用
== LoginAction.java ==
这里要对应Spring中的配置
... ... .... .....
package action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import form.LoginForm;
import Service.LoginInterface;
public class LoginAction extends Action {
private LoginInterface bean;//★★1
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
String username=loginForm.getUsername();
String password=loginForm.getPassword();
boolean flag=bean.verify(username, password);//★★2
if(flag)
return mapping.findForward("success");
else
return mapping.findForward("failure");
}
public LoginInterface getBean()//★★3
{
return bean;
}
public void setBean(LoginInterface bean)//★★4
{
this.bean = bean;
}
}
说明:
这是个Action类,处理用户提交的请求,这里并没有对代码进行任何删减。
★★1这里是定义了一个私有的逻辑层的Bean (注意,这里用的是接口)属性,★★3与★★4是这个私有Bean属性的setter方法,
主要作用是方便Spring对Bean属性的注入与调用,★★2就是直接对逻辑层Bean中的方法直接调用。到这里就会发现了,
逻辑Bean并没有通过new关键字去创建,而是通过Spring注入进来的,这样就降低了类与类之间的耦合度。
========================================================================================
4.通过Spring与Hibernate的整合
【第1步】导入HIBERNATE资源,将所有的hibernate都交给spring托管
在Spring的配置文件中会生成以下配置:
<!-- 指定数据源 -->
<bean id="database"
class="org.apache.commons.dbcp.BasicDataSource">★★1
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>123</value>
</property>
</bean>
<!-- 指定session工厂 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">★★2
<property name="dataSource">
<ref bean="database" />
</property>
<property name="hibernateProperties">★★3
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">★★4
<list>
<value>pack/Users.hbm.xml</value>
</list>
</property>
</bean>
说明:
★★1:BasicDataSource类是Spring封装的类,是对数据源的操作的一扩展,有了这个配置后,HIBERNATE就不必对数据源进行配置了。
以上是链接MySql的数据库
★★2:LocalSessionFactoryBean类是session工厂的封装类,此类主要传递给Dao层的Bean作为Session的工厂。
★★3:hibernateProperties属性是Hibernate的 "方言",对应Hibernate中的配置
★★4:mappingResources是对应Hibernate中实体与表之间映射的配置文件
【第2步】编写Dao层(数据访问层)
编写UserDAO接口
package dao;
import po.Users;
public interface UserDAO{
public void add(Users user);//添加
public void delete(Users user);//删除
public void update(Users user);//修改
public void select(Users user);//查询
}
====================================
编写UserDAOimpl类,添加增,删,改查方法。
package dao;
import po.Users;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;//★★HibernateDaoSupport封装了对数据库的操作
public class UserDAOimpl extends HibernateDaoSupport implements UserDAO
{
public void add(Users user)//添加 {
super.getHibernateTemplate().save(user);//★★调用父类的方法,进行数据的添加
getHibernateTemplate().flush();
}
public void delete(Users user)//删除{
super.getHibernateTemplate().delete(user);
getHibernateTemplate().flush();
}
public void update(Users user)//修改{
super.getHibernateTemplate().update(user);
getHibernateTemplate().flush();
}
public void select(Users user)//查询{
super.getHibernateTemplate().get(user.getClass(), 1);
getHibernateTemplate().flush();
}
}
【第3步】Spring配置,注入实体Bean
... ... ...
<bean id="userDAO" class="dao.UserDAOimpl">
<property name="sessionFactory">
<ref local="sessionFactory" /> //★★给父类的属性赋值,这里是给Session工厂赋值
</property>
</bean>
... ... ...