SSH三⼤框架的⼯作原理及流程
摘要: Hibernate⼯作原理及为什么要⽤? 原理: 1.通过Configuration().configure();读取并解析l配置⽂件 2.由l中的读取并解析映射信息 3.通过config.buildSessionFactory();//创建SessionFactory 4.sessionFactory
Hibernate⼯作原理及为什么要⽤?
原理:
1.通过Configuration().configure();读取并解析l配置⽂件
2.由l中的读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作
Transaction()mit();//提交事务
8.关闭Session
9.关闭SesstionFactory
为什么要⽤:
1. 对JDBC访问数据库的代码做了封装,⼤⼤简化了数据访问层繁琐的重复性代码。
1. Hibernate是⼀个基于JDBC的主流持久化框架,是⼀个优秀的ORM实现。他很⼤程度的简化DAO层的编码⼯作
2. hibernate使⽤Java反射机制,⽽不是字节码增强程序来实现透明性。
3. hibernate的性能⾮常好,因为它是个轻量级框架。映射的灵活性很出⾊。它⽀持各种关系数据库,从⼀对⼀到多对多的各种复杂关
系。
2. Hibernate是如何延迟加载?
1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
1. Hibernate3 提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从⽽提⾼了服务器的性能。
3.Hibernate中怎样实现类之间的关系?(如:⼀对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进⾏操作,它们都市对对象进⾏操作,我们程序中把所有的表与类都映射在⼀起,它们通过配置⽂件中的many-to-one、one-to-many、many-to-many、
4.说下Hibernate的缓存机制
1. 内部缓存存在Hibernate中⼜叫⼀级缓存,属于应⽤事物级缓存
2. ⼆级缓存:
a) 应⽤及缓存
b) 分布式缓存
条件:数据不会被第三⽅修改、数据⼤⼩在可接受范围、数据更新频率低、同⼀数据被系统频繁使⽤、⾮关键数据
c) 第三⽅缓存的实现
////////⼀级缓存:session级的缓存也叫事务级的缓存,只缓存实体,⽣命周期和session⼀致。不能对其进⾏管理。
不⽤显⽰的调⽤。
⼆级缓存:sessionFactory缓存,也叫进程级的缓存,使⽤第3⽅插件实现的,也值缓存实体,⽣命周期和sessionFactory⼀致,可以进⾏管理。
⾸先配置第3放插件,我们⽤的是EHCache,在l⽂件中加⼊
true
在映射中也要显⽰的调⽤,
⼆级缓存之查询缓存:对普通属性进⾏缓存。如果关联的表发⽣了修改,那么查询缓存的⽣命周期也结束了。
在程序中必须⼿动启⽤查询缓存:query.setCacheable(true);/////////
5. Hibernate的查询⽅式
Sql、Criteria,object comptosition
Hql:
1、属性查询
2、参数查询、命名参数查询
3、关联查询
4、分页查询
5、统计函数
6.如何优化Hibernate?
1.使⽤双向⼀对多关联,不使⽤单向⼀对多
2.灵活使⽤单向⼀对多关联
3.不⽤⼀对⼀,⽤多对⼀取代
4.配置对象缓存,不使⽤集合缓存
5.⼀对多集合使⽤Bag,多对多集合使⽤Set
6. 继承类使⽤显式多态
7. 表字段要少,表关联不要怕多,有⼆级缓存撑腰
1.Hibernate有哪⼏种查询数据的⽅式
(1)导航对象图查询
(2)OID查询
(3)HQL
(4)QBC
(5)本地SQL
2.load()和get()的区别
load加载⽅法:
Java代码
Users user = (Users)session.load(Users.class, userId);
Users user = (Users)session.load(Users.class, userId);
get加载⽅法:
Java代码
Users user = ((Users.class, userId);
Users user = ((Users.class, userId);
两加载⽅法区别:
区别1:如果数据库中,没有userId的对象。如果通过get⽅法加载,则返回的是⼀个null;如果通过load加载,则返回⼀个代理对象,如果后⾯代码如果调⽤user对象的某个属性(⽐如Password())会抛出异常:org.hibernate.ObjectNotFoundException;
区别2:load⽀持延迟加载,get不⽀持延迟加载。
也就是说:
Java代码
Users user = (Users)session.load(Users.class, userId);
Users user = (Users)session.load(Users.class, userId);
这句代码不会去执⾏数据库查询,只有⽤到user时才会去执⾏数据库查询。
⽽:
Java代码
Users user = ((Users.class, userId);
Users user = ((Users.class, userId);
则⽴即去执⾏数据库查询。所以Users user = (Users)session.load(Users.class, userId);不会执⾏任何sql。
注意:
Java代码
Users user = (Users)session.load(Users.class, userId);
System.out.Id());
Users user = (Users)session.load(Users.class, userId);
System.out.Id());
上⾯这2句代码,不会去执⾏数据库操作。因为load后会在hibernate的⼀级缓存⾥存放⼀个map对象,该map的key就是userId的值,但是当你getId()时,它会去⼀级缓存⾥拿map的key值,⽽不去执⾏数据库查询。所以不会报任何错。不会执⾏任何数据库操作。
阐述struts2的执⾏流程。Struts 2框架本⾝⼤致可以分为3个部分:核⼼控制器FilterDispatcher、业务控制器Action和⽤户实现的企业业务逻辑组件。核⼼控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是需要⽤户来⾃⼰实现的。⽤户在开发Action和业务逻辑组件的同时,还需要编写相关的配置⽂件,供核⼼控制器FilterDispatcher来使⽤。Struts 2的⼯作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。基本简要流程如下:1、客户端浏览器发出HTTP请求。2、根据l配置,该请求被FilterDispatcher接收。3、根据l配置,到需要调⽤的Action类和⽅法,并通过IoC⽅式,将值注⼊给Aciton。4、Action调⽤业务逻辑组件处理业务逻辑,这⼀步包含表单验证。5、Action执⾏完毕,根据l中的配置到对应的返回结果result,并跳转到相应页⾯。6、返回HTTP响应到客。
. Struts⼯作机制?为什么要使⽤Struts?
⼯作机制:
Struts的⼯作流程:
在web应⽤启动时就会加载初始化ActionServlet,ActionServlet从
当ActionServlet接收到⼀个客户请求时,将执⾏如下流程.
-(1)检索和⽤户请求匹配的ActionMapping实例,如果不存在,就返回请求路径⽆效信息;
-(2)如果ActionForm实例不存在,就创建⼀个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
-(3)根据配置信息决定是否需要表单验证.如果需要验证,就调⽤ActionForm的validate()⽅法;
-(4)如果ActionForm的validate()⽅法返回null或返回⼀个不包含ActionMessage的ActuibErrors对象, 就表⽰表单验证成功;
-(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调⽤Action的execute()⽅法;
-(6)Action的execute()⽅法返回⼀个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;
-(7)ActionForward对象指向JSP组件⽣成动态⽹页,返回给客户;
为什么要⽤:
JSP、Servlet、JavaBean技术的出现给我们构建强⼤的企业应⽤系统提供了可能。但⽤这些技术构建的系统⾮常的繁乱,所以在此之上,我们需要⼀个规则、⼀个把这些技术组织起来的规则,这就是框架,Struts便应运⽽⽣。
基于Struts开发的应⽤由3类组件构成:控制器组件、模型组件、视图组件
8. Struts的validate框架是如何验证的?
在struts配置⽂件中配置具体的错误提⽰,再在FormBean中的validate()⽅法具体调⽤。
9.说下Struts的设计模式
MVC模式: web应⽤程序启动时就会加载并初始化ActionServler。⽤户提交表单时,⼀个配置好的ActionForm对象被创建,并被填⼊表单相应的数据,ActionServler根据l⽂件配置好的设置决定是否需要表单验证,如果需要就调⽤ActionForm的 Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调⽤ Action的execute()⽅法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回⼀个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp⽣成动态的⽹页,返回给客户。
session如何设置和读取
10. spring⼯作机制及为什么要⽤?
1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应⽤系统的其他模块负责负责对请求进⾏真正的处理⼯作。
2.DispatcherServlet查询⼀个或多个HandlerMapping,到处理请求的Controller.
3.DispatcherServlet请请求提交到⽬标Controller
4.Controller进⾏业务逻辑处理后,会返回⼀个ModelAndView
5.Dispathcher查询⼀个或多个ViewResolver视图解析器,到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。
为什么⽤:
{AOP 让开发⼈员可以创建⾮⾏为性的关注点,称为横切关注点,并将它们插⼊到应⽤程序代码中。使⽤ AOP 后,公共服务(⽐如⽇志、持久性、事务等)就可以分解成⽅⾯并应⽤到域对象上,同时不会增加域对象的对象模型的复杂性。
IOC 允许创建⼀个可以构造对象的应⽤环境,然后向这些对象传递它们的协作对象。正如单词倒置所表明的,IOC 就像反过来的 JNDI。没有使⽤⼀堆抽象⼯⼚、服务定位器、单元素(singleton)和直接构造(straight construction),每⼀个对象都是⽤其协作对象构造的。因此是由容器管理协作对象(collaborator)。
Spring即使⼀个AOP框架,也是⼀IOC容器。 Spring 最好的地⽅是它有助于您替换对象。有了 Spring,只要⽤ JavaBean 属性和配置⽂件加⼊依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接⼝的协作对象。}
Spring 框架是⼀个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核⼼容器之上,核⼼容器定义了创建、配置和管理 bean 的⽅式,如图 1 所⽰。
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他⼀个或多个模块联合实现。每个模块的功能如下:
核⼼容器:核⼼容器提供 Spring 框架的基本功能。核⼼容器的主要组件是 BeanFactory,它是⼯⼚模式的实现。BeanFactory 使⽤控制反转(IOC)模式将应⽤程序的配置和依赖性规范与实际的应⽤程序代码分开。
Spring 上下⽂:Spring 上下⽂是⼀个配置⽂件,向 Spring 框架提供上下⽂信息。Spring 上下⽂包括企业服务,例如 JNDI、EJB、电⼦邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP 模块直接将⾯向⽅⾯的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象⽀持 AOP。Spring AOP 模块为基于 Spring 的应⽤程序中的对象提供了事务管理服务。通过使⽤ Spring AOP,不⽤依赖EJB 组件,就可以将声明性事务管理集成到应⽤程序中。
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可⽤该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极⼤地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的⾯向 JDBC 的异常遵从通⽤的 DAO 异常层次结构。
Spring ORM:Spring 框架插⼊了若⼲个 ORM 框架,从⽽提供了 ORM 的对象关系⼯具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通⽤事务和 DAO 异常层次结构。
Spring Web 模块:Web 上下⽂模块建⽴在应⽤程序上下⽂模块之上,为基于 Web 的应⽤程序提供了上下⽂。所以,Spring 框架⽀持与Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的⼯作。
Spring MVC 框架:MVC 框架是⼀个全功能的构建 Web 应⽤程序的 MVC 实现。通过策略接⼝,MVC 框架变成为⾼度可配置的,MVC 容纳了⼤量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能可以⽤在任何 J2EE 服务器中,⼤多数功能也适⽤于不受管理的环境。Spring 的核⼼要点是:⽀持不绑定到特定 J2EE 服务的可重⽤业务和数据访问对象。毫⽆疑问,这样的对象可以在不同 J2EE 环境(Web 或 EJB)、独⽴应⽤程序、测试环境之间重⽤。
IOC 和 AOP
控制反转模式(也称作依赖性介⼊)的基本概念是:不创建对象,但是描述创建它们的⽅式。在代码中不直接与对象和服务连接,但在配置⽂件中描述哪⼀个组件需要哪⼀项服务。容器(在 Spring 框架中是 IOC 容器)负责将这些联系在⼀起。
在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在⼀起,决定什么时间调⽤⽅法。下表列出了 IOC 的⼀个实现模式。
Spring 框架的 IOC 容器采⽤类型 2 和类型3 实现。
⾯向⽅⾯的编程
⾯向⽅⾯的编程,即 AOP,是⼀种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的⾏为(例如⽇志和事务管理)进⾏模块化。AOP 的核⼼构造是⽅⾯,它将那些影响多个类的⾏为封装到可重⽤的模块中。
AOP 和 IOC 是补充性的技术,它们都运⽤模块化⽅式解决企业应⽤程序开发中的复杂问题。在典型的⾯向对象开发⽅式中,可能要将⽇志记录语句放在所有⽅法和 Java 类中才能实现⽇志功能。在 AOP ⽅式中,可以反过来将⽇志服务模块化,并以声明的⽅式将它们应⽤到需要⽇志的组件上。当然,优势就是 Java 类不需要知道⽇志服务的存在,也不需要考虑相关的代码。所以,⽤ Spring AOP 编写的应⽤程序代码是松散耦合的。
AOP 的功能完全集成到了 Spring 事务管理、⽇志和其他各种特性的上下⽂中。
IOC 容器
Spring 设计的核⼼是 org.springframework.beans 包,它的设计⽬标是与 JavaBean 组件⼀起使⽤。这个包通常不是由⽤户直接使⽤,⽽是由服务器将其⽤作其他多数功能的底层中介。下⼀个最⾼级抽象是 BeanFactory 接⼝,它是⼯⼚设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。
BeanFactory ⽀持两个对象模型。
□单态模型提供了具有特定名称的对象的共享实例,可以在查询时对其进⾏检索。Singleton 是默认的也是最常⽤的对象模型。对于⽆状态服务对象很理想。
□原型模型确保每次检索都会创建单独的对象。在每个⽤户都需要⾃⼰的对象时,原型模型最适合。
bean ⼯⼚的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应⽤程序代码转移到框架。正如我将在下⼀个⽰例中演⽰的那样,Spring 框架使⽤ JavaBean 属性和配置数据来指出必须设置的依赖关系。
BeanFactory 接⼝
因为 org.springframework.beans.factory.BeanFactory 是⼀个简单接⼝,所以可以针对各种底层存储⽅法实现。最常⽤的 BeanFactory 定义是 XmlBeanFactory,它根据 XML ⽂件中的定义装⼊ bean,如清单 1 所⽰。
清单 1. XmlBeanFactory
BeanFactory factory = new XMLBeanFactory(new FileInputSteam(“l”));
在 XML ⽂件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本⾝不会被初始化。
要从 BeanFactory 检索 bean,只需调⽤ getBean() ⽅法,传⼊将要检索的 bean 的名称即可,如清单 2 所⽰。
清单 2. getBean()
MyBean mybean = (MyBean) Bean(“mybean”);
每个 bean 的定义都可以是 POJO (⽤类名和 JavaBean 初始化属性定义)或 FactoryBean。FactoryBean 接⼝为使⽤ Spring 框架构建的应⽤程序添加了⼀个间接的级别。
IOC ⽰例
理解控制反转最简单的⽅式就是看它的实际应⽤。在对由三部分组成的 Spring 系列的第 1 部分进⾏总结时,我使⽤了⼀个⽰例,演⽰了如何通过 Spring IOC 容器注⼊应⽤程序的依赖关系(⽽不是将它们构建进来)。
我⽤开启在线信⽤帐户的⽤例作为起点。对于该实现,开启信⽤帐户要求⽤户与以下服务进⾏交互:
信⽤级别评定服务,查询⽤户的信⽤历史信息。
远程信息链接服务,插⼊客户信息,将客户信息与信⽤卡和银⾏信息连接起来,以进⾏⾃动借记(如果需要的话)。
电⼦邮件服务,向⽤户发送有关信⽤卡状态的电⼦邮件。
三个接⼝
对于这个⽰例,我假设服务已经存在,理想的情况是⽤松散耦合的⽅式把它们集成在⼀起。以下清单显⽰了三个服务的应⽤程序接⼝。
清单 3. CreditRatingInterface
public interface CreditRatingInterface {
public boolean getUserCreditHistoryInformation(ICustomer iCustomer);
}
清单 3 所⽰的信⽤级别评定接⼝提供了信⽤历史信息。它需要⼀个包含客户信息的 Customer 对象。该接⼝的实现是由 CreditRating 类提供的。
清单 4. CreditLinkingInterface
public interface CreditLinkingInterface {
public String getUrl();
public void setUrl(String url);
public void linkCreditBankAccount() throws Exception ;
}
信⽤链接接⼝将信⽤历史信息与银⾏信息(如果需要的话)连接在⼀起,并插⼊⽤户的信⽤卡信息。信⽤链接接⼝是⼀个远程服务,它的查询是通过 getUrl() ⽅法进⾏的。URL 由 Spring 框架的 bean 配置机制设置,我稍后会讨论它。该接⼝的实现是由 CreditLinking 类提供的。
清单 5. EmailInterface
public interface EmailInterface {
public void sendEmail(ICustomer iCustomer);
public String getFromEmail();
public void setFromEmail(String fromEmail) ;
public String getPassword();
public void setPassword(String password) ;
public String getSmtpHost() ;
public void setSmtpHost(String smtpHost);
public String getUserId() ;
public void setUserId(String userId);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。