《2022年面试题汇总.docx》由会员分享,可在线阅读,更多相关《2022年面试题汇总.docx(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一、Struts2二、hibernate1、Hibernate工作原理及为什么要用?原理: 1. 读取并解析配置文件2. 读取并解析映射信息,创建SessionFactory3. 打开Sesssion4. 创建事务Transation5. 持久化操作6. 提交事务7. 关闭Session8. 关闭SesstionFactory为什么要用: 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 hibernate使用Java反射机制,而不是字节码增强程序来实现透
2、明性。 hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。2、Hibernate是如何延迟加载? OpenSessionInView? OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。 由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过gett
3、er方法取到其关联对象的值,Hibernate会抛出一个LazyLoad的Exception。所以为了解决这个问题,Spring引入了这个Filter,使得Hibernate的Session的生命周期变长。3、说下Hibernate的缓存机制缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的
4、缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。Session的缓存是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件
5、。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。Hibernate的这两级缓存都位于持久化层,存放的都是数据库数据的拷贝,那么它们之间的区别是什么呢?为了理解二者的区别,需要深入理解持久化层的缓存的两个特性:缓存的范围和缓存的并发访问策略。缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围分为三类。1 事务范围:缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的
6、缓存,缓存内的数据通常采用相互关联的的对象形式。2 进程范围:缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据,但是对象分解为松散的算法比对象序列化的算法要求更快。3 集群范围:在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓
7、存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式。持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据,还可以到进程范围或集群范围的缓存内查询,如果还是没有查到,那么只有到数据库中查询。事务范围的缓存是持久化层的第一级缓存,通常它是必需的;进程范围或集群范围的缓存是持久化层的第二级缓存,通常是可选的。当多个并发的事务同时访问持久化层的缓存的相同数据时,会引起并发问题,必须采用必要的事务隔离措施。事务型:仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读和不可重复读这类的
8、并发问题。读写型:提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题。只读型:对于从来不会修改的数据,如参考数据,可以使用这种并发访问策略。什么样的数据适合存放到第二级缓存中?1、很少被修改的数据 2、不是很重要的数据,允许出现偶尔并发的数据3、不会被并发访问的数据4、参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改不适合存放到第二级缓存的数据? 1 经常被修改的数据 2 财务数据,绝对不允许出现并发 3 与其他应用共享
9、的数据。Hibernate的二级缓存如前所述,Hibernate提供了两级缓存,第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题,因此需要采用适当的并发访问策
10、略,该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate集成。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。Hibernate的二级缓存策略的一般过程如下:1) 条件查询的时候,总是发出一条select * from table_name where . (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。 2) 把获得的所有数据对象根据ID放入到第二级缓存中。 3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库
11、,把结果按照ID放入到缓存。 4) 删除、更新、增加数据的时候,同时更新缓存。二级缓存也称进程级的缓存或SessionFactory级的缓存,它可以被所有的session共享 二级缓存的生命周期伴随着SessionFactory生命周期存在和消亡,SessionFactory可以管理二级缓存 二级缓存的配置和使用: 参见 ”二级缓存的配置使用.docx”Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query缓存。Hibernate的Query缓存策略的过程如下: 1) Hibernate首先根据这些信息组成一
12、个Query Key,Query Key包括条件查询的请求一般信息:SQL, SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等。 2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在,那么返回这个结果列表;如果不存在,查询数据库,获取结果列表,把整个结果列表根据Query Key放入到Query缓存中。 3) Query Key中的SQL涉及到一些表名,如果这些表的任何数据发生修改、删除、增加等操作,这些相关的Query Key都要从缓存中清空。Session的特点有哪些?(1)不是线程安全的,因此在设计软件架构
13、时,应该避免多个线程共享同一个Session实例。(2)Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。(3)在Session 中,每个数据库操作都是在一个事务(transaction)中进行的,这样就可以隔离开不同的操作(甚至包括只读操作)。Session的缓存的作用(1)减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session的缓存可以提高数据访问的性能
14、。(2)保证缓存中的对象与数据库中的相关记录保持同步。当缓存中持久化对象的状态发生了变换,Session并不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的性能。4、Hibernate对象的生命周期,也即三种状态 Hibernate的对象有3种状态, 分别为: 瞬时态(Transient)、 持久态(Persistent)、 脱管态(Detached). 处于持久态的对象也称为PO(PersistenceObject),瞬时对象和脱管对象也称为VO(ValueObject). 1. 瞬时态 2. 由ne
15、w命令开辟内存空间的java对象, 3. eg.Personperson=newPerson(xiaoxiao,女); 4. 如果没有变量对该对象进行引用,它将被java虚拟机回收. 5. 瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象.6. 持久态 7. 处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.如果是用hibernate的delete()方法,对应的持久对象就变成瞬
16、时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联. 8. 当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下. 9. 持久对象具有如下特点: 10. 1.和session实例关联; 11. 2.在数据库中有与之关联的记录. 12. 脱管态 13. 当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象.当脱管对象被重新关联到session上时,并再次转变成持久对象. 14. 脱管对象拥有数据库的识别值,可通过up
17、date()、saveOrUpdate()等方法,转变成持久对象. 15. 脱管对象具有如下特点: 16. 1.本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收;17. 2.比瞬时对象多了一个数据库记录标识值.1. 实体对象的生命周期有三种状态: 2. 1.Transient(自由状态) 3. 此时的实体对象和数据库中的记录无关联,只是一个普通的JavaBean。 4. 2.Persistent(持久状态) 5. 此时的实体对象和数据库中的记录有关联,其变更将由Hibernate固化到数据库中。该实体对象处于由Hibernate框架所管理的状态。 6. 3.Detac
18、hed(游离状态) 7. 处于Persistent状态的对象,其对应的Session实例关闭之后,那么,此对象就处于Detached状态。Detached状态和Transient状态的区别在于Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象5、Get和Load的区别hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,load默认支持延迟加载,在用到对象中的其他属性数 据时才查询数据库,但是万一数据库中不存在该记录,只能抛异常ObjectNotFoundEcception;所说的load方法抛异常是指在使用该
19、对 象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在 load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理(load时候之查询一级缓存,不存在则创建代理)。get() 现在一级缓存找,没有就去二级缓存找,没有就去数据库找,没有就返回null ;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。6、Hibernate的查询方式 导航对象图检索 OID检索 HQL检索 QBC检索 本地SQL检索7、如何优化Hibernate?使用双向一对多关联
20、,不使用单向一对多 灵活使用单向一对多关联 不用一对一,用多对一取代 配置对象缓存,不使用集合缓存 一对多集合使用Bag,多对多集合使用Set 继承类使用显式多态 表字段要少,表关联不要怕多,有二级缓存撑腰8、hibernate常用的主键生成方式及描述9、Hibernate中的update()和saveOrUpdate()的区别saveOrUpdate()方法可以实现update()的功能,但会多些步骤,具体如下: 如果对象在该session中已经被持久化,不进行操作; 对象的标识符属性(identifier property)在数据库中不存在或者是个暂时的值,调用save()方法保存它; 如
21、果session中的另一个对象有相同的标识符抛出一个异常; 以上皆不符合则调用update()更新之。 10、三种检索策略是什么,分别适用于哪种场合?立即检索优点:对应用程序完全透明,缺点:select语句数目多。适用:类级别。延迟检索优点:由应用程序决定加载哪些对象,可以避免执行多余的select语句以及避免加载不需要访问的对象,节省内存空间,提高检索效率。缺点: 应用程序如果要访问游离态的代理类实例,必须保证它在持久化时已经被初始化。适用: 一对多或多对多关联。应用程序不需要立即访问或者根本不会访问的对象。迫切左外连接检索一一:优点:对应用程序完全透明,不管对象处于持久化状态还是游离状态,
22、应用程序都可以方便的从一个对象导航到另一个与它相关联的对象。使用了外连接,select语句数目少。缺点:可能会加载程序不许要访问的对象。复杂的数据库表连接形象检索性能。适用:一对一或多对一关联。应用程序需要立即访问的对象。数据库系统具有良好的表连接性能11、映射继承关系的三种方式?(1)继承关系树的每个具体类对应一张表:在具体类对应的表中,不仅包含和具体类属性对应的字段,还包括与具体类的父类属性对应的字段。(2)继承关系树的根类对应一张表:在根类对应的表中,不仅包括根类属性对应的字段,还包括根类的所有子类属性对应的字段。(3)继承关系树中的每个类对应一张表,每个表中只包括和这个类本身属性对应的
23、字段,子类的表参照父类对应的表。12、ORM解决的不匹配问题(域模型与关系模型之间存在的不匹配)域模型是面向对象的,关系模型是面向关系的。域模型中有继承关系,关系模型中不能直接表示继承关系。域模型中有多对多关联关系,关系模型中通过连接表来表示多对多关联关系。域模型中有双向关联关系,关系模型中只有单向参照关系,而且总是many参照one方。域模型提倡精粒度模型,关系模型提倡粗粒度模型13、hibernate的配置文件(hibernate.properties)中 hibernate.show_sql=true/flase在开发阶和测试段应设置为true,在发布阶段应设置为false14、映射一对
24、多双向关联关系中设置SET元素:请写出级联保存和更新、级联删除应在set元素中需要设置那些子元素?(标明关系、避面重复执行多余SQL语句)Name cascade key column one-to-many inverse15、list要的实现类有那些? 并按照存储结构、机制简单的说一下。LinkedList、ArryList、Vector。LinkedList 采用链表数据结构、ArryList代表大小可变的数组。Vector与ArryList功能比较相似,区别在于Vector采用同步、ArryList没有采用。16、Hibernate中采用XML文件来配置对象-关系映射的优点有那些?Hi
25、bernate既不会渗透到上层域模型中,也不会渗透到下层数据模型中。软件开发人员可以独立设计域模型,不必强迫遵守任何规范。数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范。对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便17、多个事务并发运行时的并发问题有哪些? 第一类丢失更新;脏读;虚读;不可重复读;第二类丢失更新18、session的清理和清空有什么区别?session清理缓存是指按照缓存中对象的状态的变化来同步更新数据库;清空是session关闭;19、在hibernate中使用Inte
26、ger做映射和使用int做映射之间有什么差别使用int做映射,hibernate会自动把int类型转换为Integer类型,以便统一以对象方式处理数据。使用Integer就无须转换。在从数据库中取数据的时候,如果是用Integer做的映射,则要求PO对象中对应的类型也必须为Integer类型,使用的时候需要转换为int。如果是int型,则无须转换。20、session持久化方法区别:save, update, saveOrUpdate 这三个方法使用最为频繁,区别较直观,简单说一下 save:持久化对象,并根据ID生成策略分配ID update(detachedInstance):根据deta
27、chedInstance的ID更新该对象,如果当前session中存在相同ID的persistent instance会抛异常 saveOrUpdate:根据对象ID的unsaved-value来决定是执行save还是update 代码:略 update, merge merge(detachedInstance):merge方法会将detachedInstance的属性复制到相同ID的持久化对象,并返回该持久化对象。save, persist 1.persist把对象进行持久化,但是不保证立刻生成ID,ID的生成可能被推迟到flush的时候2.在transaction外部调用persist的
28、时候并不触发sql Insert.三、Spring1、 Spring的优点是什么?不需要实现框架指定的接口,因此可以轻松的将组件从Spring中脱离,甚至不需要任何修改组件间的依赖关系减少,极大改善了代码的可重用性。Spring的依赖注入机制,可以在运行期为组件配置所需资源,而无需在编写组件代码时就加以指定,从而在相当程度上降低了组件之间的耦合。Spring能消除在许多工程中常见的对Singleton的过多使用。这是一个很大的问题,它降低了系统的可测试性和面向对象的程度通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯Spring被设计为让使用它创建的应用
29、尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。 使用Spring构建的应用程序易于单元测试。Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品(如Hibernate)。2、 Beanfactory和ApplicationContext的区别BeanFactory提供了配制框架及基本功能,而 ApplicationContext 则增加了更多支持企业核心内容的功能。 ApplicationContext完全由BeanFactory扩展而来, 因而BeanFactory所具备的能力和行为也适用于Applica
30、tionContext3、 Spring中bean的作用域(五种)?描述常用的。singleton 在每个Spring IoC容器中一个bean定义对应一个对象实例。 prototype 一个bean定义对应多个对象实例。 request 在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。 session 在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring Application
31、Context情形下有效。 global session 在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。 4、 Transient 关键字的意思和用法。5分Java 的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。t
32、ransient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。5、 匿名类、内部类的区别,在Spring中的典型应用?内部类:一个内部类的定义是定义在另一个内部的类。原因是:1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据。2.对于同一个包中的其他类来说,内部类能够隐藏起来。3.匿名内部类可以很方便的定义回调。4.使用内部类可以非常方便的编写事件驱动程序。在Spring中的应用:HibernateCallbackexecute(new Hi
33、bernateCallback() public Object doInHibernate(Session session) throws HibernateException .)6、 Jdk代理和CGLIB代理的区别,Spring强制使用CGLIB的配置方式?5分JDK动态代理只能对实现了接口的类生成代理,而不能针对类CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承,所以该类或方法最好不要声明成final如何强制使用CGLIB实现AOP? 添加CGLIB库,SPRING_HOME/cglib/*.jar 在spring配置文件中加入7、 自动装配的模式(
34、五种)5分no byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。例如,在bean定义中将autowire设置为by name,而该bean包含master属性(同时提供setMaster(.)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。 byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如果你不
35、希望这样,那么可以通过设置dependency-check=objects让Spring抛出异常。 constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。 autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。 8、 什么IOC,描述你对IOC的理解IoC (Inversion Of Control)中文名为控制反转,就是由容器来控制业务对象之间的依赖关系,而
36、非传统实现中,由代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。控制权的转移带来的好处就是降低了业务对象之间的依赖程度9、Spring有几种DI方式,分别描述DI主要有两种注入方式,即Setter注入和构造器注入构造器注入基于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一个依赖 Setter注入通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即可实现基于setter的DI。10、如何在web应用里面配置spring?org.springframework.web.cont
37、ext.ContextLoaderListener11、spring的jdbc与传统的jdbc有什么区别,其核心类有那些?Spring的jdbc:节省代码,不管连接(Connection),不管事务、不管异常、不管关闭(con.close() ps.close ) JdbcTemplate(dataSource):增、删、改、查 TransactionTemplate(transactionManager):进行事务处理12、spring的事务有几种方式?谈谈spring事务的隔离级别和传播行为。声明事务和编程事务 隔离级别: - DEFAULT使用数据库默认的隔离级别 - READ_UNCO
38、MMITTED会出现脏读,不可重复读和幻影读问题 - READ_COMMITTED会出现重复读和幻影读 - REPEATABLE_READ会出现幻影读 - SERIALIZABLE最安全,但是代价最大,性能影响极其严重 和传播行: - REQUIRED存在事务就融入该事务,不存在就创建事务 - SUPPORTS存在事务就融入事务,不存在则不创建事务 - MANDATORY存在事务则融入该事务,不存在,抛异常 - REQUIRES_NEW总是创建新事务 - NOT_SUPPORTED存在事务则挂起,一直执行非事务操作 - NEVER总是执行非事务,如果当前存在事务则抛异常 - NESTED嵌入式
39、事务四、框架中常用的设计模式 从三方面考虑 要解决的问题、实现方式(类和接口结构)、应用场景 1、 工厂模式2、 代理模式、静态代理、动态代理3、 模板模式 template4、 事件监听模式5、 单例模式单例模式适合于一个类只有一个实例的情况,比如窗口管理器,打印缓冲池和文件系统,它们都是原型的例子。典型的情况是,那些对象的类型被遍及一个软件系统的不同对象访问,因此需要一个全局的访问指针,这便是众所周知的单例模式的应用。当然这只有在你确信你不再需要任何多于一个的实例的情况下。 Struts工作机制?为什么要使用Struts? 工作机制: Struts的工作流程: 在web应用启动时就会加载初
40、始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象当ActionServlet接收到一个客户请求时,将执行如下流程. (1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息; (2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中; (3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; (4)如果ActionForm的validate()方
41、法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功; (5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法; (6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件; (7)ActionForward对象指向JSP组件生成动态网页,返回给客户; 为什么要用: JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。五、其他问题: 1、拦截器 2、Java反射机制 3、java解析xml的方式
限制150内