1、新建一个工程 myweb
2、导入Spring2.0的Jar包:
Spring 2.0 AOP Libraries
Spring 2.0 Persistence Core Libraries
Spring 2.0 Persistence JDBC Libraries
Spring 2.0 J2EE Libraries
Spring 2.0 Web Libraries
OpenJPA
3、创建一个名为 com.qhit.model 的包
4、导入Hibernate3.1的Jar包
5、替换Jar
6、将 dataSource bean 的代码换成C3P0数据源实现,如下:
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="jdbc:mysql://localhost/test" />
<!-- 指定连接数据库的用户名 -->
<property name="user" value="root" />
<!-- 指定连接数据库的密码 -->
<property name="password" value="123" />
<!-- 指定连接数据库连接池的最大连接数 -->
<property name="maxPoolSize" value="20" />
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minPoolSize" value="1" />
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize" value="1" />
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
<property name="maxIdleTime" value="20" />
</bean>
7、生成表的映射类,生成的类放在model包中。
8、在src目录下创建一个struts.xml文件,具体内容如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="zsw" extends="json-default">
</package>
</struts>
9、创建一个名为 com.qhit.business 的包
10、在 com.qhit.business.user 包中创建一个 UserBusiness 接口,具体代码如下:
package com.qhit.business.user;
public interface UserBusiness {
/**
* 新增用户
* @param user 新增用户的用户名
* @param pass 新增用户的密码
*/
void addUser(String userName , String userPwd )
throws Exception;
/**
* 修改用户
* @param user 修改用户的用户名
* @param pass 修改用户的密码
*/
void updateUser(String userName , String userPwd)
throws Exception;
/**
* 删除用户
* @param user 删除用户的用户名
* @param pass 删除用户的密码
*/
void delUser(String userName , String userPwd)
throws Exception;
}
11、在 com.qhit.business.user 包中创建一个 UserBusinessImpl 的类,并让这个类实现 UserBusiness 接口(具体方法内容先不添加)。
12、创建一个名为 com.qhit.action.user.base 的包 , 并在这个包下创建一个 UserBusinessAction 的类并让这个类继承于 ActionSupport 类,
具体代码如下:
package com.qhit.action.user.base;
import com.opensymphony.xwork2.ActionSupport;
import com.qhit.business.user.UserBusiness;
public class UserBusinessAction extends ActionSupport {
protected UserBusiness userbusinessimpl;
public void setUserbusinessimpl(UserBusiness userbusinessimpl) {
this.userbusinessimpl = userbusinessimpl;
}
}
13、创建struts2.0的 ActionBean 名字叫 AddUserAction 在 com.qhit.action.user 包中
并让这个ActionBean 继承于 UserBusinessAction 类。具体代码如下:
package com.qhit.action.user;
import com.qhit.action.user.base.UserBusinessAction;
public class AddUserAction extends UserBusinessAction {
private String userName;
private String userPwd;
@Override
public String execute() throws Exception {
this.userbusinessimpl.addUser(userName, userPwd);
return "success";
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
}
14、创建一个名为com.qhit.dao.userdao的包,并建立一个名称为 UserDao 接口,具体代码如下:
package com.qhit.dao.userdao;
import java.util.List;
import com.qhit.model.Users;
public interface UserDao {
/**
* 根据id查找用户
*
* @param id
* 需要查找的种类id
*/
Users get(int id);
/**
* 增加种类
*
* @param users
* 需要增加的种类
*/
void save(Users users);
/**
* 修改用户
*
* @param users
* 需要修改的用户
*/
void update(Users users);
/**
* 删除用户
*
* @param id
* 需要删除的用户id
*/
void delete(int id);
/**
* 删除用户
*
* @param users
* 需要删除的用户
*/
void delete(Users users);
/**
* 查询全部用户
*
* @return 获得全部用户
*/
List<Users> findAll();
/**
* 根据用户名,密码查找用户
*
* @param userName
* 查询所需的用户名
* @param userPwd
* 查询所需的密码
* @return 对应的用户
*/
Users findUserByNameAndPass(String userName, String userPwd);
/**
* 根据用户名查找用户
*
* @param userName
* 查询所需的用户名
* @return 对应的用户
*/
Users findUserByName(String userName);
}
15、在 com.qhit.dao.userdao 包创建一个类名为 UserDaoImpl 的类,
并让这个类继承与 HibernateDaoSupport 类并实现 UserDao 接口 。具体代码如下:
package com.qhit.dao.userdao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.qhit.model.Users;
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
public void delete(int id) {
getHibernateTemplate().delete(getHibernateTemplate().get(Users.class , id));
}
public void delete(Users users) {
getHibernateTemplate().delete(users);
}
public List<Users> findAll() {
return (List<Users>)getHibernateTemplate().find("from Users");
}
public Users findUserByName(String userName) {
List ul = getHibernateTemplate().find("from Users au where au.userName = ?" ,userName);
if (ul != null && ul.size() >= 1)
{
return (Users)ul.get(0);
}
return null;
}
public Users findUserByNameAndPass(String userName, String userPwd) {
List ul = getHibernateTemplate()
.find("from Users au where au.userName = ? and au.userPwd = ?" ,
new String[]{userName , userPwd});
if (ul != null && ul.size() >= 1)
{
return (Users)ul.get(0);
}
return null;
}
public Users get(int id) {
return (Users)getHibernateTemplate().get(Users.class , id);
}
public void save(Users users) {
getHibernateTemplate().save(users);
}
public void update(Users users) {
getHibernateTemplate().saveOrUpdate(users);
}
public void delUser(String userName, String userPwd) throws Exception {
}
public void updateUser(String userName, String userPwd) throws Exception {
}
}
16、创建两个JSP页面分别是 success.jsp 和 error.jsp
17、修改struts.xml文件,修改后的代码如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GBK" />
<package name="zsw" extends="json-default">
<action name="adduser" class="com.qhit.action.user.AddUserAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
18、修改 com.qhit.business.user 包中的 UserBusinessImpl 类,修改后的代码如下:
package com.qhit.business.user;
import com.qhit.dao.userdao.UserDao;
import com.qhit.model.Users;
public class UserBusinessImpl implements UserBusiness {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void addUser(String userName, String userPwd) throws Exception {
Users users = new Users();
users.setUserName(userName);
users.setUserPwd(userPwd);
userDao.save(users);
}
public void delUser(String userName, String userPwd) throws Exception {
}
public void updateUser(String userName, String userPwd) throws Exception {
}
}
19、修改 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,使用C3P0数据源实现 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl" value="jdbc:mysql://localhost/test" />
<!-- 指定连接数据库的用户名 -->
<property name="user" value="root" />
<!-- 指定连接数据库的密码 -->
<property name="password" value="123" />
<!-- 指定连接数据库连接池的最大连接数 -->
<property name="maxPoolSize" value="20" />
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minPoolSize" value="1" />
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize" value="1" />
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
<property name="maxIdleTime" value="20" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>/com/qhit/model/Users.hbm.xml</value>
</list>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator-->
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 指定对满足哪些bean name的bean自动生成业务代理 -->
<property name="beanNames">
<!-- 下面是所有需要自动创建事务代理的bean-->
<list>
<value>userbusinessimpl</value>
</list>
</property>
</bean>
<bean id="userbusinessimpl"
class="com.qhit.business.user.UserBusinessImpl">
<property name="userDao" ref="userDao" />
</bean>
<bean id="userDao" class="com.qhit.dao.userdao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
20、修改 struts.xml 文件,修改后的文件如下:
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<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>
</web-app>
21、删除WEB-INF目录下多余的tld文件。
22、修改index.jsp文件,具体代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<s:form action="adduser.action" name="frm1" theme="simple">
用户名:<s:textfield name="userName" />
<br>
密 码:<s:password name="userPwd" />
<br>
<s:submit value="提交" />
<s:reset value="重置" />
</s:form>
</body>
</html>
Struts1.2 + Spring2.0 + Hibernate 3.1 整合 2.0版本
开发环境:
MyEclipse Blue Edition 版本为 6.5.0 .Blue Milestone-1
MySQL 5.0版
Struts 1.2版
Spring 2.0版
Hibernate 3.1版
在上一次 (第一次整合网址:http://www.blogjava.net/zhangsenwei/archive/2008/06/23/210083.html) 的开发基础之上,这次我们对上次整合后的SSH框架进行一下系统提升,这次的提升主要对框架进行了以下3处的完善
(1)建立公共函数类
(2)加入DAO适配器
(3)加入事务和拦截器
1、在com.address.hibernate.dao 包中新建一个接口,接口的名字为 IAddressDAO,具体代码如下:
package com.address.hibernate.dao;
import java.util.List;
import com.address.hibernate.beans.Linkman;
public interface IAddressDAO {
// 添加一个联系人
public void addLinkMan(Linkman linkman);
// 删除一个联系人
public void delete(String id);
// 修改一个联系人
public void update(Linkman linkman);
// 获取所有联系人
public List getAllLinkman();
// 根据ID获取一个联系人
public Linkman getLinkman(String linkmanid);
}
2、让com.address.hibernate.dao 包中的AddressDAO类实现 IAddressDAO接口,具体代码如下:
package com.address.hibernate.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.address.hibernate.beans.Linkman;
public class AddressDAO extends HibernateDaoSupport implements IAddressDAO{
// 添加一个联系人
public void addLinkMan(Linkman linkman) {
this.getHibernateTemplate().save(linkman);
}
// 删除一个联系人
public void delete(String id) {
Object p = this.getHibernateTemplate().load(Linkman.class,
new Integer(id));
this.getHibernateTemplate().delete(p);
}
// 修改一个联系人
public void update(Linkman linkman) {
this.getHibernateTemplate().update(linkman);
}
// 获取所有联系人
public List getAllLinkman() {
return getHibernateTemplate().find("from Linkman");
}
// 根据ID获取一个联系人
public Linkman getLinkman(String linkmanid) {
return (Linkman) getHibernateTemplate().get(Linkman.class,
new Integer(linkmanid));
}
}
3、在com.address.struts.action包中新建一个类
4、为这个起个名字为:BaseAction
5、这个类中可以将一些公用的方法进行抽取出来,比如相对session的操作我们可以进行一下封装或者对reqeust进行一下封装。具体代码如下:
package com.address.struts.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.actions.DispatchAction;
/*
* 这个类中可以将一些公用的方法进行抽取出来,比如相对session的操作我们可以进行一下封装或者
* 对reqeust进行一下封装。
*/
public class BaseAction extends DispatchAction {
/**
* 设置 request 的属性
*
* @param request
* @param key
* @param obj
*/
protected void setRequest(HttpServletRequest request, String key, Object obj) {
request.setAttribute(key, obj);
}
/**
* 判断某个值是否在 request 中存在
*
* @param request
* @param key
* @param obj
*/
protected boolean isExistRequest(HttpServletRequest request, String key) {
if (request.getAttribute(key) != null) {
return true;
} else {
return false;
}
}
/**
* 获取 request 中某个值
*
* @param request
* @param key
* @return
*/
protected Object getRequest(HttpServletRequest request, String key) {
return request.getAttribute(key);
}
/**
* 设置 session 的属性
*
* @param request
* @param key
* @param obj
*/
protected void setSession(HttpServletRequest request, String key, Object obj) {
request.getSession().setAttribute(key, obj);
}
/**
* 判断某个值是否在 session 中存在
*
* @param request
* @param key
* @param obj
*/
protected boolean isExistSession(HttpServletRequest request, String key) {
if (request.getSession().getAttribute(key) != null) {
return true;
} else {
return false;
}
}
/**
* 获取 session 中某个值
*
* @param request
* @param key
* @return
*/
protected Object getSession(HttpServletRequest request, String key) {
return request.getSession().getAttribute(key);
}
}
6、打开com.address.struts.action 包修改 AddressAction 类,修改后的详细代码如下:
package com.address.struts.action;
import java.util.List;
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 com.address.hibernate.dao.IAddressDAO;
import com.address.hibernate.beans.Linkman;
import com.address.hibernate.dao.AddressDAO;
import com.address.struts.form.AddressForm;
public class AddressAction extends BaseAction {
private IAddressDAO addressDAO = null;
// 添加联系人
public ActionForward addLinkMan(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
AddressForm addressForm = (AddressForm) form;
Linkman linkman = new Linkman();
linkman.setUserName(addressForm.getUserName());
linkman.setUserPhone(addressForm.getUserPhone());
linkman.setUserAddress(addressForm.getUserAddress());
this.getAddressDAO().addLinkMan(linkman);
return mapping.findForward("success");
}
// 修改联系人
public ActionForward updateLinkMan(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
Linkman linkman = new Linkman();
linkman.setUserName(linkman.getUserName());
linkman.setUserPhone(linkman.getUserPhone());
linkman.setUserAddress(linkman.getUserAddress());
this.getAddressDAO().update(linkman);
return mapping.findForward("success");
}
// 删除联系人
public ActionForward delLinkMan(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
this.getAddressDAO().delete((String)this.getRequest(request, "linkmanid"));
return mapping.findForward("success");
}
// 获取所有联系人信息
public ActionForward getAllLinkMan(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
List list = this.getAddressDAO().getAllLinkman();
request.setAttribute("linkManList", list);
return mapping.findForward("success");
}
public IAddressDAO getAddressDAO() {
return addressDAO;
}
public void setAddressDAO(IAddressDAO addressDAO) {
this.addressDAO = addressDAO;
}
}
7、新建一个包名字叫做 com.address.aop
8、在com.address.aop 包下创建一个代理类,名字为: LoggingInterceptor 具体代码如下:
package com.qhit.aop;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class LoggingInterceptor implements MethodBeforeAdvice {
public void before(Method method, Object[] objects, Object o)
throws Throwable {
System.out.println("logging before: " + o.getClass());
}
}
9、打开applicationContext.xml 添加下面这段配置事务的代码:
<!-- 配置事务 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
10、在 applicationContext.xml 中加入下面代码进行定义 DAO 代理:
<!-- 定义DAO代理 -->
<bean id="addressDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="addressDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
11、在 applicationContext.xml 中加入下面代码进行配置拦截器代理:
<!-- 配置拦截器 -->
<bean name="logger" class="com.address.aop.LoggingInterceptor" />
<!-- 配置拦截器代理 -->
<bean name="loggingAutoProxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>/address</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>logger</value>
</list>
</property>
</bean>
12、打开 struts-config.xml 文件在action中加入一个属性 parameter="method"
|
至此我们所开发的 SSH 框架就修改完成了,如果在整合或提升过程中有什么问题,可以给我留言。