现在开发流行MVC模式,structs在C(控制器)中使用;hibernate在M(模型)中被使用;至于 spring ,最大的作用在于,structs、hibernate的对象,由于在各个层之间相互调用,自己维护不够效率、会产生疏漏,所以,spring 提供一个容器(IOC),structs、hibernate的对象交由spring管理即可。

另外,spring还有一个作用,AOP是切面编程,就是不同地方的相同代码,spring提取出来,进行统一的使用。

总之,spring就是把开发中共性的问题,抽取出来,统一的调用。

MVC中的V(视图),可以用JSP、structs、ExtJs、JQuery等框架或技术实现。

 Structs+Spring+Hibernate,这是很经典的一个搭配,它的开发流程也比较程式化,下面以用户注册为例。
    注册页面代码:

<%@page contentType="text/html;charset=GBK"%>
<html> 
<head><title>Spring、Struts和Hibernate整合之用户注册</title></head> 
<body>${msg}
    <form name="user" action="/myHibernate/regedit.do" method="post"> 
        用户名 <input type="text" name="username" value="${user.username}"/><br> 
密  码 <input type="password" name="password" value="${user.password}"/><br>
        <input type="submit" name="method" value="提交"/> 
    </form> 
</body> 
</html>
  实体Bean类:

package com.myHibernate.bean;
public class User1 {
//    定义id
    private String id = null;
    //定义用户名
    private String username = null;
    //定义密码
    private String password = null;
    //设定id
    public void setId(String id) {
        this.id = id;
    }
    //获取id
    public String getId() {
        return this.id;
    }
    //设定用户名
    public void setUsername (String username) {
        this.username = username;
    }
    //获取用户名
    public String getUsername () {
        return this.username;
    }
    //设定密码
    public void setPassword (String password) {
        this.password = password;
    }
    //获取密码
    public String getPassword () {
        return this.password;
    } }
    对应的映射文件User.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.myHibernate.bean">
  <class name="User" table="user">
  <!--定义id-->   
  <id name="id" column="id">
            <generator class="native"/>
        </id>
      <!--定义用户名-->
      <property name="username"/>
      <!--定义密码-->   
      <property name="password"/>
  </class>
</hibernate-mapping>
    用户DAO接口:

package com.myHibernate.dao;
import com.myHibernate.bean.User;
public interface UserDAO {
    //查询用户
    public abstract User queryUser(String name);
    //新增用户
    public abstract void insertUser(User user);
    //修改用户
    public abstract void updateUser(User user);
    //删除用户
    public abstract void deleteUser(User user);
}
  用户DAO接口实现类:

package com.myHibernate.dao.impl;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.myHibernate.bean.User;
import com.myHibernate.dao.UserDAO;
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO{
    private SessionFactory sessionFactory;
    private String hql = "from User u where u.username = ?";
    //查询用户
    public User queryUser(String name) {
        User user = null;
        //如果查询结果为空
        if (this.getHibernateTemplate().find(hql, name) == null ) {
            user = null;
        } else {
            //不为空时,取第一笔
            user = (User)this.getHibernateTemplate().find(hql, name).get(0);
        }
        return user;
    }
    //新增用户
    public void insertUser(User user) {
        this.getHibernateTemplate().save(user);
    }
    //修改用户
    public void updateUser(User user) {
        this.getHibernateTemplate().update(user);
    }
    //删除用户
    public void deleteUser(User user) {
        this.getHibernateTemplate().delete(user);
    }
}

注册的业务逻辑接口:


package com.myHibernate.domain;
import com.myHibernate.bean.User;
public interface Regedit {
    //保存用户
    public abstract void saveUser(User user);
    //修改用户
    public abstract void updateUser(User user);
    //删除用户
    public abstract void deleteUser(User user);
    //获取是否保存成功的消息
    public abstract String getMsg();
}
  注册的业务逻辑实现:

package com.myHibernate.domain.impl;

import com.myHibernate.bean.User;
import com.myHibernate.dao.UserDAO;
import com.myHibernate.domain.Regedit; public class RegeditImpl implements Regedit{
    private String msg;
    private UserDAO userDao;
    //保存用户
    public void saveUser(User user) {
        userDao.insertUser(user);
        msg = "保存成功";
    }
    //修改用户
    public void updateUser(User user) {
        userDao.updateUser(user);
    }
    //删除用户
    public void deleteUser(User user) {
        userDao.deleteUser(user);
    }
    //获取是否保存成功的消息
    public String getMsg() {
        return msg;
    }
    /**
     * @返回userDao
     */
    public UserDAO getUserDao() {
        return userDao;
    }
    /**
     * @注入userDao
     */
    public void setUserDao(UserDAO userDao) {
        this.userDao = userDao;
    }
}
  用户注册控制器类:

