三大框架整合_第1页
三大框架整合_第2页
三大框架整合_第3页
三大框架整合_第4页
三大框架整合_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Struts2的原理详解Struts2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户 实现的业务逻辑组件。在这3个部分里,Struts 2框架提供了核心控制器 FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。核心控制器:FilterDispatcherFilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行 在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过 滤用户请求。如果用户请求以action结尾,该请求将被转入Struts2框架处理。Struts2框架获得了*

2、.action请求后,将根据*.action请求的前面部分决定调用 哪个业务逻辑组件,例如,对于login.action请求,Struts2调用名为login的Action 来处理该请求。Struts2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action 时,定义了该Action的name属性和class属性,其中name属性决定了该Action 处理哪个用户请求,而class属性决定了该Action的实现类。Struts2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而 是Action代理一一为用户实现的业务控制器并没有与Servlet AP

3、I耦合,显然无 法处理用户请求。而Struts2框架提供了系列拦截器,该系列拦截器负责将 HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。一个请求在Struts2框架中的处理大概分为以下几个步骤.客户端初始化一个指向Servlet容器(例如Tomcat)的请求,即 HttpServletRequest 请求。.这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做 ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成 很有帮助,例如:SiteMe

4、sh Plugin)接着 FilterDispatcher 被调用,FilterDispatcher 询问 ActionMapper 来决定这个 请是否需要调用某个Action.如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交 给 ActionProxy.ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的 Action 类.ActionProxy 创建一个 ActionInvocation 的实例。.ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉

5、及 到相关拦截器(Intercepter)的调用。.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应 的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一 个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框 架中继承的标签。在这个过程中需要涉及到ActionMapper在上述过程中所有的对象(Action,ObjectFactory 来创建的。Results,Interceptors, 等)都是通过使用Struts2的好处Struts2基于MVC架构,框架结构清晰,开发流程一目

6、了然,开发人员可以很 好的掌控开发的过程。使用OGNL进行参数传递。OGNL提供了在Struts2里访问各种作用域中的数据的简单方式,你可以方便的获 取 Request, Attribute,Application, Session, Parameters 中的数据。大大简化了 开发人员在获取这些数据时的代码量。强大的拦截器Struts2的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截 器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的,可 以将一些通用的功能如:登录验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。在我实

7、现的的一 Web项目中,就是使用Struts2的 拦截器来完成了系统中的权限验证功能。易于测试Struts2的Action都是简单的POJO,这样可以方便的对Struts2的Action编写测 试用例,大大方便了 Java Web项目的测试。易于扩展的插件机制在Struts2添加扩展是一件愉快而轻松的事情,只需要将所需要的Jar包放到 WEB-INF/lib文件夹中,在struts.xml中作一些简单的设置就可以实现扩展。常用 的Struts2的扩展可以通过这个链接找到: HYPERLINK /S2PLUGINS/home.html /S2PLUGINS/home.html模块化Struts2

8、已经把模块化作为了体系架构中的基本思想,可以通过三种方法来将应 用程序模块化:将配置信息拆分成多个文件把自包含的应用模块创建为插件创建新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到 多个应用中去。全局结果与声明式异常为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过 程中出现指定异常时,可以跳转到特定页面,这一功能十分实用。阐述struts2的执行流程。Struts 2框架本身大致可以分为3个部分:核心控制器 FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。核心控制 器FilterDispatcher是Struts

9、2框架的基础,包含了框架内部的控制流程和处理机 制。业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发 Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器 FilterDispatcher来使用。Struts 2的工作流程相对于Struts 1要简单,与WebWork 框架基本相同,所以说Struts 2是WebWork的升级版本。基本简要流程如下:1、 客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被FilterDispatcher 接收。3、根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC 方式,将值

10、注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步 包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结 果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。Spring的原理一、IoC(Inversion of control):控制反转1、IoC:概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创 建各个实例之间的依赖关系核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean二、AOP(Aspect-Oriented Programming):面向方面编程1、代理的两种方式:静态

11、代理:针对每个具体类分别编写代理类;人针对一个接口编写一个代理类;人动态代理:针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy 类为各种接口动态生成相应的代理类2、AOP的主要原理:动态代理Spring工作原理Spring已经用过一段时间了,感觉Spring是个很不错的框架。内部最核心 的就是IOC 了,动态注入,让一个对象的创建不用new 了,可以自动的生产,这其实就是利用java里的反射反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的。Spring还有一个核

12、心就是AOP这个就是面向切面编程,可以为某一类对象 进 行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的模块)从而达到对一个模块 扩充的功能。这些都是通过配置类达到的。Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关 联,都是通过配置类说明管理的(Spring根据这些配置内部通过反射去动态的组装对象)要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些 服务和功能。Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了, 是一个很常用的设计模式)Spring里的配置是很多的,很难都记住,但是Spring

13、里的精华也无非就是以上 的两点,把以上两点跟理解了 也就基本上掌握了 Spring.使用spring的好处:1:降低了各个组件之间的耦合度,实现了软件中不同层的解耦.那就是使用Spring容器给我们提供的那么多服务,比如:事务管理服务,消 息服务等等。这样我们就不用去手工的去管理事务了3.Spring容器给我们提供了,单例模式,这样我们不用去自己写实现代码容器提供的AOP编程技术,使我们可以很好的实现权限拦截,运行期间监控容器为我们提供了许多辅助类,提高我们的开发速度,如JdbcTemplate,HibernateTemplate最后当然就是Spring对目前主流的框架提供非常好的支持了,这样

