SSH框架整合

Posted Sky.宾桀锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH框架整合相关的知识,希望对你有一定的参考价值。

学习搭建框架有得于对框架的理解,排错也比较有思路。这次文章介绍使用eclipse详细整合Spring、Struts2和Hibernate的过程。

需求:使用SSH框架对用户信息保存到数据库中。

做的过程中会遇到很多问题,一步一步慢慢来,整合完Struts2和Spring后先运行项目测试一下有没有问题再继续。问题比较多的是jar包版本和冲突问题,遇到问题很正常,要耐心查看异常慢慢解决,耐心!!

1. 加入jar包

(1)struts2

(2)hibernate

(3)spring

  IOC:spring-beans、spring-context、spring-core、spring-expression、log4j、commons-logging

  AOP:spring-aop、spring-aspects、aopalliance、aspectj.weaver

  事务管理的包:spring-tx、spring-jdbc

  整合Hibernate的包:spring-orm

  整合Web项目的包:spring-web

  整合Junit单元测试的包:spring-test

  连接池:c3p0

(4)日志记录包、数据库连接包、C3P0包

 

2. 配置文件

(1)struts2: web.xml、struts.xml

(2)hibernate: hibernate.cfg.xml(核心文件)、XX.hbm.xml(映射文件)。其中hibernate.cfg.xml文件在SSH整合中可以被省略。

(3)spring: applicationContext.xml、web.xml(配置核心监听器)

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>SSH</display-name>

    <!-- struts2的框架核心过滤器配置 -->
    <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>
    
    <!-- Spring框架的核心监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    

</web-app>

 3. 创建包结构和实体类。

(1)包结构有4个:action、service、dao、entity。这个顺序也是调用的顺序,action调用service, service调用dao...

 

(2)在entity包中创建用户实体类: User.java

package com.jmu.ssh.entity;

/**
 * 实体类:用户
 *
 * @author Sky
 * @date 2017年3月10日 下午10:07:16
 */
public class User {

    private String name;
    private String password;
    private String email;
    
    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 String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

 4. Struts2整合Spring框架

编写UserAction、UserService、UserDao的类,并在applicationContext.xml中配置bean。因为在类中有提供setter方法,所以配置的bean可以按名称自动完成注入。

UserAction.java

package com.jmu.ssh.action;

import com.jmu.ssh.entity.User;
import com.jmu.ssh.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
/**
 * action层注入service类
 *
 * @author Sky
 * @date 2017年3月11日 下午8:06:07
 */
public class UserAction extends ActionSupport {

    private static final long serialVersionUID = 1L;
    
    private User user; //前台传过来的对象
     
    private UserService userService;
    /*
     * 按名称来完成注入UserService
     */
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    @Override
    public String execute(){
        userService.saveUser(user);
        System.out.println("UserAction中的execute执行了...");
        return null;
    }
    
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

UserSerivce.java

package com.jmu.ssh.service;

import com.jmu.ssh.dao.UserDao;
import com.jmu.ssh.entity.User;
/**
 * UserService类,调用UserDao
 * service层注入dao类
 *
 * @author Sky
 * @date 2017年3月11日 下午8:02:26
 */
public class UserService {
    
    private UserDao userDao;
    /*
     * 提供setter方法来注入UserDao
     */
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void saveUser(User user) {
        System.out.println("UserService中的create方法执行了...");
        userDao.saveUser(user);
    }
}

UserDao.java

package com.jmu.ssh.dao;

import com.jmu.ssh.entity.User;

public class UserDao {

    public void saveUser(User user) {
        System.out.println("Dao中的saveUser方法执行了...");
        
    }
}

前台addUser.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>保存用户页面</title>
</head>
<body>
    <form action="userAction" method="post">
        用户名:<input name="name" type="text"/>
        密码:<input name="password" type="password"/>
        邮箱:<input name="email" type="text"/>
        <button>提交</button>
    </form>
</body>
</html>

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.xsd">

    <!-- 配置Action的类,把action交给spring管理 -->
    <bean id="userAction" class="com.jmu.ssh.action.UserAction" scope="prototype">
        <!-- 手动注入Service -->
        <property name="userService" ref="userService"></property>
    </bean>

    <!-- 配置Service的类 -->
    <bean id="userService" class="com.jmu.ssh.service.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>
    
    <!-- 配置Dao类 -->
    <bean id="userDao" class="com.jmu.ssh.dao.UserDao">
    
    </bean>


</beans>

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="ssh" namespace="/" extends="struts-default">
        <!-- action的类由Struts2自身来创建
        <action name="userAction" class="com.jmu.ssh.action.UserAction" method="execute"> -->
        
        <!-- action的类交给Spring框架来创建,方便aop操作 -->
        <action name="userAction" class="userAction" method="execute">
            
        </action>

    </package>
</struts>

 

Struts2和Spring有两种整合方式:

(1)action的类由Struts2自身来创建

  在struts.xml中的action的class要写全类名(包括包名),在applicationContext.xml中不需要配置action的bean。

<?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="ssh" namespace="/" extends="struts-default">
        <!-- action的类由Struts2自身来创建 -->
        <action name="userAction" class="com.jmu.ssh.action.UserAction" method="execute">
    
