SSH 环境搭建(Spring3+Struts2+Hibernate3)

首先下载相应的文件和包:mysql tomcat spring3 struts2 hibernate3

1.先搭建一个struts2的web项目

打开Eclipse,File>>New>>Dynamic Web Project。在WebContent/WEB-INF文件夹下新建一个web.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app id="WebApp_9" version="2.4" 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">  
    
    <!-- 配置struts2为项目的controller -->
    <filter>  
        <filter-name>SSH</filter-name>  
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
    </filter>  
  
    <filter-mapping>  
        <filter-name>SSH</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
  
    <welcome-file-list>  
        <welcome-file>index.html</welcome-file>  
    </welcome-file-list>  
  
</web-app>  
这个web.xml中的<filter>元素定义了一个名为SSH的拦截器以及拦截器的实现类。<filter-mapping>定义了拦截器要拦截的用户请求,这里的话所有的请求都会被拦截下来,然后交给我们写的action来处理,这样的话,通过在web.xml中定义一个filter,完成了struts2的引入。

当然除此之外,我们还要导入struts2的jar包,下载解压后,将要用到的包复制到WebContent/WEB-INF/lib文件夹下。必须的jar包名字大致如下:

commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
freemarker-2.3.18.jar
ognl-3.0.4.jar
struts2-core-2.3.1.2.jar
xwork-core-2.3.1.2.jar
javassist-3.11.0.GA.jar

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>  

    <include file="struts-default.xml" />  
    <package name="register" extends="struts-default">  
        <action name="register" class="com.edu.nju.firstSSH.Action.RegisterAction">  
            <result name="input">/WEB-INF/view/register.jsp</result>  
            <result name="success">/WEB-INF/view/success.jsp</result>  
            <result name="error">/WEB-INF/view/fail.jsp</result>  
        </action>  
    </package>  
  
</struts>  



下面建立Action类,代码如下:

package com.edu.nju.firstSSH.Action;


import com.edu.nju.firstSSH.FormBean.UserForm;
import com.edu.nju.firstSSH.Service.UserService;
import com.edu.nju.firstSSH.Service.UserServiceImp;
import com.opensymphony.xwork2.ActionSupport;


public class RegisterAction extends ActionSupport{


/**
 * 
 */
private static final long serialVersionUID = 1L;
private UserForm userform;
private UserService userService;


public String execute(){
     userService = new UserServiceImp();
     userService.register(userform);
     return "success";
}


public UserForm getUserform() {
     return userform;
}


public void setUserform(UserForm userform) {
     this.userform = userform;
}


}

最后建立Userform类,封装表达数据:

package com.edu.nju.firstSSH.FormBean;


public class UserForm {


private String username;
private String password;
private int gender;

public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}




}
注册表单页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<%@ taglib prefix="s" uri="/struts-tags"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>User Register Page</title>  
</head>  
<body>  
  
    <s:form action="register" method="post">  
        <s:textfield name="userform.username" label="用户名"></s:textfield>  
        <s:password name="userform.password" label="密码"></s:password>  
        <s:select list="#{'1':'男','0':'女'}" listKey="key" listValue="value"  
            name="userform.gender" label="性别" value="1"></s:select>  
        <s:submit value="注册"></s:submit>  
    </s:form>  
  
</body>  
</html>

启动项目(run on server),浏览器访问如下:

说明struts2配置完成。

项目目录如下:



2.加入Hibernate

首先把要用到的hibernate包导入到lib下。

编写PO,首先写数据库实体类,User类,代码如下:

package com.edu.nju.firstSSH.Bean;

public class User {

	private String name;
	private String password;
	private int gender;
	private int userid;
	
	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;
	}
	public int getGender() {
		return gender;
	}
	public void setGender(int gender) {
		this.gender = gender;
	}

	public int getUserid() {
		return userid;
	}

	public void setUserid(int userid) {
		this.userid = userid;
	}
}
User类与数据库中的表结构一一对应。

然后写PO的hibernate配置文件,每一个数据库表都要有一个配置文件和对应的类。配置文件命名为: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 package="com.edu.nju.firstSSH.Bean">  
    <class name="User" table="test">  
        <id name="userid" column="id">  
            <generator class="native"></generator>  
        </id>  
        <property name="name" column="name" type="java.lang.String"  
            not-null="true" length="16"></property>  
        <property name="password" column="password" type="java.lang.String"  
            not-null="true" length="16" />  
        <property name="gender" column="gender" type="java.lang.Integer" length="1" />  
    </class>  
