strutsspringhibernateajaxJQuery原理讲解

 

1、struts原理

struts2并不是一个陌生的web框架,它是以Webwork的设计思想为核心,吸收struts1的优点,可以说

struts2struts1Webwork结合的产物。

struts2 的工作原理图:

一个请求在Struts2框架中的处理分为以下几个步骤:

1.客户端发出一个指向servlet容器的请求(tomcat)

2.这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。

3.过滤器FilterDispatcherstruts2框架的心脏,在处理用户请求时,它和请求一起相互配合访问struts2

的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。

如:ConfigurationManagerActionMapperObjectFactoryConfigurationManager 存有配置文件的一

些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(ActionResults

Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper类来查找请求中

需要用到的Action

4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxyActionProxyAction的代理对象

ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。

5.ActionProxy创建一个ActionInvocation的实例。ActionInvocationActionProxy层之下,它表示了

Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor

6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action

关的所有Interceptor2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在

调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。

7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表

示的过程中可以使用Struts2 框架中继承的标签。

wKiom1YEpznSLeMvAAHpyIfXWc4477.jpg

Struts1struts2的优缺点 

:
 Struts1要求Action类继承一个抽象基类Struts1的一个普遍问题是使用抽象类编程而不是接口。
 Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2Action对象。

线程模式:
 Struts1 Action单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
 Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Servlet 依赖:
 Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
 Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的requestresponse。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

可测性:
 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
 Struts 2 Action可以通过初始化、设置属性、调用方法来测试,依赖注入支持也使测试更容易。

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

表达式语言:
 Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
 Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation Language" (OGNL). 

绑定值到页面(view:
 Struts 1使用标准JSP机制把对象绑定到页面中来访问。  
 Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

类型转换
 Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
 Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

校验:
 Struts 1支持在ActionFormvalidate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象
 Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

Action执行的控制:
 Struts1支持每一个模块有单独的Request Processors生命周期),但是模块中的所有Action必须共享相同的生命周期。
 Struts2支持通过拦截器堆栈Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

 

2、Spring

a) Spring是一个轻量级框架,也是一个全方位的整合框架,对ibatishibernatetoplink以及struts等提供了整合服务。Spring包括有容器、IOCAOP以及一个MVC框架。

b) IOC  直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直器,控制权的转移是所谓反转,也就是说由容器在运行期将组件间的某种依赖关系动态注入组件中

原理:IOC的实现方式就是采用工厂模式来实现的,通过配置文件来配置所有的类以及要给类注入什么对象,然后再通过XMLBeanFactory这个工厂类来解析这个配置文件,根据调用者传过来的参数,获取不同的对象实例,并且根据配置注入关系对象,从而提高系统的灵活新和移植性。

 

c) AOPAspect Oriented Programming的缩写,意思是面向方面编程AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,
AOP可以说也是这种目标的一种实现。它可以解决OOP和过程化方法不能够很好解决的横切(crosscut)问题如:事务、安全、日志等横切关注。当未来系统变得越来越复杂横切关注点就成为一个大问题的时候,AOP就可以很轻松的解决横切关注点这个问题

AOP的实现主要是通过方法的拦截实现.在不使用AOP框架的情况下,我们可以通过JDK提供的动态代理来实现方法的拦截

d) MVC

i. Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer PagesJSP)技术、VelocityTilesiText 和 POISpring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

ii. 优点:易于同其它View框架(Titles等)无缝集成,采用IOC便于测试。   它是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!第二它和tapestry一样是一个纯正的servlet系统,这也是它和tapestry相比 struts所没有的优势。而且框架本身有代码,而且看起来也不费劲比较简单可以理解

iii. Spring是开源的免费的。

3、Hibernate

a) Hibernate是一个开放源代码的对象关系映射(OR-mapping)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSPWeb应用中使用,最具革命意义的是,Hibernate可以在应用EJBJ2EE架构中取代CMP,完成数据持久化的重任。

b) 优点:a. Hibernate 使用 Java 反射机制 而不是字节码增强程序来实现透明性。b.Hibernate 的性能非常好,因为它是个轻量级框架。 映射的灵活性很出色。c. 它支持各种关系数据库,从一对一到多对多的各种复杂关系。

缺点:它限制您所使用的对象模型。(例如,一个持久性类不能映射到多个表)

c) Hibernate的核心接口一共有6个,分别为:SessionSessionFactoryTransactionQueryCriteriaConfiguration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制

d) Hibernate 中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。

e) 一级缓存的管理

当应用程序调用Sessionsave()update()saveOrUpdate()get()load(),以及调用查询接口的 list()iterate()filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象

e. 二级缓存

E1Hibernate的二级缓存策略的一般过程如下:   

1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。   

2) 把获得的所有数据对象根据ID放入到第二级缓存中。   

3) Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。   

4) 删除、更新、增加数据的时候,同时更新缓存。   Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。   

E2什么样的数据适合存放到第二级缓存中? 

很少被修改的数据 

不是很重要的数据,允许出现偶尔并发的数据 

不会被并发访问的数据 

参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。   

E3不适合存放到第二级缓存的数据? 

经常被修改的数据 

财务数据,绝对不允许出现并发 

与其他应用共享的数据。   

E4. 常用的缓存插件 Hibernate 的二级缓存是一个插件,下面是几种常用的缓存插件:   l EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。   

l OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。   

l SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。   l JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。   

上述4种缓存插件的对比情况列于表中。  

缓 存 插 件

支 持 只 读

支持非严格读写

支 持 读 写

支 持 事 务

EhCache


OSCache


SwarmCache



JBossCache



 

4、Ajax

1)AJAX 指异步 JavaScript 及 XMLAsynchronous JavaScript And XML)。

通过 AJAX,您的 JavaScript 可使用 JavaScript 的 XMLHttpRequest 对象来直接与服务器进行通信。通过这个对象,您的 JavaScript 可在不重载页面的情况与 Web 服务器交换数据。   AJAX 在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面。   AJAX 可使因特网应用程序更小、更快,更友好。   AJAX 是一种独立于 Web 服务器软件的浏览器技术。 AJAX 基于下列 Web 标准:   JavaScript XML HTML CSS 在 AJAX 中使用的 Web 标准已被良好定义,并被所有的主流浏览器支持。AJAX 应用程序独立于浏览器和平台。   Web 应用程序较桌面应用程序有诸多优势;它们能够涉及广大的用户,它们更易安装及维护,也更易开发。   不过,因特网应用程序并不像传统的桌面应用程序那样完善且友好。   通过 AJAX,因特网应用程序可以变得更完善,更友好

2)、ajax的优点 

Ajax的给我们带来的好处大家基本上都深有体会,在这里我只简单的讲几点:

 1、最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好。

  2、使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。

  3、可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,ajax的原则是按需取数据,可以最大程度的减少冗余请求,和响应对服务器造成的负担。

4、基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。

3)ajax的缺点

下面我着重讲一讲ajax的缺陷,因为平时我们大多注意的都是ajax给我们所带来的好处诸如用户体验的提升。而对ajax所带来的缺陷有所忽视。

下面所阐述的ajax的缺陷都是它先天所产生的。

1ajax干掉了back按钮,即对浏览器后退机制的破坏。后退按钮是一个标准的web站点的重要功能,但是它没法和js进行很好的合作。这是ajax所带来的一个比较严重的问题,因为用户往往是希望能够通过后退来取消前一次操作的。那么对于这个问题有没有办法?答案是肯定的,用过Gmail的知道,Gmail下面采用的ajax技术解决了这个问题,在Gmail下面是可以后退的,但是,它也并不能改变ajax的机制,它只是采用的一个比较笨但是有效的办法,即用户单击后退按钮访问历史记录时,通过创建或使用一个隐藏的IFRAME来重现页面上的变更。(例如,当用户在Google Maps中单击后退时,它在一个隐藏的IFRAME中进行搜索,然后将搜索结果反映到Ajax元素上,以便将应用程序状态恢复到当时的状态。)

但是,虽然说这个问题是可以解决的,但是它所带来的开发成本是非常高的,和ajax框架所要求的快速开发是相背离的。这是ajax所带来的一个非常严重的问题。

2、安全问题

技术同时也对IT企业带来了新的安全威胁,ajax技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。ajax的逻辑可以对客户端的安全扫描技术隐藏起来,允许***从远端服务器上建立新的***。还有ajax也难以避免一些已知的安全弱点,诸如跨站点脚步***、SQL注入***和基于credentials的安全漏洞等。

3、对搜索引擎的支持比较弱。

4、破坏了程序的异常机制。至少从目前看来,像ajax.dllajaxpro.dll这些ajax框架是会破坏程序的异常机制的。关于这个问题,我曾经在开发过程中遇到过,但是查了一下网上几乎没有相关的介绍。后来我自己做了一次试验,分别采用ajax和传统的form提交的模式来删除一条数据……给我们的调试带来了很大的困难。

5、另外,像其他方面的一些问题,比如说违背了url和资源定位的初衷。例如,我给你一个url地址,如果采用了ajax技术,也许你在该url地址下面看到的和我在这个url地址下看到的内容是不同的。这个和资源定位的初衷是相背离的。

 

 

 

 

6、一些手持设备(如手机、PDA等)现在还不能很好的支持ajax,比如说我们在手机的浏览器上打开采用ajax技术的网站时,它目前是不支持的,当然,这个问题和我们没太多关系。 

 