        </action>
    </package>
</struts>
<?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.xsd">

    <!-- 配置Service的类 -->
    <bean id="userService" class="com.jmu.ssh.service.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>
    
    <!-- 配置Dao类 -->
    <bean id="userDao" class="com.jmu.ssh.dao.UserDao">
    
    </bean>
</beans>

(2)action的类交给Spring框架来创建(建议使用,方便aop操作)

  在struts.xml中的action的class写applicationContext.xml中配置的action类bean即可。

<?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="ssh" namespace="/" extends="struts-default">
        
        <!-- action的类交给Spring框架来创建,方法aop操作 -->
        <action name="userAction" class="userAction" method="execute">
            
        </action>
    </package>
</struts>
<?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.xsd">

    <!-- 配置Action的类,把action交给spring管理 -->
    <bean id="userAction" class="com.jmu.ssh.action.UserAction" scope="prototype">
        <!-- 手动注入Service -->
        <property name="userService" ref="userService"></property>
    </bean>

    <!-- 配置Service的类 -->
    <bean id="userService" class="com.jmu.ssh.service.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>
    
    <!-- 配置Dao类 -->
    <bean id="userDao" class="com.jmu.ssh.dao.UserDao">
    
    </bean>
</beans>

可以启动服务器查看方法是否都执行

5. Spring整合Hibernate

(1)创建映射文件.hbm.xml

  在entity包中创建对应的映射文件: User.hbm.xml(小技巧:选中实体类User.java再右键创建时会自动生成约束和内容)

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-3-10 22:15:16 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.jmu.ssh.entity.User" table="USER1">
        <id name="name" type="java.lang.String">
            <column name="NAME" />
            <generator class="assigned" />
        </id>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" />
        </property>
        <property name="email" type="java.lang.String">
            <column name="EMAIL" />
        </property>
    </class>
</hibernate-mapping>

(2)创建jdbc.properties文件(数据库连接的基本信息)。单独使用Hibernate的时候,数据库连接的基本信息是放在hibernate.cfg.xml中,和Spring整合不再需要hibernate.cfg.xml文件。

jdbc.properties

jdbc.driverClass=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
jdbc.username=binjf
jdbc.password=123456

(3)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"
    xmlns:context="http://www.springframework.org/schema/context"
    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/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    <!-- 引入外部的属性文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!-- 配置连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
    
    <!-- 配置Hibernate的相关属性,需要spring-orm.jar包 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    
        <!-- 注入连接池 -->
        <property name="dataSource" ref="dataSource"></property>
        
        <!-- 配置Hibernate的属性,配置hibernate 的基本信息 -->
        <property name="hibernateProperties">
            <props>
                <!-- hibernate 所使用的数据库方言 -->
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <!-- 执行操作时是否在控制台打印SQL -->
                <prop key="hibernate.show_sql">true</prop>
                <!-- 是否对SQL 进行格式化 -->
                <prop key="hibernate.format_sql">true</prop>
                 <!-- 指定自动生成数据表的策略。update:数据库中有该表就使用,没表就创建 -->
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        
        <!-- 加载Hibernate中的映射文件 -->
        <property name="mappingResources">
            <list>
                <!-- .hbm.xml的全路径,包名用"/"隔开而不是用"." -->
                <value>com/jmu/ssh/entity/User.hbm.xml</value>
            </list>
        </property>
    </bean>

    <!-- 配置Action的类,把action交给spring管理 -->
    <bean id="userAction" class="com.jmu.ssh.action.UserAction" scope="prototype">
        <!-- 手动注入Service -->
        <property name="userService" ref="userService"></property>
    </bean>

    <!-- 配置Service的类 -->
    <bean id="userService" class="com.jmu.ssh.service.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>
    
    <!-- 配置Dao类 -->
    <bean id="userDao" class="com.jmu.ssh.dao.UserDao">
    
    </bean>
</beans>

此时,可以启动项目验证是否已经在数据库中自动创建表。因为User可以为Oracle数据库的关键字,如果在User.hbm.xml中的table="user"是无法创建的,改为table="user1"即可(或其他名字)。

6. 编写Dao中的代码来操作数据库

package com.jmu.ssh.dao;

import org.springframework.orm.hibernate4.support.HibernateDaoSupport;

import com.jmu.ssh.entity.User;
/**
 * 继承HibernateDaoSupport可以不用写SessionFactory就可以注入,直接使用Hibernate提供的模板。
 *
 * @author Sky
 * @date 2017年3月12日 下午12:33:57
 */
public class UserDao extends HibernateDaoSupport {

    /*private SessionFactory sessionFactory;

    public void setSessionfactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }*/

    SSH 框架整合(maven版本 xml配置方式)

SpringMVC+hibernate框架整合源码SSH Dubbo,ZooKeeper

SSH框架整合截图总结

SSH框架整合实现Java三层架构实例

SSH框架系列之 Spring 整合 Hibernate 框架

框架 day37 Spring事务管理,整合web,SSH整合,SSH整合注解