SSH整合实例详解

项目构建

新建web项目ssh2,建好后添加struts功能

这里写图片描述

这里写图片描述

添加spring功能:(注意选择的spring版本,并且取消掉MyEclipse自带的jar包,我们之后手动加入相应的jar包)

这里写图片描述

完成之后添加hibernate功能:

这里写图片描述

这里的数据库驱动连接加不加都是可以的,因为后面我们要有一个dbconfig.properties文件手动配置数据库驱动。

这里写图片描述

这里写图片描述

完成之后,我们手动加入struts2+spring+hibernate需要的jar包:

这里写图片描述

spring整合hibernate和struts,只要在配好了applicationContext.xml,在struts的action中直接调用就可以了。hibernate访问数据库的操作都在spring中实现了,spring的调用又在stuts的action中实现了。所以我们删掉了无用的hibernate配置文件hibernate.cfg.xml。

之后就可以在相应的层里实现需要的功能了。以下实现一个简单的注册用户功能:

完成之后我们的项目文件就是下面这样的:
这里写图片描述
这里写图片描述

实现代码

User.java

package com.lmb.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{

    private static final long serialVersionUID = 1L;
    private Long id;
    private String loginname;
    private String password;
    private Integer age;
    private Date birthday;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getLoginname() {
        return loginname;
    }
    public void setLoginname(String loginname) {
        this.loginname = loginname;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((age == null) ? 0 : age.hashCode());
        result = prime * result
                + ((birthday == null) ? 0 : birthday.hashCode());
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result
                + ((loginname == null) ? 0 : loginname.hashCode());
        result = prime * result
                + ((password == null) ? 0 : password.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (age == null) {
            if (other.age != null)
                return false;
        } else if (!age.equals(other.age))
            return false;
        if (birthday == null) {
            if (other.birthday != null)
                return false;
        } else if (!birthday.equals(other.birthday))
            return false;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (loginname == null) {
            if (other.loginname != null)
                return false;
        } else if (!loginname.equals(other.loginname))
            return false;
        if (password == null) {
            if (other.password != null)
                return false;
        } else if (!password.equals(other.password))
            return false;
        return true;
    }



}

User实体类配置文件:

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN"  
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<!-- 
   Mapping file autogenerated by MyEclipse Persistence Tools 
-->  

<!-- xml文件配置Hibernate实体映射 -->  

<hibernate-mapping package="com.lmb.hibernate.domain"><!--实体类所在的包 -->  
    <!-- 实体类 -->  
    <class name="User" table="user"><!--  name=""用来指定实体类, table=""用来指定数据库表格 -->  

        <id name="id" column="id" type="java.lang.Long"><!-- id主键 -->  
            <generator class="native"/><!--数据库自动增长 -->  
        </id>  

         <property name="loginname" type="java.lang.String"></property><!-- 配置实体类变量-->  

        <property name="password" type="java.lang.String"></property><!-- 配置实体类变量-->  
        <property name="age" type="java.lang.Integer"></property><!-- 配置实体类变量--> 
        <property name="birthday" type="java.util.Date"></property><!-- 配置实体类变量-->
    </class>  

</hibernate-mapping>  

UserManagerImpl.java

package com.lmb.manager;

import com.lmb.dao.UserDao;
import com.lmb.domain.User;

public class UserManagerImpl implements UserManager{

    private UserDao userDao;


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


    public void saveUser(User user) {

        userDao.insertObject(user);

    }

}

UserAction.java

package com.lmb.web.action;

import com.lmb.domain.User;
import com.lmb.manager.UserManager;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{

    private User user;
    private UserManager userManager;

    public void setUserManager(UserManager userManager) {
        this.userManager = userManager;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

    public String execute(){
        userManager.saveUser(user);
        return SUCCESS;
    }

}

application-user.xml把有关User的操作的配置从applicationContext.xml分离出来,单独配置;

application-user.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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="userDao" class="com.lmb.dao.UserDaoImpl" parent="baseDao"></bean>

    <bean id="userManager" class="com.lmb.manager.UserManagerImpl">
        <property name="userDao" ref="userDao"></property>
    </bean>

    <bean id="userAction" class="com.lmb.web.action.UserAction" scope="prototype">
        <property name="userManager" ref="userManager"></property>
    </bean>


</beans>

本例中的applicationContext.xml实现了以下作用:

1、配置数据源;
2、配置SessionFactory;
3、配置事务管理;
4、导入分离出的配置文件application-user.xml;

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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <!-- 读取属性文件 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:dbconfig.properties"></property>
    </bean>

    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="url" value="${URL}"></property>
        <property name="driverClassName" value="${DRIVER_CLASS}"></property>
        <property name="username" value="${USER_NAME}"></property>
        <property name="password" value="${PASSWORD}"></property>      
    </bean>

    <!-- 配置SessionFactoryBean -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!-- 注入数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!-- 加载映射配置文件 -->
        <property name="mappingResources">
            <list>
                <value>com/lmb/domain/User.hbm.xml</value>
            </list>
        </property>
        <!-- -如果使用的是@注解的形式,映射的实体类应该以下面这种形式加载->      
        <property name="annotatedClasses">  
                 <list>
                    <value>实体类全路径</value> 
                 </list>
           </property>

        <!-- 关于hibernate属性的配置 -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
            </props>
        </property>

    </bean>

    <bean id="baseDao" class="com.lmb.dao.BaseDaoImpl" abstract="true">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <import resource="application-user.xml" />


</beans>

数据库驱动属性文件:

dbconfig.properties

这里写图片描述

struts.xml中配置控制层的action,因为SSH整合之后struts是由spring来管理的,所以这里的class属性只需要给出spring配置文件中相应action具体实现的id即可;

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

<package name="ssh" extends="struts-default" >

    <action name="userAction" class="userAction">
        <result>/ok.jsp</result>
    </action>

</package>

</struts>    

在web.xml中配置struts的分发器和spring的上下文对象applicationcontext的构建监听器,所有的请求都被映射到struts2上,项目启动时构建applicationcontext对象,并保存到servletContext对象中,在运行时就可以使用spring的上下文对象,这个对象永远不会消失。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <!-- 该监听器的作用:项目启动时构建applicationcontext对象,并保存到servletContext对象中,在运行时就可以使用spring的上下文对象,这个对象永远不会消失 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- 通过该节点告诉servletContext对象到哪里去读取applicationcontext的配置文件,如果配置文件读取失败applicationcontext对象就会构建失败 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping></web-app>

index.jsp

<form action="userAction.action">
        用户名:<input type="text" name="user.loginname" /><br/>
        密码:<input type="password" name="user.password"/><br/>
        年龄:<input type="text" name="user.age"/><br/>
        出生日期:<input type="text" name="user.birth"/><br/>
        <input type="submit" value="submit"/><br/>
    </form>

有关几个配置文件的总结:

1、web.xml

web.xml中要配置struts的分发器,所有的请求都被映射到struts2上。还要配置一个spring的监听器用于构建spring的上下文对象applicationcontext,以便项目启动时构建就applicationcontext对象,并保存到servletContext对象中,在运行时就可以使用spring的上下文对象;

2、struts.xml

struts.xml中只需要配置控制层action的相关信息,要注意因为SSH整合之后spring整合hibernate和struts,所以struts的配置文件struts.xml要依赖于spring的配置文件applicationContext.xml.

以上配置也充分体现了struts的功能: struts 负责 web 层 .ActionFormBean 接收网页中表单提交的数据,然后通过 Action 进行处理,再 Forward 到对应的网页。在 struts.xml 中定义 <action>, 相应的Action就 会加载。

3、applicationContext.xml

spring配置文件applicationContext.xml的作用:

1)、配置数据源;
2)、配置SessionFactory;
3)、配置事务管理;
4)、配置数据持久层;xxxDao
5)、配置业务逻辑层; xxxService(xxxManager)
6)、配置控制层; xxxAction
7)、配置POJO;xxx