package com.myHibernate.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//导入struts包
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping; import com.myHibernate.bean.User;
import com.myHibernate.domain.Regedit;
//继承action    
public class RegeditAction extends Action {
    //定义接口Regedit
    private Regedit regedit;
    //获取值
      public Regedit getRegedit () {
            return regedit;
      }
      //依赖注入值
     public void setRegedit (Regedit regedit) { 
            this.regedit = regedit;
      }
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest  request, HttpServletResponse response)  throws Exception {   
        //获取用户提交的信息
        User user = (User)form;
        //保存用户提交的信息    
        getRegedit().saveUser(user);
        //将用户提交的信息和是否保存成功的信息存放在request中
        request.setAttribute("user", user);
        request.setAttribute("msg", regedit.getMsg());
        //返回页面
        return mapping.findForward("regedit");
    }
}
  下面是配置文件方面,首先是Hibernate的配置文件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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/myHibernate</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <mapping resource="com/myHibernate/bean/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

然后是Spring的配置文件spring-config.xml:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!--定义数据源-->
    <bean id="dataSource"
       class="org.apache.commons.dbcp.BasicDataSource"
       destroy-method="close">
       <!--设定驱动-->
       <property name="driverClassName">
           <value>com.mysql.jdbc.Driver</value>
       </property>
       <!--设定url-->
       <property name="url">
           <value>jdbc:mysql://localhost/myHibernate</value>
       </property>
       <!--设定用户名-->
       <property name="username">
           <value>root</value>
       </property>
    </bean>
    <!--通过org.springframework.orm.hibernate3.LocalSessionFactoryBean建立联系-->
  <bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       <property name="dataSource">
           <ref local="dataSource" />
       </property>
       <!--定义要使用的映射文件-->
       <property name="mappingResources">
           <list>
              <value>com\myHibernate\bean\User.hbm.xml</value>
           </list>
       </property>
       <!--定义要使用的方言和是否显示sql-->
       <property name="hibernateProperties">
        <props>
           <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
           <prop key="hibernate.show_sql">true</prop>
        </props>
        </property>
    </bean>
    <!--这里添加对事务处理的支持,当然也可以不用-->
  <bean id="transactionManager"
      class="org.springframework.orm.hibernate3.HibernateTransactionManager">
       <property name="sessionFactory">
           <ref local="sessionFactory" />
       </property>
    </bean>
    <!--表示要将下面定义的userDao置于事务处理之下-->
  <bean id="userDaoProxy"
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
     <property name="transactionManager">
         <ref bean="transactionManager" />
     </property>
     <!--要代理userDao-->
     <property name="target">
         <ref local="userDao" />
     </property>
    <!--定义不同情况下,事务处理的方式-->
     <property name="transactionAttributes">
         <props>
            <prop key="create*">PROPAGATION_REQUIRED</prop>
            <prop key="update*">PROPAGATION_REQUIRED</prop>
            <prop key="delete*">PROPAGATION_REQUIRED</prop>
            <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
         </props>
     </property>
   </bean>
   <!--定义userDao-->
  <bean id="userDao" class="com.myHibernate.dao.impl.UserDAOImpl">
       <property name="sessionFactory">
           <ref local="sessionFactory" />
       </property>
  </bean>
    <!--定义regedit,将UserDAO进行注入-->
    <bean id="regedit" class="com.myHibernate.domain.impl.RegeditImpl">
        <property name="userDao">
           <ref local="userDao" />
       </property>
    </bean>
    <!--定义login,将UserDAO进行注入-->
    <bean id="login" class="com.myHibernate.domain.impl.LoginImpl">
        <property name="userDao">
           <ref local="userDao" />
       </property>
    </bean>
    <!--定义和Struts相应的映射,将regedit进行注入-->
    <bean name="/regedit" class="com.myHibernate.action.RegeditAction">
     <property name="regedit">
        <ref bean="regedit"/>
     </property>
    </bean>
    <!--定义和Struts相应的映射,将login进行注入-->
    <bean name="/login" class="com.myHibernate.action.LoginAction">
     <property name="login">
        <ref bean="login"/>
     </property>
    </bean>
</beans>
  然后是Struts的配置文件struts-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config><!--定义formbean--><form-beans><form-bean name="user" type="com.myHibernate.bean.User"/></form-beans>
    <action-mappings>
    <!--定义和SPring配置文件相同的路径-->
        <action path="/regedit" type="org.springframework.web.struts.DelegatingActionProxy" name="user">
            <forward name="regedit" path="/jsp/regedit.jsp"/>
        </action>
        <!--定义初次访问时的路径-->
        <action path="/input"
            type="org.apache.struts.actions.ForwardAction"
            parameter="/jsp/regedit.jsp"/>
        <!--定义和SPring配置文件相同的路径-->
        <action path="/login"
            type="org.springframework.web.struts.DelegatingActionProxy" name="user">
             <forward name="login" path="/jsp/login.jsp"/>
        </action>
        <!--定义初次访问时的路径-->
        <action path="/loginTemp"
            type="org.apache.struts.actions.ForwardAction"
            parameter="/jsp/login.jsp"/>
    </action-mappings>
    <!--注册ContextLoaderPlugIn插件-->
    <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
          <set-property property="contextConfigLocation" value="/WEB-INF/spring-config.xml" />
    </plug-in>
