基于 Struts2 + Hibernate4 +Spring4 的web项目搭建

首先jar的准备,struts-http://struts.apache.org/download.cgi   Hibernate-http://www.hibernate.org/downloads   spring-http://www.springsource.org/download/community

在这里说明一下,并不是3个框架的所有jar都需要,我们有选择性的加入jar,全部加进去又可能还会出事。

struts:

hibernate:

spring:

另外要再加入一个:aspectjweaver.jar

数据库驱动包:这里用的是mysql数据库,所以使用mysql-connector-java-5.1.25-bin.jar

好吧,开始了。我们将以一个简单的查询用户实例来进行整合。

说一下我的开发环境:myeclipse2013   jdk1.7.0_25  Tomcat7.0.41

先把数据库表给创了,表结构很简单就三个字段 uid,uname,upass

之后随便往表里添点东西,方便我们等一下测试

新建一个web项目,个人喜欢的顺序是IOC、ORM、WEB。加入spring所需的jar,在src目录下新建spring的配置文件,文件名可以随意。个人习惯是bean.xml

在文件里面新建bean节点,来管理dataSource

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/Test"></property>
</bean>

再新建一个bean节点,来管理Hibernate的SessionFactory

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hbm2ddl.auto">update</prop>
<prop key="show_sql">true</prop>
<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
</props>
</property> 
<property name="mappingResources">
<list>
<value>org/ssh/bean/User.hbm.xml</value>
</list>
</property>
</bean>


好了,spring的ORM配置先到这里,我们进行hibernate的配置

先把hibernate所需的jar加入到WEN-INF/lib里边,新建一个类用来映射数据库表,
这里我取的名字是User对应数据库表user
字段很简单,就三个uid,uname,upass。上码

package org.ssh.bean;
import java.io.Serializable;
public class User implements Serializable{
private static final long serialVersionUID = -9110769530375974595L;
private Integer uid;
private String uname;
private String upass;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
}


类实现Serializable接口,除了serialVersionUID之外为每一个字段设置getter和setter。
接下来编写User的映射文件 User.hbm.xml跟User类在同一个包下面,DOCTYPE可以在hibernate-core


-4.2.2.Final.jar/org.hibernate/hibernate-mapping-3.0.dtd找到,上码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping schema="Test" package="org.ssh.bean">
    <class name="User">
    <id column="uid" name="uid" type="java.lang.Integer">
    <generator class="identity"></generator>
    </id>
    <property name="uname" column="uname" type="java.lang.String"></property>
    <property name="upass" column="upass" type="java.lang.String"></property>
    </class>
</hibernate-mapping>


表映射完毕,我们来做一下测试。测试之前请确保你程序已经加入了commons-logging-1.1.3.jar  hibernate和spring都没有提供这一个jar,但是这个日志jar是必须的。

随意新建一个测试类,上码

package org.ssh.test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.ssh.bean.User;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
SessionFactory factory = null;
Session session=null;
try {
factory = (SessionFactory)context.getBean("sessionFactory");
session=factory.openSession();
org.ssh.bean.User user=(User) session.get(User.class, 1);
System.out.println(user);
} catch (BeansException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(session!=null)session.close();
if(factory!=null)factory.close();
}
}
}


如果能够正常的输出用户名的话,那么spring与hibernate整合算好了一半,接下来我们还要增加事务管理

在增加事务管理之前,我们先把Dao层写好。新建UserDao类,在里面把SessionFactory和Session都封装了一把。上码

package org.ssh.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.ssh.bean.User;
public class UserDao {
private SessionFactory factory;
public SessionFactory getFactory() {
return factory;
}
public void setFactory(SessionFactory factory) {
this.factory = factory;
}
public Session openSession(){
return factory.getCurrentSession();
}
/**
* 获取全部用户
* */
public List<User> getListUser(){
List<User> list=null;
list=openSession().createQuery("from User").list();
return list;
}
}

接下来打开spring配置文件,新建bean节点,让spring管理事务

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

新建事务通知节点,配置隔离级别,传播行为,通知哪一些方法需要事务管理

<tx:advice transaction-manager="transactionManager" id="tm">
<tx:attributes>
<tx:method name="get*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

