一.Struts2的工作流程:
1.用户在客户端发起请求,客户端会初始化一个servlet容器请求;
2.servlet容器把请求会传递给context容器,context容器找到目标web工程。
3.进行解析web.xml中的struts标签中的配置:

<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>

4.然后进行struts的一系列的过滤器,如:ActionContextClearUp;
5.接着FilterDispatcher会被调用,它在转发到某个Actio之前,要先询问
ActionMapper(它会判断是否有Action要被执行);
6.如果有,FilterDispatch会将请求交给我们的ActionProxy(Action代理);
7.然后ActionProxy会通过Configure Manager询问框架的具体配置,找到action配置信息,在通过ActionInnvcation

实例Action对象;
8.执行Action对象的方法,返回结果;
9.根据返回结果在struts.xml中Action子标签result跳转具体的处理页面或另一个Action;
10.响应给我们的用户。

二.Hibernate的工作流程:

1.当我们使用myeclipse加入hibernate组件时,这个组件会为我们自动生成HibernateSessionFactory类和

hibernate.cfg.xml文件;
2.在hibernate.cfg.xml中主要进行了sessionFatory的配置,它包括数据库的连接信息,还有缓存信息;

<session-factory>
    <property name="dialect">
        org.hibernate.dialect.Oracle9Dialect
    </property>
    <property name="connection.url">
        jdbc:oracle:thin:@127.0.0.1:1521:orcl
    </property>
    <property name="connection.username">system</property>
    <property name="connection.password">java</property>
    <property name="connection.driver_class">
        oracle.jdbc.driver.OracleDriver
    </property>
    <property name="myeclipse.connection.profile">oeconn</property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="cache.provider_class">
        org.hibernate.cache.EhCacheProvider
    </property>

</session-factory>

3.有谁来读取和解析这么重要的配置文件呢? 当然是HibernateSessionFactory了。
在这个类中有一段静态代码块:

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static org.hibernate.SessionFactory sessionFactory;

    private static Configuration configuration = new Configuration();
    private static ServiceRegistry serviceRegistry;

    static {
        try {
            configuration.configure();
            serviceRegistry = new ServiceRegistryBuilder().applySettings

(configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }

在这个静态代码块中:通过Configuration类的configure方法加载解析hibernate.cfg.xml;同时也创建了

sessionFactory对象(它用来创建session对象的),所以在tomcat服务器启动时就会运行该段代码;
在这里顺便提提session创建过程:
1)为什么session要放在ThreadLocal<Session> 中?
我们的模板类虽然是通过资源池获取数据库连接或会话对象的,根据持久化技术的不同,模板类需要
绑定数据库连接和会话资源,但这些资源本身是非线程安全的,也就是不能被多个线程共享,所以它
Hibernate不需同步就可以解决线程安全问题,所以它将session放在了ThreadLocal中。
2)通过SessionFatory创建一个单例session

public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

        if (session == null || !session.isOpen()) {
            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            session = (sessionFactory != null) ? sessionFactory.openSession()
                    : null;
            threadLocal.set(session);
        }

        return session;
    }

4.创建事务对象session.BeginTransaction方法
5.创建持久化对象session.createQuery方法
6.提交事务
7.关闭session、sessionFactory.

三.Spring的工作流程:
1.在myeclipse中加入Spring组件,产生一个applicationContext.xml文件。
2.在web.xml中加入以下配置:

 <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工程进入到web.xml中扫描,发现有ContextLoaderListener类,监听器,那就说明有Spring组件了。
在找发现<context-param>标签中有classpath值,然后流程转到applicationContext.xml中去;
在beans标签下会加入数据源信息(数据库的配置信息)。

<!-- 加入数据源 -->
    <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName"
            value="oracle.jdbc.driver.OracleDriver">
        </property>
        <property name="url"
            value="jdbc:oracle:thin:@localhost:1521:orcl">
        </property>
        <property name="username" value="empdb"></property>
        <property name="password" value="java"></property>
    </bean>

3.然后通过Ioc控制反转注入bean。实现了对象不用自己new
,Spring会帮你完成,交给他托管。

<!-- 注入JdbcTemplate类 -->
    <bean id="jdbctemp" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 注入dao类 -->
    <bean id="bdao" class="com.dao.BankDao">
        <property name="jtemp" ref="jdbctemp"></property>
    </bean>

SSH三大框架的原理和核心(转)的更多相关文章

  1. SSH三大框架整合案例

    SSH三大框架的整合   SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 ...

  2. SSH三大框架的整合

    SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate ...

  3. ssh三大框架的认识

    一.SSH三大框架的概述 ssh为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架.  集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层 ...

  4. eclipse中SSH三大框架环境搭建<三>

    相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...

  5. eclipse中SSH三大框架环境搭建<二>

    通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...

  6. eclipse中SSH三大框架环境搭建<一>

    这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...

  7. SSH三大框架合辑的搭建步骤

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  8. Maven SSH三大框架整合的加载流程

    <Maven精品教程视频\day02视频\03ssh配置文件加载过程.avi;> 此课程中讲 SSH三大框架整合的加载流程,还可以,初步接触的朋友可以听一听. < \day02视频\ ...

  9. SSH三大框架的知识题

    Struts 谈谈你对Struts的理解. 答: 1.struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是Act ...

随机推荐

  1. 转载:分布式文件系统 - FastDFS 在 CentOS 下配置安装部署(1)

    原文:http://blog.mayongfa.cn/192.html 一.安装 libfastcommon 和 FastDFS 1.下载安装 libfastcommon ,这里是通过wget下载(我 ...

  2. Python 索引迭代

    1.使用enumerate函数 L = ['Adam', 'Lisa', 'Bart', 'Paul'] for index, name in enumerate(L):     print inde ...

  3. Unicode转义序列

    声明: web前端学习笔记,欢迎大神指点.联系QQ:1522025433. Javascipt 定义了一种特殊序列,使用6位ASCII字符代表任意16Unicode内码.这些Unicode转义序列均以 ...

  4. python 全栈开发,Day139(websocket原理,flask之请求上下文)

    昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...

  5. websocket+Django+python+paramiko实现web页面执行命令并实时输出

    一.概述 WebSocket WebSocket的工作流程:浏览器通过JavaScript向服务端发出建立WebSocket连接的请求,在WebSocket连接建立成功后,客户端和服务端就可以通过 T ...

  6. 步步为营-64-进程&线程

    1 进程 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; us ...

  7. javaFX中解决填充(拉伸)问题

    1.margin设置实现 在项目过程中,遇到此问题,如图: 如果窗口缩小,HBox(左边的包含TitledPane那部分)看不到底部 如果窗口拉大,下面就出现空白,HBox高度没拉神 办法:对包含HB ...

  8. Java编程的逻辑 (12) - 函数调用的基本原理

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  9. [Reprinted] 使用Spring Data Redis操作Redis(一) 很全面

    Original Address: http://blog.csdn.net/albertfly/article/details/51494080

  10. POJ 2010 Moo University - Financial Aid (优先队列)

    题意:从C头奶牛中招收N(奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新生所需资助不超过F,同时得分中位数最高.求此中位数. 思路: 先将奶牛排序,考虑每个奶牛作为中位数时,比它 ...