</hibernate-mapping>  
最后配置hibernate,在src中新建hibernate.cfg.xml,代码为:

<?xml version='1.0' encoding='utf-8'?>  
<!DOCTYPE hibernate-configuration PUBLIC  
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  
  
<hibernate-configuration>  
  <session-factory>  
    <!-- Database connection settings -->  
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>  
    <property name="connection.username">root</property>  
    <property name="connection.password"></property>  
  
    <!-- JDBC connection pool (use the built-in) -->  
    <!-- <property name="connection.pool_size">1</property> -->  
  
    <!-- SQL dialect -->  
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  
    <!-- Enable Hibernate's automatic session context management -->  
    <!-- <property name="current_session_context_class">thread</property> -->  
  
    <!-- Disable the second-level cache  -->  
    <!-- <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> -->  
  
    <!-- Echo all executed SQL to stdout -->  
    <property name="show_sql">true</property>  
  
    <!-- Drop and re-create the database schema on startup -->  
    <!-- <property name="hbm2ddl.auto">update</property> -->  
    <mapping resource="com/edu/nju/firstSSH/Bean/User.hbm.xml"/>  
  </session-factory>  
</hibernate-configuration> 

这里还要引入数据库的驱动程序,放在lib下即可。这个配置文件指定了数据源的信息和POJO配置文件列表。


下面建立UserDao借口以及实现程序:

UserDao:

package com.edu.nju.firstSSH.UserDao;

import org.hibernate.Session;

public interface UserDao {

	public void save(Object o);

	public void setSession(Session session);
	
}
UserDaoImp:

package com.edu.nju.firstSSH.UserDao;  
  
import org.hibernate.HibernateException;  
import org.hibernate.Session;  
  
public class UserDaoImp implements UserDao {  
  
    private Session session;  
  

    public Session getSession() {  
        return session;  
    }  
  

    public void setSession(Session session) {  
        this.session = session;  
    }  
  
    @Override  
    public void save(Object obj) throws HibernateException {  
        session.save(obj);  
    }  
  
}

这里的session方法是为了使用sessionFactory的。

最后是service层:

UserService:

package com.edu.nju.firstSSH.Service;

import com.edu.nju.firstSSH.FormBean.UserForm;

public interface UserService {

	public void register(UserForm userForm);
}

UserServiceImp:

package com.edu.nju.firstSSH.Service;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.edu.nju.firstSSH.Bean.User;
import com.edu.nju.firstSSH.FormBean.UserForm;
import com.edu.nju.firstSSH.UserDao.UserDao;
import com.edu.nju.firstSSH.UserDao.UserDaoImp;

public class UserServiceImp implements UserService{

	private Session session;
	private UserDao userDao;
	
	public UserServiceImp(){
		userDao = new UserDaoImp();
	}
	
	@Override
	public void register(UserForm userForm) {
	
		session = HibernateSessionFactory.currentSession();  
		userDao.setSession(session);  
        // 获取事务  
        Transaction ts = session.beginTransaction();  
        // 构造User对象  
        User user = new User();  
        System.out.println("userForm:  "+userForm);
        user.setName(userForm.getUsername());  
        user.setPassword(userForm.getPassword());  
        user.setGender(userForm.getGender());  
        // 保存User对象  
        userDao.save(user);  
        // 提交事务  
        ts.commit();  
        // 关闭Session  
        HibernateSessionFactory.closeSession();  
		
	}
	public Session getSession() {
		return session;
	}

	public void setSession(Session session) {
		this.session = session;
	}


}
HibernateSessionFactory类:

package com.edu.nju.firstSSH.Service;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactory {       
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();        
    private static final Configuration cfg = new Configuration() .configure();        
    private static SessionFactory sessionFactory;        
    public static Session currentSession() throws HibernateException {          
        Session session = threadLocal.get();            
        if (session == null || session.isOpen() == false) {                
            if (sessionFactory == null) {                  
                try {                     
                    sessionFactory = cfg.buildSessionFactory();                  
                } catch (Exception e) {                      
                    e.printStackTrace();                  
                }              
             }                
             session = sessionFactory.openSession();              
             threadLocal.set(session);            
         }            
         return session;      
        } 
    public static void closeSession() throws HibernateException {  
        Session session = threadLocal.get();  
        threadLocal.set(null);  
        if (session != null) {  
            session.close();  
        }  
    }  
}