再新建切入点,写一个表达式,告诉程序哪一些类的哪一些方法将需要事务管理

新建织入者,引用上面的事务管理,引用上面的切入点。到这里声明式事务配置完毕

<aop:config>
<aop:pointcut expression="execution(* org.ssh.dao.*.*(..))" id="tp"/>
<aop:advisor advice-ref="tm" id="ta" pointcut-ref="tp"/>
</aop:config>

现在再来测试一把。在测试之前,请确保你的程序已经加了aop所需要的jar。上面提到的struts里面的aopalliance-1.0.jar和aspectjweaver-1.5.0.jar都是必须加进去的

package org.ssh.test;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.ssh.bean.User;
import org.ssh.dao.UserDao;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
UserDao dao = (UserDao)context.getBean("userDao");
List<User> list=dao.getListUser();
for (User user : list) {
System.out.println(user.getUname());
}
}
}

到了这一步如果能正常输出所有用户的用户名,那么spring与hibernate的整合基本完成。

这里说明一下,spring配置文件的根节点beans的几个属性是必须有的,没有这些属性的话,程序有可能会出事。

贴一下beans节点的配置,里面包含了基本的bean节点。还有aop节点,tx节点

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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/aop
            http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
</beans>


接下来我们把struts给整进去,struts与spring整合需要注意的细节相比之下就不是那么多了。

先把struts所需的jar扔进你的程序。我们项目为了跟企业级项目靠近一点,需再增加业务类,取名:UserBiz,上码

package org.ssh.biz;
import java.util.List;
import org.ssh.bean.User;
import org.ssh.dao.UserDao;
public class UserBiz {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public List<User> getListUser(){
return userDao.getListUser();
}
}


之后需要在bean.xml文件增加对该类的管理,老样子,新建一个bean节点

<bean id="userBiz" class="org.ssh.biz.UserBiz">
<property name="userDao" ref="userDao"></property>
</bean>

新建web层的Action类,取名 UserAction,上码

package org.ssh.web.action;
import java.util.ArrayList;
import java.util.List;
import org.ssh.bean.User;
import org.ssh.biz.UserBiz;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private static final long serialVersionUID = -3724476188656181250L;
private UserBiz userBiz;
private List<User> list=new ArrayList<User>();
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
public UserBiz getUserBiz() {
return userBiz;
}
public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
@Override
public String execute() throws Exception {
list=userBiz.getListUser();
return SUCCESS;
}
}


之后需要在bean.xml文件增加对该类的管理,老样子,新建一个bean节点

<bean id="userAction" class="org.ssh.web.action.UserAction">
<property name="userBiz" ref="userBiz"></property>
</bean>

再来,src目录下新建struts.xml文件

<?xml version="1.0" encoding="UTF-8"?>
   <!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="web" extends="struts-default">
<action name="user" class="userAction">
<result>index.jsp</result>
</action>
</package>
</struts>

请仔细观察上面struts的配置文件,里面action的实现类,不再是一个类的完整路径了。而是spring里面为这个Action提供的id

接下来,配置web.xml文件,代开WEN-ING/web.xml文件。增加struts的全局filter,和spring的listener

<filter>
  <filter-name>struts</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>struts</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
  <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:bean.xml</param-value>
</context-param>
  <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

接下来,在你返回的view,我这里是webroot下面的index.jsp.把你拿到的东西在页面打印出来。这里我用到了struts标签

用struts标签之前,别忘了先加入struts标签的taglib

<%@ taglib prefix="s" uri="/struts-tags" %>
    <s:iterator value="list">
    <s:property value="uname"/>
    </s:iterator>

OK,最后一步了,把你项目部署到Tomcat上面,启动他,如果启动过程有关于这个项目的错误的话,多半是跑不起来的。

确认无误后,访问 http://localhost:8080/项目名/Action的name

如果能正确输出所有用户的用户名,那么恭喜你,整合成功了。

第一次写技术博客,感觉写得还是有点凌乱。有什么不足或者看了之后有什么问题,欢迎拍砖。

项目和所需要的jar,都上传到csdn资源了。

http://download.csdn.net/detail/eafon/5770195

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值