这两天在myeclipse中搭建了SSH的框架,现把详细的搭建整合过程记录如下
为了验证整合后的正确性,我在这里实现了一个小功能,即通过index.jsp页面提交请求,查询数据库中存有多少件商品,如果查询成功,则在控制台打印商品的件数,并返回到成功页面success.jsp,反之,返回到error.jsp。数据库中只有一个表goods。
1. 建立web project
在src目录下新建包com.action,com.service,com.service.impl,com.dao,com.dao.impl,com.po
各个包要存放的类相信通过包名可以明白,在com.po包中新建po类Goods.java
在WebRoot下新建文件夹pages,用以存放success.jsp和error.jsp,index.jsp直接在WebRoot目录下
index.jsp:
<s:form action="goodsAction" namespace="/lhc">
<s:submit method="insertGood" value="查询" cssStyle="width:100px;"></s:submit>
</s:form>
2. 引入struts2
首先需要导入struts2的几个必须包,它们在struts2的发行包lib目录下都可以找到
xwork-core-2.1.6.jar
struts2-core-2.1.8.1.jar
freemarker-2.3.15.jar
commons-fileupload-1.2.1.jar
修改web.xml文件,增加struts2配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- struts2配置 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
在src目录下新建struts.xml,内容如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="myAction" extends="struts-default" namespace="/lhc">
<action name="goodsAction " class="goodsActionSpring ">
<result name="success">/pages/success.jsp</result>
<result name="error">/pages/err.jsp</result>
</action>
</package>
</struts>
在struts.xml中配置好action后,接着就在com.action包中新建类GoodsAction,代码清单如下:
package com.action;
public class GoodsAction {
private GoodsInsertService goodsInsertActionService ;//见srping配置
public String selectGood(){
String result=goodsInsertActionService.selectGoods();
return result;
}
public void setGoodsInsertActionService(
GoodsInsertService goodsInsertActionService) {
this.goodsInsertActionService = goodsInsertActionService;
}
}
3.引入spring
这里struts2集成spring需要用到一个插件struts2-spring-plugin-2.1.8.1.jar ,可以在struts2发行包lib目录下找到,将之导入到工程中,然后将包spring.jar 导入工程
在spring框架中,IOC容器是整个框架工作的基础,为了web应用环境与之很好结合,spring提供了spring容器WebApplicationContext,所以,在每个web应用中都需要初始化这个容器,初始化方法是在web应用中web.xml声明一个ContextLoaderListener,并且增加名称为contextConfigLocation的上下文参数来指定容器的配置文件applicationContext.xml
修改web.xml文件,增加如下内容:
<!-- 集成spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
现在配置spring的配置文件applicationContext.xml,将该文件保存在src目录下,在本例中,所有action,service,dao都在该文件中配置,在实际开发中,为了管理方便,可以分开配置,只需做一些简单的变通,具体可以查阅相关资料
<!-- action,配置action -->
<bean id="goodsActionSpring" class="com.action.GoodsAction">
<property name="goodsInsertActionService" ref="goodsInsertService"></property>
</bean>
<!-- service,配置service -->
<bean id="goodsInsertService" class="com.service.impl.GoodsInsertServiceImpl">
<property name="goodsServiceDao" ref="goodsDao"></property>
</bean>
<!-- dao,配置dao -->
<bean id="goodsDao" class="com.dao.impl.GoodsDaoImpl">
<!-- DAO实现类通过继承JdbcDaoSupport获取JdbcTemplate时,可直接引用配置的数据源,下面的name属性必须为"dataSource" -->
<!-- <property name="dataSource" ref="myDataSource"></property> -->
<!-- DAO实现类直接引用JdbcTemplate -->
<!-- <property name="myTemplate" ref="jdbcTemplate"></property> -->
<!-- 利用spring对hibernate的支持访问数据库,如果DAO实现类是继承spring的HibernateDaoSupport类,这里的name属性必须为'sessionFactory',如果不继承该类,使用hibernate原生API操作数据库,则name属性可随意设置,只需要在DAO实现类中声明SessionFactory的实例作为属性,并使其属性名和name的值相同就可以了,本例中采取了第一种方式实现DAO -->
<property name="sessionFactory" ref="mySessionFactory"></property>
</bean>
<!-- 这个bean是在DAO实现类采取JdbcTemplate方式操作数据库时需要用到的,因为本例是继承HibernateDaoSupport ,因此可以忽略这个设置-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg><ref bean="myDataSource"/></constructor-arg>
</bean>
<!-- datasource,配置数据源 -->
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver" />
<property name="url" value="jdbc:jtds:sqlserver://localhost:1433/shopping" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
注意:本例中使用的是SQL SERVER数据库,配置数据源时需要用到jtds-1.2.jar包,将它导入工程,如果是其他数据库可以导入相应的支持包;
下面是service的实现,定义了service接口和实现类
package com.service;
public interface GoodsInsertService {
String selectGoods();
}
package com.service.impl;
public class GoodsInsertServiceImpl implements GoodsInsertService {
private GoodsDao goodsServiceDao;
public String selectGoods() {
String result=goodsServiceDao.select();
if("success".equals(result))
return "success";
else
return "error";
}
public void setGoodsServiceDao(GoodsDao goodsServiceDao) {
this.goodsServiceDao = goodsServiceDao;
}
}
4.引入hibernate
首先导入hibernate3.jar 包,利用spring的ioc容器创建SessionFactory,在spring的配置文件中增加以下内容
<!-- sessionFactory -->
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource">
</property>
<property name="mappingResources">
<list>
<value>Goods.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.hbm2ddl.auto">none</prop>
</props>
</property>
</bean>
在初始化LocalSessionFactoryBean时,需要用到dom4j-1.6.1.jar、jta.jar、commons-collections.jar、cglib-nodep-2.1_3.jar 这几个包,导入到工程中,它们在spring发行包的lib目录下都可以找到
hibernate的映射文件Goods.hbm.xml:
<hibernate-mapping package="com.po">
<class name="Goods" table="goods">
<id name="id" column="Gid" type="integer">
<generator class="native"></generator>
</id>
<property name="name" column="Gname" type="string"></property>
<property name="price" column="Gprice" type="integer"></property>
<property name="unit" column="Gunit" type="string"></property>
</class>
</hibernate-mapping>
下面就是dao的实现,定义了dao接口和实现类:
package com.dao;
public interface GoodsDao {
String select();
}
package com.dao.impl;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.dao.GoodsDao;
public class GoodsDaoImpl extends HibernateDaoSupport implements GoodsDao {
public String select() {
//1、 ================================================================================
// List list=super.getJdbcTemplate().query("select * from goods",new GoodsMapper());
// if(list.size()!=0){
// System.out.println("查询到的数据有: "+list.size()+" 条");
// return "success";
// }
//2、 =================================================================================
// int result=0;
// try{
// result=myTemplate.queryForInt("select COUNT(*) from goods");
// }catch(Exception e){
// e.printStackTrace();
// }
// if(result!=0){
// System.out.println("查询到的数据有: "+result+" 条");
// return "success";
// }
//3、 =================================================================================
// List<com.po.Goods> list=null;
// try{
// Session session=sessionFactory.openSession();
// list=session.createQuery("from Goods").list();
// session.close();
// query=sessionFactory.getCurrentSession().createQuery("from Goods").list();
// }catch(Exception e){
// e.printStackTrace();
// }
// if(list!=null && list.size()!=0){
// System.out.println("查询到的数据有: "+list.size()+" 条");
// return "success";
// }
//4、 ==================================================================================
List<com.po.Goods> list=this.getHibernateTemplate().find("from Goods");
if(list!=null && list.size()!=0){
System.out.println("查询到的数据有: "+list.size()+" 条");
return "success";
}
return "error";
}
}
说明:上面代码的12部分是没有集成hibernate时对数据库的操作,34部分是集成hibernate时对数据库的操作,3是使用hibernate原生API操作数据库,这时还需要引入antlr-2.7.6.jar 包,4是通过继承HibernateDaoSupport操作数据库,集成hibernate后操作数据库是使用hibernate API还是继承HibernateDaoSupport,可以说各有利弊,需要根据实际情况进行选择
到此,整个SSH的集成框架搭建完毕,除了上面提到的需要引入的开发包,实际开发中还可能使用到其他的包,可根据情况选择导入