4)、ajax原理和XmlHttpRequest对象 

 

Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。 

XMLHttpRequestajax的核心机制,它是在IE5中首先引入的,是一种支持异步请求的技术。简单的说,也就是javascript可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。 

所以我们先从XMLHttpRequest讲起,来看看它的工作原理。 

首先,我们先来看看XMLHttpRequest这个对象的属性。 

它的属性有: 

onreadystatechange 每次状态改变所触发事件的事件处理程序。 

responseText 从服务器进程返回数据的字符串形式。 

responseXML 从服务器进程返回的DOM兼容的文档数据对象。 

status 从服务器返回的数字代码,比如常见的404(未找到)和200(已就绪) 

status Text 伴随状态码的字符串信息 

readyState 对象状态值 

0 (未初始化对象已建立,但是尚未初始化(尚未调用open方法) 

1 (初始化对象已建立,尚未调用send方法 

2 (发送数据) send方法已调用,但是当前的状态及http头未知 

3 (数据传送中已接收部分数据,因为响应及http头不全,这时通过responseBodyresponseText获取部分数据会出现错误, 

4 (完成数据接收完毕,此时可以通过通过responseXmlresponseText获取完整的回应数据。 

5、JQuery

Jquery是继prototype之后又一个优秀的Javascrīpt框架。它是轻量级的js(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。jQuery使用户能更方便地处理HTML documentsevents、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可。

 

a) 

6、dd

 

 

Jquery 优点:
   1.轻量级 
      库比较小巧,对ajax DHTML  做了基本封装,无侵入性。可比较方便的加入其他框架,不影响jquery本身或其他框架使用) 
   扩展插件比较多。
  2. 支持跨浏览器。   对基本的一些DHTML做了封装。简单易用。使开发者不必要关注浏览器差异。

 缺点 :
     jquery 只包含基本库。 
   (此问题也不能说明是缺点,因为jquery 的插件库很多,提供各种各样的扩展。因为没找到啥缺点,所以以此凑数)

V

 

 

 

 

 

 

dwr 优点:   
  1 .可以直接调用java类。 
  2.隐藏了 ajax中的过程实现。 可以直接由js 调用 java类。
  3. 可以对参数进行 转换成 javaBean (其实是js 对象。 转换和定义相同类型的js 对象由框架完成,只要做简单实体映射转换配置)  
  4. 可以较为简单的实现服务器推技术  

  缺点:
  1.暴露了后台方法。  
  2.只能使用java作为后台。
  3. 效率上比jquery 这样的框架慢
  4. dwr 主要侧重 方法调用   不侧重 网页元素 dom的操作

 

 

 

 

1. struts实现MVC的思想?

MVC = 模型、视图、控制器
模型:这个一般不由Struts来做
视图:视图也不算struts的强项,但是struts提供优秀的标签来支持视图的展示,利用标签,struts可以将数据合理的展示给用户
控制器:struts的重要功能,提供struts的过滤器,拦截用户的请求,查找struts配置文件,为其匹配一个对应的Action,这个Action负责调用模型,获得数据,然后对数据做部分处理,接着Action再将处理后的数据,为其选择一个视图进行输出

 

2. Tomcat启动时classloader加载顺序 


Tomcatclass加载的优先顺序一览   
1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。   
2.环境变量CLASSPATH中的jarclass文件。   
3.$CATALINA_HOME/common/classes下的class文件。   
4.$CATALINA_HOME/commons/endorsed下的jar文件。   
5.$CATALINA_HOME/commons/i18n下的jar文件。   
6.$CATALINA_HOME/common/lib   下的jar文件。   
JDBC驱动之类的jar文件可以放在这里,这样就可以避免在server.xml配置好数据源却出现找不到JDBC   Driver的情况。)   
7.$CATALINA_HOME/server/classes下的class文件。   
8.$CATALINA_HOME/server/lib/下的jar文件。   
9.$CATALINA_BASE/shared/classes   下的class文件。   
10.$CATALINA_BASE/shared/lib下的jar文件。   
11.各自具体的webapp   /WEB-INF/classes下的class文件。   
12.各自具体的webapp   /WEB-INF/lib下的jar文件。   
class的搜寻顺序如下:   
-------------   
Bootstrap   classes   of   your   JVM     
System   class   loader   classses   (described   above)     
/WEB-INF/classes   of   your   web   application     
/WEB-INF/lib/*.jar   of   your   web   application     
$CATALINA_HOME/common/classes     
$CATALINA_HOME/common/endorsed/*.jar     
$CATALINA_HOME/common/i18n/*.jar     
$CATALINA_HOME/common/lib/*.jar     
$CATALINA_BASE/shared/classes     
$CATALINA_BASE/shared/lib/*.jar