在实际的业务应用中,实体会有很多,如果都配置在applicationContext.xml中,管理起来非常麻烦,所以,我们可以把有关实体的配置抽取出来,单独写到一个文件中去application-xxx.xml,该配置文件实现的功能就是:

4)、配置数据持久层;xxxDao
5)、配置业务逻辑层; xxxService(xxxManager)
6)、配置控制层; xxxAction
7)、配置POJO;xxx

而applicationContext.xml只需要将抽取出的配置文件引入并实现以下功能:

1)、配置数据源;
2)、配置SessionFactory;
3)、配置事务管理;

以上配置也充分体现了spring的功能:

spring 负责业务层管理,即 Service (或 Manager).

1) . service (或 Manager)为 action 提供统一的调用接口,封装持久层的 DAO.

2 ).可以写一些自己的业务方法。

3 ).统一的 javabean 管理方法

4 ).声明式事务管理:集成 Hiberante

4、xxx.hbm.xml

配置Hibernate实体映射 ,该实体映射也可以用@注解的形式配置。
Hibernate的配置文件hibernate.cfg.xml的作用是配置数据库驱动,并声明用XML文件或者@注解配置的实体类,但SSH整合之后spring整合hibernate和struts,有关数据库驱动和声明用XML文件或者@注解配置的实体类的配置被放到applicationContext.xml下的SessionFactoryBean配置中,所以该配置文件不需要再用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值