</struts-config>
  最后是Web应用程序配置文件web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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">
    <servlet>
        <servlet-name>actionServlet</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <!--初始参数-->
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>        
        </init-param>
        <load-on-startup>1</load-on-startup>
</servlet>  
<!--处理所有后缀为do的请求-->
    <servlet-mapping>
         <servlet-name>actionServlet</servlet-name>
         <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>
    可以看到,MVC的三层架构思路很清晰,但缺点也很明显,配置文件太过于冗杂,CRUD代码随处冗余,不够简约,下一篇文章中我们将见识到一个解决这个问题的优秀框架—SpringSide。

structs spring hibernate 三者之间有什么关系?的更多相关文章

  1. 来说说JPA、Hibernate、Spring Data JPA之间的什么关系?

    目录 JPA Hibernate Spring Data JPA 实践 来说说JPA.Hibernate.Spring Data JPA之间的什么关系 Java 持久层框架访问数据库的方式大致分为两种 ...

  2. Structs+Spring+Hibernate快速入门

    Structs+Spring+Hibernate,这是很经典的一个搭配,它的开发流程也比较程式化,下面以用户注册为例.     注册页面代码: <%@page contentType=" ...

  3. 第一个structs+spring+hibernate的web程序

    1. 数据库: Column Type Comment id int(11) Auto Increment   name varchar(50) NULL   url varchar(255) NUL ...

  4. 控制层技术:Servlet+reflection、Struts2、Spring MVC三者之间的比较学习

    Servlet Struts2 Spring MVC 处理用户提交的数据 基于MVC设计模式的Web应用程序 是一个框架 是MVC框架 导入servlet包,配置web.xml文件 web.xml & ...

  5. spring各个包之间的依赖关系

    从图中可以看到: 1.spring core,spring beans被其他较多包依赖,spring aop,spring context,spring expression分别被两个包依赖,而spr ...

  6. 用eclipse搭建SSH(struts+spring+hibernate)框架

    声明: 本文是个人对ssh框架的学习.理解而编辑出来的,可能有不足之处,请大家谅解,但希望能帮助到大家,一起探讨,一起学习! Struts + Spring + Hibernate三者各自的特点都是什 ...

  7. Spring整合Shiro 权限 角色 用户关系分析

    Spring整合Shiro 权限 角色 用户关系分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 前置内容 之前我们学习了,使用注解的方式去完成权限的控制,当然,也是静态的,也就 ...

  8. 转:spring data jpa、 hibernate、 jpa 三者之间的关系

    原文链接:spring data jpa. hibernate. jpa 三者之间的关系 spring data jpa hibernate jpa 三者之间的关系 JPA规范与ORM框架之间的关系是 ...

  9. JPA、Hibernate、Spring data jpa之间的关系,终于明白了

    什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们提供了: 1)ORM映射元数据:JPA支 ...

随机推荐

  1. C++调用GDAL库读取并输出tif文件,并计算斑块面积输出景观指数:CSD

    部分源码选自GDAL库的官方网址:www.gdal.org,其余的代码为笔者自己编写. // readfile.cpp : 定义控制台应用程序的入口点. // /* part of the codes ...

  2. poj 2010 Moo University - Financial Aid

                                                                                                Moo Univ ...

  3. CSS3实现半像素边框

    一.思路 普通的1px黑色实线边框: border: 1px solid #000; 半像素边框当然不是简单地把1px改为0.5px(没测试过,可能会被解析成1或者0),border-width的值只 ...

  4. js 函数闭包内部返回函数体调用方法难点解答

    今天在网上,看到一篇关于js函数难点的文章,js函数的一些难点.在那上面提了一下,关于js函数返回另一个函数的问题,并附上了一道面试题: var add = function(x){ var sum ...

  5. Ubuntu 12.04 修改默认启动为字符界面

    sudo vim /etc/default/grub 修改GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 为:GRUB_CMDLINE_LINU ...

  6. MySQL多实例-精典故障案例

    很久以前搭建过MySQL多实例,记得当时很顺利,呵呵!今天公司因为业务需要,我再一次搭建多实例.安装完MySQL后,初始化两个实例时,出现如下报错: 150915  1:10:36 [ERROR] C ...

  7. python学习第三天第一部分

    字典 1.字典的定义和规则: 定义:{key1:value1,key2:value2} key 的定义规则:1.必须是不可变的(数字.字符串.元组):2.必须是唯一的, value的定义规则:任意类型 ...

  8. 【转载】Powershell设置世纪互联Office365嵌套组发送权限

    Start-Transcript ".\Set-GroupSendPermisionLog.txt" -Force function Get-DLMemberRecurse { $ ...

  9. 非阻塞io与记录锁

    非阻塞io 1.对比 阻塞io的例子:scanf从终端获取输入时,如果不输入程序就会一直停在那; 对一个已经有写锁的文件请求读时, 会一直空等直到前面的进程释放锁... 非阻塞的例子:读取文件内容, ...

  10. SQLite数据库的加密【转】

    1.创建空的SQLite数据库. //数据库名的后缀你可以直接指定,甚至没有后缀都可以 //方法一:创建一个空sqlite数据库,用IO的方式 FileStream fs = File.Create( ...