且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

SSH整合(一)——直接获取ApplicationContext

更新时间:2022-08-14 14:45:43



  一,引入jar包


              首先建立如下项目:


            SSH整合(一)——直接获取ApplicationContext


              接着,在项目中引入如下jar包:


              SSH整合(一)——直接获取ApplicationContext

                        SSH整合(一)——直接获取ApplicationContext

       

             楼主本人属于比较笨的那种,总是引丢了。。


   二,基本XML配置

                    

 1,首先是web.xml中,spring跟strut2的基本配置:

 

 <!-- spring 监听器的配置 -->
   <listener>
    <listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
  </listener>
  
  <!-- strut2配置 -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*</url-pattern>
  </filter-mapping>


2,hibernate的连接配置


<?xml version="1.0" encoding="UTF-8"?>
<!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的src\org\hibernate目录中找到此文件--> 
<!DOCTYPE hibernate-configuration PUBLIC 
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
          
<!--表明以下的配置是针对session-factory配置的,SessionFactory是Hibernate中的一个类,这个类主要负责保存HIbernate的配置信息,以及对Session的操作--> 
<hibernate-configuration>
<!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序--> 
	<session-factory>
		 <!--设置数据库的连接url:jdbc:mysql://localhost/**,其中localhost表示mysql服务器名称,此处为本机,    **是数据库名--> 
		<property name="connection.url">
			jdbc:mysql://localhost/testhibernate
		</property>
		
		<!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。--> 
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		
		<property name="connection.username">root</property>
		<property name="connection.password"></property>
		<!-- 显示hibernate生产的SQL语句 -->
		<property name="show_sql">true</property>
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<!-- 指定Map.hbm.xml的位置 -->
		<mapping resource="net/blogjava/nokiaguy/models/Map.hbm.xml"/>
	</session-factory>
</hibernate-configuration>


3,编写实体bean,配置bean跟表的对应关系


  <hibernate-mapping>
    	<class name="net.blogjava.nokiaguy.models.MapEntity" table="t_map">
    		<!-- 将id属性应射成自增类型 -->
    		<id name="id" column="id" type="int">
    			<generator class="increment"/>
    		</id>
    		<property name="keyword" column="keyword"/>
    		<property name="value" column="value"/>
    	</class>
    </hibernate-mapping>


 三,编写各层类

      

      1,数据访问DAO

     

package net.blogjava.nokiaguy.models;

import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;

public class MapDAO {

	private HibernateTemplate template; //需要spring-orm.jar包
	public MapDAO(HibernateTemplate template){
		this.template=template;
	}
	public String getValue(String keyword)
		
	{
		//在Spring中,不直接对Hibernate的Session进行操作,而是提供一个HibernateTemplate类来对Hibernate的Session进行操作。
		List value=template.find("select a.value from MapEntity a where a.keyword=?",keyword); //注意引入spring-tx..这个开头的jar包
		if(value.size()>0){
			return String.valueOf(value.get(0));
		}
		return null;
		
	}
}


2,业务逻辑Bean


package net.blogjava.nokiaguy.models;

public class MapService {
	private MapDAO dao;
	public MapService(MapDAO dao){
		this.dao=dao;
	}
	//验证value是否等于lhc
	public boolean validate(String keyword){
		String value=dao.getValue(keyword);
		//业务逻辑。。。。
		if(value==null){
			return false;
		}else if("lhc".equalsIgnoreCase(keyword)){
			return true;
		}
		return true;
	}
}


3,控制层Bean


package net.blogjava.nokiaguy.models;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class FirstSSHAction implements ServletRequestAware {
	private HttpServletRequest request;
	
	public String execute(){
		//获得ApplicationContext对象
		ApplicationContext applicationContext=WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
		//获得MapService对象
		MapService mapService=(MapService)applicationContext.getBean("mapService");
		//调用MapService类的validate方法,并在console中输出返回值
		System.out.println(mapService.validate("lhc"));
		
		return "success";
	}
	public void setServletRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		this.request = request;
	}
}

四,Spring注入Bean


         如上代码,我们在获得ApplicationContext对象之后,通过这个对象的getBean方法,传入我们配置文件中配置的Bean的ID来注入Bean。


         我们在ssh.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"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop.xsd
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx.xsd">
	
	
<!-- 装配Session工厂对象,用于创建Hibernate Session对象 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	<property name="configLocation" value="classpath:hibernate.cfg.xml">
	</property>
</bean>

<!-- 装配HibernateTemplate对象,该对象需要装配一个sessionFactory属性 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
	<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

<!-- 装配数据访问层组件 -->
<bean  id="mapDAO" class="net.blogjava.nokiaguy.models.MapDAO">
	<constructor-arg>
		<!-- 通过构造方法的参数将HibernateTemplate对象传入数据访问层组件 -->
		<ref bean="hibernateTemplate"/>
	</constructor-arg>
</bean>

<!-- 装配业务逻辑层组件 -->
<bean id="mapService" class="net.blogjava.nokiaguy.models.MapService">
	<constructor-arg>
		<!--将构造方法的参数MapDAO对象传入业务逻辑层 -->
		<ref bean="mapDAO"/>
	</constructor-arg>
</bean>

</beans>

     

      当在action中调用业务逻辑层组件的时候,通过spring初始化了DAO层组件,而初始化DAO层Bean的时候,我们又需要之前spring初始化Hibernate组件的结果作为参数。


      在这个XML文件中,我们将各层bean直接的依赖关系通过xml写在这里,一旦某曾出现变动,直接编写新的bean,更改这里的配置文件,完美实现各层的解耦合。


     PS:为了完成这个Demo,还需将这个配置文件引入applicationContext.xml文件:

        

<import resource="ssh.xml"/><!-- 导入ssh.xml文件 -->

      

      +在strut2.xml文件中配置action与jsp页面的对应关系。


       待续。。。