SSH三大框架的原理和核心(转)
一.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三大框架的原理和核心(转)的更多相关文章
- SSH三大框架整合案例
SSH三大框架的整合 SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 ...
- SSH三大框架的整合
SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate ...
- ssh三大框架的认识
一.SSH三大框架的概述 ssh为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层 ...
- eclipse中SSH三大框架环境搭建<三>
相关链接: eclipse中SSH三大框架环境搭建<一> eclipse中SSH三大框架环境搭建<二> 引言:通过上两篇文章我们已经可以掌握struts2和spring的环境的 ...
- eclipse中SSH三大框架环境搭建<二>
通过上一篇博客我们可以轻松搭建strtus2的环境,接下来由我来继续介绍spring的环境搭建以及spring注入的简单使用 相关链接:eclipse中SSH三大k框架环境搭建<一> ec ...
- eclipse中SSH三大框架环境搭建<一>
这里先简单介绍一下我用的三大框架版本以及下载地址 相关链接:eclipse中SSH三大框架环境搭建<二> eclipse中SSH三大框架环境搭建<三> struts-2.3.3 ...
- SSH三大框架合辑的搭建步骤
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Maven SSH三大框架整合的加载流程
<Maven精品教程视频\day02视频\03ssh配置文件加载过程.avi;> 此课程中讲 SSH三大框架整合的加载流程,还可以,初步接触的朋友可以听一听. < \day02视频\ ...
- SSH三大框架的知识题
Struts 谈谈你对Struts的理解. 答: 1.struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是Act ...
随机推荐
- 028_rync和inotify实现实时备份
一.服务节点安装inotify-tools. 确保系统后以下输出=> [root@xxxx]# ll /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 roo ...
- aliyun服务器ecs被ddos后无法被zabbix-server监控的处理
ecs绑定的域名被ddos攻击后,阿里云黑洞ecs服务器一个月,此时zabbix服务端无法联系到zabbix-agent会一直报错 解决办法: 1.在ecs前添加slb并把之前指向ecs的域名a.ch ...
- centos 6.5环境利用iscsi搭建SAN网络存储服务及服务端target和客户端initiator配置详解
一.简介 iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够 ...
- CentOS 6.5环境下heartbeat高可用集群的实现及工作原理详解
Linux HA Cluster高可用服务器集群,所谓的高可用不是主机的高可用,而是服务的高可用. 什么叫高可用:一个服务器down掉的可能性多种多样,任何一个可能坏了都有可能带来风险,而服务器离线通 ...
- 转载:获取Nginx源码(1.3.5)《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19616.html 可以在Nginx官方网站(http://nginx.org/en/download.html)获取Nginx源码包 ...
- 常用adb操作命令详解
1. 查看当前运行的所有设备adb devices 返回当前设备列表 这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会列出显示2. 安装软件adb install验证是否 ...
- Python-生产者消费模型 线程
7.生产者消费者模型(*****)(思聪吃热狗代码) 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题. 该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度 为什么要使 ...
- Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)
一.前言 app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新版本app.在线更新分为以下几个步骤: 1, 通过接口获取线上版本号,versionC ...
- TStringList 复制 赋值。
方法1:list2.addstrings(list1) 特点是:不会清空list2中原有的数据. 方法2:list2.assign(list1) 特点是:会清空list2中原有的数据(直接替换链表节点 ...
- hdu4122
题目很长,有点恶心,但实际上是个单调队列 没搞出来,题解 https://blog.csdn.net/lvshubao1314/article/details/46910271 #include< ...