14、方便我 们的应用开发一、Hibernate 原理:通过 Configuration().configure();读取并解析 hibernate.cfg.xml 配置文件由 hibernate.cfg.xml 中的mapping resource=com/xx/User.hbm.xml/取并解 析映射信息通过 config.buildSessionFactory();/建 SessionFactorysessionFactory.openSession();/打开 Sesssionsession.beginTransaction();/创建事务 Transationpersistent oper

15、ate 持久化操作session.getTransaction().commit();/提 交事务关闭 Session关闭 SesstionFactory二、为什么要用:对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代 码。Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他 很大程度的简化DAO层的编码工作hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它 支持各种关系数据库,从一对一到多对多的各种复杂关系。三、Hibernate是如何延迟加载

16、?Hibernate2延迟加载实现:a)实体对象b)集合(Collection)Hibernate3提供了属性的延迟加载功能当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据 的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开 销,从而提高了服务器的性能。四、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行 操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、五、说下Hi

17、bernate的缓存机制内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存二级缓存:应用及缓存分布式缓存条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一 数据被系统频繁使用、非关键数据第三方缓存的实现/一级缓存:session级的缓存也叫事务级的缓存,只缓存实体,生命周期 和session 一致。不能对其进行管理。不用显示的调用。二级缓存:sessionFactory缓存,也叫进程级的缓存,使用第3方插件实现的, 也值缓存实体,生命周期和sessionFactory 一致,可以进行管理。首先配置第3放插件,我们用的是EHCache,在hibernate.cf

18、g.xml文件中加入true 在映射中也要显示的调用,二级缓存之查询缓存:对普通属性进行缓存。如果关联的表发生了修改,那么查 询缓存的生命周期也结束了。在程序中必须手动启用查询缓存:query.setCacheable(true);/六、Hibernate的查询方式Sql、Criteria,object comptositionHql:1、属性查询2、参数查询、命名参数查询3、关联查询4、分页查询5、统计函数七、如何优化Hibernate?使用双向一对多关联,不使用单向一对多灵活使用单向一对多关联不用一对一,用多对一取代配置对象缓存,不使用集合缓存一对多集合使用Bag,多对多集合使用Set继承

19、类使用显式多态表字段要少,表关联不要怕多,有二级缓存撑腰l.Hibernate有哪几种查询数据的方式导航对象图查询OID查询HQLQBC本地SQL2.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)session.get(Users.class, userid);Users user = (Users

20、)session.get(Users.class, userid);两加载方法区别:区别1:如果数据库中,没有userid的对象。如果通过get方法加载,则返回的 是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用 user对象的某个属性(比如user.getPassword()会抛出异常: org.hibernate.ObjectNotFoundException;区别2: load支持延迟加载,get不支持延迟加载。也就是说:Java代码Users user = (Users)session.load(Users.class, userid);Users use

21、r = (Users)session.load(Users.class, userid);这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。而:Java代码Users user = (Users)session.get(Users.class, userid);Users user = (Users)session.get(Users.class, userid);则立即去执行数据库查询。 所以 Users user = (Users)session.load(Users.class, userid);不会执行任何sql。注意:Java代码Users user = (Use

22、rs)session.load(Users.class, userid);System.out.println(user.getid();Users user = (Users)session.load(Users.class, userid);System.out.println(user.getid();上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓 存里存放一个map对象,该map的key就是userid的值,但是当你getid()时, 它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何 错。不会执行任何数据库操作。Strutsl

23、 和 struts2 的区别类:Strutsl要求Action类继承一个抽象基类。Strutsl的一个普遍问题是使用抽象 类编程而不是接口。Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制 的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的 Action 对象。线程模式:Strutsl Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例 来处理所有的请求。单例策略限制了 Strutsl Action能

24、作的事,并且要在开发时 特别小心。Action资源必须是线程安全的或同步的。Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实 际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾 回收问题)Servlet 依赖:Strutsl Action 依赖于Servlet API ,因为当一个Action被调用时 HttpServletRequest 和 HttpServletResponse 被传递给 execute 方法。Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要, Struts2 Actio

25、n仍然可以访问初始的request和response。但是,其他的元素减少 或者消除了直接访问HttpServetRequest和HttpServletResponse的必要性。可测性:测试Struts1 Action的一个主要问题是execute方法暴露了 servlet API (这使得 测试要依赖于容器)。一个第三方扩展 Struts TestCase 提供了一套Struts1 的模拟对象(来进行测试)。Struts 2 Action可以通过初始化、设置属性、调用方法来测试,依赖注入支持 也使测试更容易。捕获输入:Strutsl使用ActionForm对象捕获输入。所有的ActionFo

26、rm必须继承一个基类。 因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。 动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可 能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。 输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面 上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对 象,能够用作输入/输出对象。这

27、种ModelDriven特性简化了 taglib对POJO输入 对象的引用。表达式语言:Strutsl整合了 JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集 合和索引属性的支持很弱。Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言ObjectGraph Notation Language (OGNL).绑定值到页面(view):Struts 1使用标准JSP机制把对象绑定到页面中来访问。Struts 2使用ValueStack技术,使taglib能够访问值而不需要把你的页面 (view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但

28、类型不同的属性重用页面(view)。类型转换:Struts 1 ActionForm 属性通常都是 String 类型。Struts1 使用 Commons-Beanutils 进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。校验:Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架 使用为属性类类型定义的校验和内容校验,来支持chain校验子属性Action执行的控制:Strutsl支持每一个模块有单独的Request Processors (生命周期),但是模块中 的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的 生命周期。堆栈能够根据需要和不同的Action 一起使用。Ibatis 和 hibernate 的区别:最大的区别在于:ibatas的sql语句需要自己手动写,而hibernate能够在程序运行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论