这是hibernate3获取hibernateFactory的方法。

项目目录为:


至此,项目中加入了hibernate3。


3.引入spring3

首先写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-3.0.xsd">  
  
    <!-- 定义数据源的信息 -->  
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
        destroy-method="close">  
        <property name="driverClass">  
            <value>com.mysql.jdbc.Driver</value>  
        </property>  
        <property name="jdbcUrl">  
            <value>jdbc:mysql://localhost/test</value>  
        </property>  
        <property name="user">  
            <value>root</value>  
        </property>  
        <property name="password">  
            <value></value>  
        </property>  
        <property name="maxPoolSize">  
            <value>80</value>  
        </property>  
        <property name="minPoolSize">  
            <value>1</value>  
        </property>  
        <property name="initialPoolSize">  
            <value>1</value>  
        </property>  
        <property name="maxIdleTime">  
            <value>20</value>  
        </property>  
    </bean>  
  
    <!--定义Hibernate的SessionFactory -->  
    <!-- SessionFactory使用的数据源为上面的数据源 -->  
    <!-- 指定了Hibernate的映射文件和配置信息 -->  
    <bean id="sessionFactory"  
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
        <property name="dataSource">  
            <ref local="dataSource" />  
        </property>  
        <property name="mappingResources">  
            <list>  
                <value>com/edu/nju/firstSSH/Bean/User.hbm.xml</value>  
            </list>  
        </property>  
        <property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
                <prop key="show_sql">true</prop>  
                <prop key="hibernate.jdbc.batch_size">20</prop>  
            </props>  
        </property>  
    </bean>   
    
    <!-- 注册Dao -->
    <bean id="userDao" class="com.edu.nju.firstSSH.UserDao.UserDaoImp">  
        <property name="sessionFactory">  
            <ref bean="sessionFactory" />  
        </property> 
    </bean>  
  
    <!-- 注册业务逻辑类 -->  
    <bean id="userService" class="com.edu.nju.firstSSH.Service.UserServiceImp">  
        <property name="userDao">  
            <ref bean="userDao" />  
        </property>  
    </bean>  
  
    <!-- 注册的Action -->  
    <bean id="reg" class="com.edu.nju.firstSSH.Action.RegisterAction">  
        <property name="userService">  
            <ref bean="userService" />  
        </property>  
    </bean>  
  
    <!-- more bean definitions go here -->  
  
</beans> 
这个文件其实声明了所有要用的对象实例,spring通过这个文件来管理这些实例,每一个实例就是一个<bean>,这样的话java文件中的private属性就不需要初始化了,只需要声明,然后提供getter setter方法就可以,spring会为我们注入这些实例,把他们赋值。

下面修改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>  

    <include file="struts-default.xml" />  
    <package name="register" extends="struts-default">  
        <action name="register" class="reg">  
            <result name="input">/WEB-INF/view/register.jsp</result>  
            <result name="success">/WEB-INF/view/success.jsp</result>  
            <result name="error">/WEB-INF/view/fail.jsp</result>  
        </action>  
    </package>  
  
</struts>  
这里主要改了<action>标签里面的class,原先直接写class=类名,但是这里的话action实例要被spring创建,也就是说交给spring管理,所以要用到applicationContext.xml里面配置好的action才行。这一点很重要,因为如果不用spring的action实例,那么action就是通过构造方法创建的,这样的话,action里面的属性就是空,因为没写初始化(要用spring啊),所以这里必须改为使用spring创建的action实例,这样action里面的属性才会被赋值,否则报nullpointer,我就是遇到这个问题了,开始还以为spring没有注入,但是我在run on server时,它提示了很多关于注入的错误(比如setter没写),所以我觉得spring是注入了,最后才发现是这里的问题。

但是把这里改了以后,又报了一个新错Action class  not found - action - file,大致就是说,reg这个东西并不是类,事实上它也确实不是一个类啊,它是spring管理的一个实例,也就是说struts2不认识spring创建的这个实例,查了半天,才发先是缺少一个包所致,这个包是struts2-spring-plugin-2.0.11.2.jar,它就是负责struts2与spring来整合的,说白了就是让spring来管理struts2的action实例,让struts2识别spring的action实例。到此,spring方面的解决了。

最后还得把spring配置加入到项目中,要修改web.xml为:

