SSH框架

来源:互联网 发布:cms排行 编辑:程序博客网 时间:2024/06/02 04:16

综述

SSH(struts + spring + hibernate)是一个集成框架,是目前较流行的一种Web应用程序开源框架。
集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。
其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。具体做法是:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,然后编写基本的DAO(Data Access Objects,数据库访问对象)接口,并给出Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring做管理,管理struts和hibernate。


图解

今天做了一个(SSH)的小作业,下面的图是自己的一些理解

这里写图片描述

注意

过程中遇到了一些问题,下面这些值得了解一下

openSession和getCurrentSession的区别

Configuration cfg = new Configuration(); // 获得配置信息对象SessionFactory sf = cfg.configure().buildSessionFactory(); //解析并建立Session工厂1. Session session = sf.getCurrentSession(); // 获得Session2. Session session = sf.openSession(); // 打开Session

对于上述的两个方法,有以下区别

  1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。

  2. getCurrentSession ,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,简单而言,getCurrentSession
    就是:如果有已经使用的,用旧的,如果没有,建新的。

注意:在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务(即是使用一个数据库的情况),所以在一般情况下比较少使用openSession或者说openSession是比较老旧的一套接口了;

对于getCurrentSession 来说,有以下一些特点:

1.用途,界定事务边界

2.事务提交会自动close,不需要像openSession一样自己调用close方法关闭session

3.上下文配置(即在hibernate.cfg.xml)中,需要配置:

<property name="current_session_context_class">thread</property>

(需要注意,这里的current_session_context_class属性有几个属性值:jta 、 thread 常用 , custom、managed 少用 )

a).thread使用connection 单数据库连接管理事务

b).jta (java transaction api) Java 分布式事务管理 (多数据库访问),jta 由中间件提供(JBoss WebLogic 等, 但是tomcat 不支持)

源码

下面把实例的源码贴出来

UserInfo.java

package domain;public class UserInfo {    private int _id = 0;//用户ID    private String name = null;//用户姓名    public int get_id() {        return _id;    }    public void set_id(int _id) {        this._id = _id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

UserInfo.hbm.xml

<hibernate-mapping>    <class name="domain.UserInfo" table="USERINFO">        <id name="_id" type="int">            <column name="_ID" />            <generator class="assigned" />        </id>        <property name="name" type="java.lang.String">            <column name="NAME" />        </property>    </class></hibernate-mapping>

inputUserInfo.jsp

<body> <s:form action="inputuserinfo" name="inputForm">     ID  :<input type="text" name="userInfo._id"/><br>      NAME:<input type="text" name="userInfo.name" /><br>             <input type="submit" value="注册"/> </s:form> </body>

struts.xml

<struts>    <package name="default" extends="struts-default" namespace="/">        <action name="inputuserinfo" class="action.UserInfoAction" method="execute">            <result name="success">/success.jsp</result>            <result name="input">/inputUserInfo.jsp</result>            <result name="error">/error.jsp</result>        </action>    </package></struts>

UserInfoAction.class

package action;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import service.UserInfoService;import domain.UserInfo;public class UserInfoAction {    private UserInfo userInfo;    public UserInfo getUserInfo() {        return userInfo;    }    public void setUserInfo(UserInfo userInfo) {        this.userInfo = userInfo;    }    private void save (UserInfo user) {        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");        UserInfoService service = (UserInfoService) context.getBean("userinfoservice");        service.saveUserInfo(user);    }    public String execute() {        String ret = "error";        if (userInfo.get_id() != 0 && !userInfo.getName().equals("")) {            ret = "success";//          SaveUserInfo.saveUserInfo(getUserInfo());//没有使用spring 框架, 使用的是只是hibernate            save(getUserInfo());        } else if (userInfo.get_id() == 0 || userInfo.getName().equals("")) {            ret = "input";        } else {            ret = "error";        }        return ret;    }}

beans.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: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.xsd">    <bean id="userinfoservice" class="service.UserInfoServiceImpl"></bean>    <bean id="userinfodao" class="dao.UserInfoDaoImpl"></bean></beans>

UserInfoService.java

package service;import domain.UserInfo;public interface UserInfoService {    public boolean saveUserInfo(UserInfo user);}

UserInfoServiceImpl.java

package service;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import dao.UserInfoDao;import domain.UserInfo;public class UserInfoServiceImpl implements UserInfoService {    @Override    public boolean saveUserInfo(UserInfo user) {        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(                "beans.xml");        UserInfoDao dao = (UserInfoDao) applicationContext.getBean("userinfodao");        return dao.saveUserInfoInDB(user);    }}

UserInfoDao.java

package dao;import domain.UserInfo;public interface UserInfoDao {    public boolean saveUserInfoInDB(UserInfo user);}

UserInfoDaoImpl.java

package dao;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import domain.UserInfo;public class UserInfoDaoImpl implements UserInfoDao {    @Override    public boolean saveUserInfoInDB(UserInfo user) {        try {            Configuration configuration = new Configuration().configure();            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()                    .applySettings(configuration.getProperties())                    .buildServiceRegistry();            SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);            Session session = factory.getCurrentSession();            Transaction transaction = session.beginTransaction();            session.persist(user);            transaction.commit();            return true;        } catch (HibernateException e) {            e.printStackTrace();            return false;        }    }}

Hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <property name="connection.username">root</property>        <property name="connection.password"></property>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="connection.url">jdbc:mysql://localhost:3306/ssh?useUnicode=true&amp;characterEncoding=utf-8</property>        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>        <!--设置Hibernate自动管理上下文的策略-->          <property name="current_session_context_class">thread</property>         <property name="show_sql">true</property>        <property name="format_sql">true</property>        <property name="hbm2ddl.auto">update</property>        <mapping resource="domain/UserInfo.hbm.xml"/>    </session-factory></hibernate-configuration>

总结

要深入理解SSH框架各自的作用,以及理解三者之间的关联关系

0 0
原创粉丝点击