最近跟着项目组做了两个好玩的项目,
一个是Struts2 + Hibernate3.2的B/S项目
另一个是CXF + Spring2.5 + Hibernate3.2的C/S项目
于是乎自己就特别想实际动手,用Eclipse来搭建Struts2 + Spring2.5 + Hibernate3.2 框架。
与大家一起分享,有的地方可以与我讨论,共通进步。
整体步骤是:
1、先加入Struts2
2、加入Spring2.5
3、加入Hibernate3.2
具体步骤是:
1、建个Web项目,而Eclipse里是Tomcat project
2、加入Struts2的核心包,(自己找吧网上很多)
3、写个web.xml放Web-Info下
<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>
4、写个三个很简单的jsp文件login.jsp/success.jsp/error.jsp
<body>
<s:form action="action_executeFunction" namespace="/">
名称:<s:textfield name="user.name"/>
密码:<s:textfield name="user.password"/>
<input type="submit" value="提交"/>
</s:form>
</body>
<body>
this is success page/
</body>
<body>
this is error page.
</body>
5、写个Struts.xml文件放src下
<!-- 配置中文支持 --> <constant name="struts.custom.i18n.resources" value="alternate" /> <!-- 配置Spring--> <constant name="struts.objectFactory" value="spring" /> <package name="user" namespace="/" extends="struts-default"> <global-results> <result name="message">/WEB-INF/page/message.jsp</result> </global-results> <action name="action_*" method="{1}" class="com.***.action.LoginAction" > <result name="input">login.jsp</result> <result name="error">error.jsp</result> <result name="success">success.jsp</result> </action> </package>
6、写个action
public class LoginAction extends ActionBase{
private User user = new User();
private ILoginBo loginBo ;
public String input() throws Exception {
this.user.setName("llll");
return INPUT;
}
public void validateExecuteFunction() throws Exception{
if(user.getName() == null || user.getPassword() == null ){
this.redraw();
}
}
public String executeFunction() throws Exception {
//ILoginBo loginBean = (ILoginBo)this.appContext.getBean("LoginBo");
if(!loginBo.isExits(user.getName())){
loginBo.addUser(user);
return SUCCESS;
}
return ERROR;
}
public String redraw() throws Exception {
return ERROR;
}
public ILoginBo getLoginBo() {
return loginBo;
}
public void setLoginBo(ILoginBo loginBo) {
this.loginBo = loginBo;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
7、以上这些文件对测试配好Struts2基本完成。其中还加入了一下配置Spring的应该能看出来在web.xml和Struts.xml中。
8、开始配置Spring,写个applicationContext.xml放Web-Info下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:amq="http://activemq.apache.org/schema/core" 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.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"> <!-- 这里scope="prototype"代表Action层不是单例模式,每次请求都会新创建一个对象--> <bean id="loginActionBean" class="com.***.action.LoginAction" scope="prototype"> <property name="loginBo" ref="loginBo"/> <property name="user" ref="userBean"/> </bean> <!-- 而Bo层默认都是单例的才能进行事物管理--> <bean id="loginBo" class="com.***.bo.impl.LoginBoImpl"> <property name="userDao"> <ref bean="userDao"/> </property> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.gjt.mm.mysql.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/liucj"/> <property name="username" value="cc"/> <property name="password" value="cc"/> </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/****/dao/po/User.hbm.xml</value> </list> </property> </bean> <bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <!--Dao事务代理Bean的配置 --> <bean id="daoTemplate" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager"> <ref bean="hibernateTransactionManager"/> </property> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED,-MyCheckedException</prop> <prop key="delete*">PROPAGATION_REQUIRED,-MyCheckedException</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <bean id="userDao" parent="daoTemplate"> <property name="target"> <ref bean="userDaoTarget"/> </property> </bean> <bean id="userDaoTarget" class="com.***.dao.impl.UserDaoImpl"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> </beans>
9、写个业务类,我这里用的是bo结尾,值得注意的是我的业务层和Hibernate层我都是用接口和实现类的方式。
LoginBoImpl.java
public class LoginBoImpl implements ILoginBo {
private IUserDao userDao ;
public IUserDao getUserDao() {
return userDao;
}
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
@Override
public boolean isExits(String name) {
// TODO Auto-generated method stub
if(name.equals("liucj")){
return true;
}
return false;
}
@Override
public void addUser(User user) {
// TODO Auto-generated method stub
try{
PoUser poUser = new PoUser();
poUser.setId(0);
poUser.setName(user.getName());
poUser.setPassword(user.getPassword());
this.userDao.saveUser(poUser);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
10、写到这里,Spring的事物基本上已经完成,(其中在applicationContext.xml中也加入了Hibernate的配置)
11、开始写Hibernate层,先写个po对象PoUser.java
public class PoUser {
private int id ;
private String name ;
private String password ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
12、写个映射文件User.hbm.xml
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.***.dao.po.PoUser" table="user" catalog="liucj"> <id name="id" type="java.lang.Integer"> <column name="id" length="4" /> </id> <property name="name" type="java.lang.String" not-null="true"> <column name="username" length="30" /> </property> <property name="password" type="java.lang.String"> <column name="password" length="30" /> </property> </class> </hibernate-mapping>
13、写个dao类,UserDaoImpl.java
public class UserDaoImpl extends HibernateDaoSupport implements IUserDao{
@Override
public void saveUser(PoUser poUser) {
this.getHibernateTemplate().saveOrUpdate(poUser);
}
}
14、此时,所有配置完成,写的类都很简单,所以没有用多长时间,接下来准备加入Ajax,还有Hibernate的缓存。到时候有时间在更新吧。
朋友们如果你看了我的事物控制,估计会提出疑问,我只是在Hibernate层进行了事务管理,
其实应该包装在业务层,就是我上面提的bo层,而action就没有这个必要了。
只是个简单的例子有点说多了,谁有什么好的建议欢迎留言,共通讨论。