<?xml version="1.0" encoding="UTF-8"?>  
<web-app id="WebApp_9" version="2.4" 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">  
    
    <!-- 配置struts2为项目的controller -->
    <filter>  
        <filter-name>SSH</filter-name>  
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
    </filter>  
  
    <filter-mapping>  
        <filter-name>SSH</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>
    <welcome-file-list>  
        <welcome-file>index.html</welcome-file>  
    </welcome-file-list>  
  
</web-app>  
添加一个listerner即可。

当然其他的类也需要修改,大致的内容就是把原来写new实例化的地方去掉,然后为这个private属性添加getter 和setter方法。

另外,由于我这里的搭建过程是按照http://blog.csdn.net/yeohcooller/article/details/9316923这位大神的博文一步一步建立的,之前的两大部分大致相同。

删掉之前的HibernateSessionFactory 类,我们用spring来管理sessionFactory,需要调用session的地方就用下面的方式:

Session session = sessionFactory.openSession();   
session.save(obj);  

这是不使用事务的方式,如果要使用事务的话,要先从session得到事务,再save,再提交事务。

总之hibernate的数据操作流程就是先得到factory,这个又spring提供,然后由factory得到session,session才是操作数据的对象。

还要删掉hibernate.cfg.xml。

下面贴出其他的类的最终实现:

UserDao:

package com.edu.nju.firstSSH.UserDao;


public interface UserDao {

	public void save(Object o);
	
}

UserDaoImp:

package com.edu.nju.firstSSH.UserDao;  
  
import org.hibernate.HibernateException;  
import org.hibernate.Session;  
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
  
public class UserDaoImp implements UserDao {  
  
private SessionFactory sessionFactory;
    @Override  
    public void save(Object obj) throws HibernateException {  
        Session session = sessionFactory.openSession();
        //开始事务;
        Transaction tr = session.beginTransaction();
        //存储    ;
        session.save(obj); 
        //提交事务    ;
        tr.commit();
        session.close();
        sessionFactory.close();
    }
public SessionFactory getSessionFactory() {
         return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
          this.sessionFactory = sessionFactory;
}  
  
}
UserService:

package com.edu.nju.firstSSH.Service;

import com.edu.nju.firstSSH.FormBean.UserForm;

public interface UserService {

	public void register(UserForm userForm);
}
UserServiceImp:

package com.edu.nju.firstSSH.Service;


import com.edu.nju.firstSSH.Bean.User;
import com.edu.nju.firstSSH.FormBean.UserForm;
import com.edu.nju.firstSSH.UserDao.UserDao;

public class UserServiceImp implements UserService{

	private UserDao userDao;
	
	@Override
	public void register(UserForm userForm) {
	
		//userDao.setSession(session);  
        // 构造User对象  
        User user = new User();  
        user.setName(userForm.getUsername());  
        user.setPassword(userForm.getPassword());  
        user.setGender(userForm.getGender());  
        // 保存User对象  
        userDao.save(user);  

	}

	public UserDao getUserDao() {
		return userDao;
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

}
UserForm:

package com.edu.nju.firstSSH.FormBean;

public class UserForm {

	private String username;
	private String password;
	private int gender;
	
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public int getGender() {
		return gender;
	}
	public void setGender(int gender) {
		this.gender = gender;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}


}
User:

package com.edu.nju.firstSSH.Bean;

public class User {

	private String name;
	private String password;
	private int gender;
	private int userid;
	
	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;
	}
	public int getGender() {
		return gender;
	}
	public void setGender(int gender) {
		this.gender = gender;
	}

	public int getUserid() {
		return userid;
	}

	public void setUserid(int userid) {
		this.userid = userid;
	}
}
User.hbm.xml不变

RegisterAction:

package com.edu.nju.firstSSH.Action;

import com.edu.nju.firstSSH.FormBean.UserForm;
import com.edu.nju.firstSSH.Service.UserService;
import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private UserForm userform;
	private UserService userService;
	
	public String execute(){
		//userService = new UserServiceImp();
		userService.register(userform);
		
		return "success";
	}

	public UserForm getUserform() {
		return userform;
	}

	public void setUserform(UserForm userform) {
		this.userform = userform;
	}

	public UserService getUserService() {
		return userService;
	}

	public void setUserService(UserService userService) {
		this.userService = userService;
	}

}
项目目录结构:



访问:






搭建成功!

最后附上项目源码:

http://pan.baidu.com/s/1pKrBv43





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值