《2023年Java基础知识及面试题.pdf》由会员分享,可在线阅读,更多相关《2023年Java基础知识及面试题.pdf(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java基础1.什么是类?类是某一种事物的一般性的集合体,是相同的或相似的各个事物共同特性的一种抽象。2.什么是对象?在面向对象概念中,对象是类的实例。对象与类的关系就像变量与数据类型的关系同样。3.类的核心特性封装性:类的封装性为类的成员提供公有的、缺省的、保护的、私有的等多级访问权限。目的是隐藏类中的私有变量和类中方法的实现细节。继承性:类的继承性提供从已存在的类创建新类的机制,继承使一个新类自动拥有被继承类的所有可继承的成员。多态性:类的多态性提供类中方法执行的多样性,有两种表现形式:重载和覆盖。4.方法:对象中方法表达了对象所具有的行为。5.属性:一个对象的属性是可以被外界或对象所处的
2、环境所感知或操纵的数据或状态。6.什么是Java?J a v a 是一门易于编程的跨平台编程语言,同时又是一个开发、应用、执行和部署的平台。7.为什么要有Java?J a v a 与平台无关、一次编译处处运营、以及他的易于编程的特性。8.Java开发程序的环节?编 写 源 代 码(2)编 译(3)执行9.Java的环境变量1)J A V A-H O M E j d k 的安装途径2)C L A S S P A T H j v m 转载c l a s s 字节码文献时的搜索途径3)P A T H 是系统的环境变量、命令的搜索途径10.JVM:J a v a V i r t u a l M a c
3、 h i n e 是一个逻辑的操作系统、它屏蔽了硬件和平台的信息、j v m 能将字节码文献解释并执行、正是这种独立执行的方式是J a v a 具有与平台无关的特性。1 1 .类的加载过程:类加载器加载字节码文献到内存、j v m 内存数据区将对象状态放置在堆区、各线程使用的变量放在栈区、类的特性放在方法区、然后进行字节码验证再执行。1 2 .常用的 J a v a 命令:J a v a c、j a v a、j a v a d o c、j a r1 3 .类的语法与规范一个源文献只能有一个p u b l i c 的类P u b l i c 源文献可以有多个类定义源文献名必须与p u b l i
4、 c 类名保持一致包名必须放在第行包名可以有0个或1 个但不能有多个源文献假如带包的话最佳存放在包结构相应的目录下标记符程序语言用于标记变量名类名方法名的字符串就是标记符。标记符必须字母下划线美元符开头大小写敏感。类名规定首字母大写方法名首字母小写每个单词首字母大写常量名所有字母大写假如有两个或几个字母的联合用下划线连接关键字:程序语言中、程序已经所有用户不能再使用的单词一般关键字都是小写1 4.数据类型:基本数据类型:整 型(b y te、sh ort,int long)默认是int浮点型(f loat、d oub le)、默认是 d oub le布尔型(b oole an)字符型(c h
5、ar)引用类型:类、接口、数组1 5 .main ”“=”相等运算符“=位运算符 :取反、.:异或、|:或、&:与逻辑运算符“&”“I I”条件运算符a?b :c1 8 .变量的作用域(1)类的成员变量:静态成员变量:生命周期从类加载开始到类被卸载结束初始化后被放在方法区实例成员变量:变量初始化放在堆区、生命周期从生成对象开始到对象被I回收时结束(2)局部变量:方法或代码块中定义的变量、局部变量从栈区弹出结束、局部变量在使用前必须初始化(3)方法的参数(4)异常的参数1 9 .数组:是相同类型元素的线性集合是一个指向数组的引用对象2 0 .集合框架Collectjon IMapTreeMapA
6、.K.I|LinkedList|j HashSet|U nkedHashSetUnkedHashMapUtilitiesCdlecticnsComparableComparatorArraysI t e r a t or 是一个迭代器接口L i s t I t e r a t or 继承自I t e r a t or 是子接口只能用于1 i s t 接口Colle ct i on是集合框架的顶层接口L i s t 有序可反复Ar r a y L i s t 实现了可变数组的数据结构L i nk e dL i s t实现了双向链表的数据结构Set无序不可反复H a s h S e t实现了无序不
7、可反复L i nk e dH a s h S e t有序不可反复(插入的顺序)T r e e S e t升序不可反复M a p是一个k e y、v a lu e对映射H a s h M a p按照k e y无序L i nk e dH a s h M a p 按照 k e y 有序T r e e M a p按照k e y升序Colle ct i ons是集合框架的辅助类(工具类)里边的所有方法都是s t a t i c的Ar r a y s是对数组的工具类Comp a r a ble Comp a r a t or是做比较排序的2 1.V e ct or 和 Ar r a y L i s t 的
8、区别:1)V e ct or是线程安全的(同步的)Ar r a y L i s t不 是Ar r a y L i s t的效率高一些2)当初始容量满的时候V e ct o 增长本来的一倍、Ar r a y L i s t增长本来的一半2 2.H a s h T a ble 和 H a s h M a p 的区别:1)H a s h T a ble是线程安全H a s h M a p不 是H a s h M a p的效率会高一些2)H a s h M a p 允许 nu ll 的 k e y 存在 H a s h T a ble 不允许2 3.S e t s e t=M a p.k e y S
9、e t ();I t e r a t or i t=s e t.i t e r a t or ();W h i le (i t.h a s ne xt()2 4.类的结构类名、属性名(静态属性、实例属性)、方 法(静态方法、实例方法)、构造器(缺省构造器、带参构造器)静态代码块s t a t i c、实例代码块t h i s.2 5.参数传递对于基本类型将实际的变量的值原样的赋值以便传值对于引用类型将引用类型变量的地址赋值给实参26.th is 关键字都在什么地方使用1)实例变量与局部变量同名用th is 区分实例变量名与局部变量名2)在构造器重载时、用 th is 调用其它构造器3)在实例方
10、法中用来当作当前对象的引用传给其它方法27.方法的重载方法名要相同、在同一类中多个方法有不同的方法署名方法署名具有参数类型参数个数和参数顺序、返回类型不做规定28.类的初始化过程1)在堆区分派空间new的过程2)给对象属性赋默认值3)调用构造方法进一步赋值29.构造器类中提供的用于初始化对象的特殊的方法、这个方法于类同名无返回值、类中没有提供构造器jvm 会提供一个不带参的缺省构造器、类中有带参的构造器jvm就不提供了30.具体说明封装、继承、和多态封装:将类的实现细节隐藏起来、对外提供一致的接口、提高系统的维护性继承:定义:一个类自动获得另一个类的属性或者方法的过程使用方面:extends关
11、键字、单根继承、所有类都是Object类的子类、构造器不能被继承、子类初始化时会默认情况下调用父类缺省的构造器、子类调用父类带参的构造器则父类可以不提供缺省的构造器否则一定要有个缺省的构造器如何使用继承?1)区分has-a 和 is-a2)子类要扩充父类的功能3)子类需要大量置换父类的功能时不能使用继承4)不要从工具类中继承优缺陷:优点:继承是最容易复用代码的形式、修改父类的功能时子类可以自动获得新的功能缺陷:打破了封装、只是类型复用多态:编译时编译器检查声明类型和方法信息运营时j v m 对实例方法和引用变量和实际引用对象动态绑定,对静态方法和引用变量声明的类型静态绑定类的属性在编译阶段绑定
12、3 1.i n s t a n c e o f:判断实例是否为某个类型或子类型(1)只能在父子类进行比较(2)N u l l 可以进行比较 结果为f a l s e(3)判断实例类型时,一般从子类开始,然后父类3 2.o v e r r i d e:方法覆盖。子类重写父类中的方法子类重写父类中的方法的条件:(1)方法名相同(2)方法署名相同(参数)(3)返回值相同(4)子类的修饰符要大于等于父类的修饰符(5)子类抛出的异常要小于等于父类抛出的异常3 3.依赖关系(1)一个类中的方法,其局部变量类型是另一个类,则这两个类具有依赖关系(2)一个类中的方法调用另一个类中的静态方法,则这两个类具有依赖
13、关系(3)一个类中的方法中参数是另一个类的静态方法,则这两个类具有依赖关系3 4.多态的运营机制(1)在类编译阶段,编译器会检查类型是否匹配(2)在运营阶段,j v m 会调用实例的相应方法,先检查父类方法,然后检查子类方法,然后会检查实例声明的类型3 5.S u p e r调用父类的属性和方法、子类和父类有同名的方法时,子类可用s u p e r 区分是父类的方法3 6.f i n a l(1)f i n a l 修饰的类不能被继承(2)f i n a l 修饰的方法不能被覆盖(3)f i n a l 修饰的变量是常量,常量不可修改但有例外实例常量:若定义时没有赋值,则可以在构造器或实例代码
14、块中赋值,构造器或者代码块赋值只能有一个静态常量:若定义时没有赋值,则可以在静态代码块中赋值,3 7.抽象类具有部分实现的类。使用时的注意事项:(1)不能实例化(2)可有0到多个抽象方法(3)可有构造器(4)具体类继承抽象类时必须实现所有的抽象方法(5)抽象类可以间接的被子类调用其构造器,并在内存中分派空间,间接实例化(6)抽象类可以有静态方法,可以返回其子类的实例如何使用抽象类?(1)把各个类中可以共用的方法和逻辑放到抽象的父类中,越多越好(2)属性应尽也许放到子类中3 8.接口定义:从宏观角度说是一个规范,从面向对象角度说,接口是一种抽象类型(1)属性是常量,一定要赋值(2)方法是抽象方法
15、(3)没有构造器(4)接口支持c a s t i n g (强制类型转换)(5)接口可以继承自多个接口(6)实现接口的类必须要实现所有的方法,假如是抽象类可以选择实现部分的方法为什么要使用接口?(1)可插拔性的保证,可以随意更换接口的实现类(2)接口可以解决多继承的问题(3)接口使规范的制定者、实现者、使用者分开3 9.接口和抽象类的区别(1)接口没有任何实现,而抽象类可以有部分实现也可以没有(2)假如需要复用或者共享代码,应当用抽象类而不是接口(3)继承无法解决的类型转换问题,接口是为解决这问题而产生的40.访问控制作用域当前类R-p a c k a g e子孙类其他 p a c k a g
16、 ep u b l i cVVJJp r o t e c t e dVJJXd e f a u l tJVXXp r i v a t eJXXX41 .s t a t i c 修饰符(1)可以修饰属性,称为静态属性,全类公有常叫做类变量,和具体对象无关,无多态,类名去访问,类加载的时候初始化(2)修饰方法,静态方法中只能访问静态成员,非静态方法可以访问静态成员,工具类的对象都是s t a t i c 的(3)修饰代码块,初始代码块是在类中,而不在任何方法之内的代码块,被 s t a t i c 修饰的代码块称为静态代码块,静态代码块在类加载的时候运营一次42 .异常定义:jv m 将程序运营中
17、的不正常情况的现场信息打包成一个对象,这个对象就是异常类对象。并且将此对象抛出,交由相应的方法或对象解决。异常信息记录了错误的因素,指出了错误的位置,打印错误的栈信息。异常解决机制是责任链机制即子类取默认值不解决,交由父类解决直到追究到jv m 然后抛给用户43 .为什么解决异常?最本质的因素是让程序执行完毕44.异常类的层次结构T h r o w a b l e:E r r o r:是错误,程序运营中发生的系统异常,此种异常当前程序一般无法解决Exe p t i o n:c h e c k e d ()编译器逼迫必须捕获并解决的异常Un c h e c k e d (R u n t i m
18、e Exe p t i o n )对于此种异常编译器不规定捕获因素是:低档错误(l o w-g r a d e m i st a k e)、程序员可以避免的错误当错误发生时、捕获异常也无济于事4 5.如何解决异常(1)交给自己解决、交由当前方法解决(2)交给别人解决、由调用该方法的方法来解决(3)自己解决一部分、然后调用系统的异常方法方 法(2)的环节:(1)在方法后声明也许发生的异常类型(t h r o w s Exc e p t i o n t y p e)(2)该方法不用在做其它异常解决(3)调用方法必须解决被调用方法的异常4 6.t h r o w的注意事项(1)t h r o w可以
19、抛另一种类型的异常(2)t h r o w语句后不能再有其它代码、t h r o w后的代码永远不会被执行4 7.异常的捕获t r y(c a t c h(Exc e p t i o n t y p e 1)m e t h o d b o d y l c a t c h(Exc e p t i o n t y p e 2)m e t h o d b o d y 2)(1)在t r y c a t c h 句中也许抛出不止一个异常、但是每个时刻只能抛出一个异常(2)对也许抛出的每一种异常分别用c a t c h )来解决(3)Ca t c h语句解决多重异常应遵从从子类到父类的顺序4 8.fi
20、n a l l y用于资源的释放、在异常解决中fi n a l l y一定会被执行到、Fi n a l l y语句中假如有r e t u r n语句、正常运营先执行fi n a l l y再执行r e t u r n语句返回当发生异常时、先执行c a t c h语句捕获异常、假如没有c a t c h语句、则执行fi n a l l y语句及其后语句4 9.自定义异常为什么要自定义异常?J a v a程序员可定义更多的方法来解决异常、自定义异常可以提供更复杂更具体的方法、这样能极大的加强软件的健壮性、代码更加清楚如何自定义异常(1)继承Exe p t i o n使你的自定义异常变成c h e
21、c k e d异常(2)继承R u n t i m e Exe p t i o n使你的自定义异常变成u n c h e c k e d异常50.1 0 :流是数据输入输出的通道、流中的数据是有序的流的分类:按数据流动方向:输入流、输出流输入流:只能从中读取字节数据、而不能向其写出数据输出流:只能从中写出字节数据、而不能向其读取数据按流所解决的数据类型:字节流:解决字节数据字符流:解决字符数据按流所解决的源:节点流:从一个特定的1 0设备读写数据的流解决流:对已存在的流进行连接和封装的流i n t r e a d():读取一个字节,并将它返回。i n t r e a d (b y t e b
22、u ffe r):将数据读入一个字节数组,同时返回读取的字节数。v o i d c l o se ():关闭流。节 点 流 处 理 流W nterBufferedW iiterPuntW ntei|-I*ileIAVi itei-Filtei Wi itei51.线程线程和进程的区别:(1)每个进程都有独立的代码和数据空间、进程间的切换会有较大的开销(2)线程可以当作是轻量级的进程、同一类线程共享代码和数据空间、每个线程有独立的运营栈和程序计数器、线程切换的开销小。(3)多线程是在同一应用程序中有多个顺序流同时执行。(4)多进程是在操作系统中能同时运营多个任务。52.创建线程的两种方式:(1)
23、定义一个线程类它继承Thread并重写其中的run()方法,方法run()称为线程体(2)提供一个实现接口runable的类作为线程的目的对象、在初始化一个thread类或者thread子类的线程对象时把目的对象传递给这个线程实例、由该目的对象提供线程体53.比较创建线程的两种方式:使用runable接口可以(1)将cpu、代码、数据分开、形成清楚的模型(2)可以从其它类继承(3)保持程序风格一致性直接继承Thread类不能从其它类继承、编写简朴可以直接操纵线程54.线程状态*-G M “线程状态N e w:创建状态。当创建一个新的线程时、它就处在创建状态、此时它仅仅是一个空的线程对象、系统不
24、为它分派资源R u n n a b l e:可运营状态。当线程处在创建状态时、可调用s t a r t ()方法来启用它、产生运营这个线程所需的系统资源、安排其运营D e a d:死亡状态。线程终止(1)自然撤消。线程的r u n ()正常退出(2)强制停止。调用线程实例的s t o p。可以强制停止当前线程B l o c k e d:停滞状态。(1)通过s l e e p ()让线程进入休眠状态(2)通过w a i t ()暂停线程(3)线程正等待某个1 0 设备动作完毕(4)线程试着调用另一个对象的s y n c h r o n i z e d 函数、并且尚未取到对象的机锁5 5 .守护线
25、程(d a e m o n T h r e a d)是为其它线程提供服务的线程、一般应是一个独立的线程、它的r u n ()是一个无限循环5 6 .守护线程与其它线程的区别假如守护线程是唯一运营着的线程、程序会自动退出。5 7 .互斥锁(对象锁)保证共享数据的完整性每个对象都相应于一个可称为互斥锁的标记、这个标记用于保证在任意时候只能有一个线程访问该对象5 8 .使用sy n c hr o n iz e d 的时机(1)这个函数是否修改对象内关键变量的状态、(关键变量是能被其它线程读取或修改的变量)(2)这个函数是否和关键变量的状态有依存关系(3)基类的方法为sy n c hr o n iz
26、e d 时、sy n c hr o n iz e d 不能被继承、复写时重新采用sy n c hr o n iz e d5 9 .释放锁假如一个线程一个占用一个对象的锁、则其它线程将永远无法访问该对象、因此需要在适当的时候将对象的锁归还(1)当线程执行到sy n c hr o n iz e d 的块结束时、释放对象锁(2)当在sy n c hr o n iz e d 块中碰到b r e a k、r e t u r n 或抛出异常、则自动释放对象锁(3)当一个线程调用w a it ()时、它放弃拥有的对象锁并进入等待队列60.死锁是指两个线程都互相等待对方释放锁、是不可预知或避开的、应采用措施避
27、免死锁的出现。61 .sl e e p ()和w a it ()的区别(1)S l e e p ()是T hr e a d类的方法、w a it ()是O b je c t类的方法(2)S l e e p ()可以在非sy n c hr o n iz e d函数中被调用、w a il ()只能在sy n c hr o n iz e d函数或同步块中被调用(3)S l e e p ()不会释放对象机锁、w a it ()会释放对象锁(4)使用场景不同、sl e e p ()方法同一个线程内间隔多长时间后再次执行此任务、w a it ()是多个线程之间JDBC1 .J DB C连接数据库的基本环节
28、:(1)注册驱动程序(2)建立连接(3)发送和执行sq l语句(4)解决结果(5)释放资源2 .常用对象(1)c o n n e c t io n建立与数据库的连接Dr iv e r M a n a ge r类的ge t C o n n e c t io n ()将建立数据库的连接(2)st a t e m e n t将sq l语句发送到数据库中存在三种st a t e m e n t对象S t a t e m e n tP r e p a r e d S t a t e m e n tC a l l a b l e S t a t e m e n t(3)R e su l t包含符号sq l
29、语句执行结果集、并且通过一套ge t方法提供了对这些行中的数据的访问3 .事务的基本概念及如何在J DB C中实现事务事务是一些事件的集合、执行一条sq l语句可以理解成一个事务、事务中包含多个事件、假如每一个事件都能执行成功的时候、事务才执行、假如任何一个事务不能成功执行、事务的其它事件也不能被执行。J DB C解决事务的代码:b o o l e a n d e f a u l t C o m m it -c o n n.ge t A u t o C o m m it();c o n n.se t A u t o C o m m it(f a l se);t r y (st m t.e x
30、e c u t e U p d a t e(st r S Q L l);st m t.e x e c u t e U p d a t e(st r S Q L 2);c o n n,c o m m i t ();)c a t c h(Ex c e p t io n e)c o n n,r o l l b a c k();e.p r in t S t a c kT r a c e();f in a l l y if (st m t !=n u l l)st m t.c l o se O ;if (c o n n !=n u l 1)c o n n,c l o se ();)conn.setAut
31、oCommit(defaultCommit);Servlet 和 JSP1.serv let和 JSP的关系J S P 是以此外一种方式实现了se r v l e t、se r v l e t 是J S P 的初期版本、在J S P 中更加注重页面的表现、而在s er vlel中更加注重业务逻辑的实现。因此当编写的页面显示效果比较复杂时、首选J S P、或者在开发过程中、htm l代码经常发生变化而J a va 代码相对比较固定期可以选择J S P、而我们在解决业务逻辑时首选则是s er vlet、同时J S P 只能解决浏览器的请求、而s er vlet可以解决一个客户端的应用程序请求、因此
32、s er vlet加强了w eb 服务器的功能2.serv let的生命周期(1)服务器加载s er vlet(2)创建s er vlet实例(3)调用s er vlet实例的i ni t()(4)收到请求(5)调用s er vi c e()(6)s er vi c e()解决请求并将输出结果返回客户端(7)s er vlet等待下一个请求、转 到(4)继续向下执行(8)s er vlet在服务器调用des tor y ()然后卸载3.init()调用时机(1)服务器第一次访问s er vlet的时候被调用(2)在w eb.x m l中设立loa d-on-s ta r lup =0情况下、服
33、务器启动的时候调用4.D es tr oy ()调用时机(1)s er vlet在被卸载前(2)s er vlet很长时间没有被使用5.H ttpS es s i on接口的功能和使用方法这是一个j a va,s er velt.http包中的接口、它封装了会话的概念它的定义为pub li c i nter fa c e H ttpS es s i on可以使用H ttpS es s i on s es s i on=r eques t.g etS es s i onO ;来这种类型的对象、语法为H ttpS es s i on s es s i on=r eques t.g etS es s
34、 i onO ;6 .什么是组件、使用组件有什么优点现代件开发都已转向基于组件的开发、目前代表性的组件技术有微软的c om和c om+、有s un的j a va b ea n和E J B、此外尚有C O R B A(C om m on O b j ec t R eques t B r ok er A r c hi tec tur e,公共对象代理结构)、j a va b ea n规范将软件组件的概念引入到了j a va编程里面、组件是自包含的、可重用的软件单元、而j a va b ea n组件则可使用可视的应用程序开发工具、可视的将他们编写到j a va程序中、j a va b ea n规范为
35、j a va开发人员提供了一种组件化其j a va类的方法、其最大优点是代码的复用。7 .编写j a va b ea n时需要注意哪些?(1)假如类的成员变量的名字是x x x、为了更改和获得其成员变量的值、在类中使用两个方法:g e tXx x ()是用来获取属性、s e tXx x ()是用来修改属性(2)类中的方法访问属性必须是p u b l i c的(3)必须放在一个包中(4)类中要有p u b l i c (公有的)无参的构造函数8.简述J SP的设计模式Mo d l e 1 J SP+J a v a b e a n在这种模式中J SP页面独自响应请求并将解决结果返回客户、所有的数据
36、库操作通过j a v a b e a n来实现、大量的使用这种设计模式常会导致在j s p页面中嵌入大量的j a v a代码、当需要解决的业务逻辑非常复杂时、这种情况就变得很糟糕、大量的j a v a代码使得j s p页面变得非常臃肿、前端的页面设计人员稍有不慎就有也许破坏关系到业务逻辑的代码优点:实现简朴、适合快速的开发小型项目Mo d l e 2 MVC设计模式采用只包含控制逻辑的s e r v l e l作为前端控制器接受客户请求、再转发到相应的j s p页面解决显示逻辑、并辅以j a v a b e a n实现相关的业务逻辑、合用于大规模系统的开发和管理缺陷:增长了应用开发的复杂限度9
37、.在j a v a s e r v l e t A P I中 f o r w a r d ()和r e d i r e c t()的区别前者仅是容器中控制权的转向、在客户端浏览器地址栏中不会显示出转向后的地址后者则是完全跳转、浏览器将会得到跳转的地址、并重新发送请求连接、从浏览器地址栏中可以看到跳转后的连接地址、所以前者更加高效、在前者可以满足需要时尽量使用f o e a r d ()并且这样也有助于隐藏实际的连接、比如需要跳转到一个其它服务器上的资源、则必须使用s e n d Re d i r e c t()1 0.J SP的内置对象r e q u e s t 客户端请求re s po n
38、s e 网页传回客户端的【可应pag e C o n te x t 管理页面属性s e s s i o n 与请求有关的会话期appl i c ati o n 应用程序级变量o u t 用来传送回应传送的输出c o n fi g -s e rvl e l C o n f i g 的一个实例pag e 代表j s p页面自身e x e pti o n 针对错误网页未捕获的例外1 1.J s p的标准动作J s p:i n c l u d e 在页面请求的时候引入一个文献J s p:u s e b e an 寻找或实例化一个j avab e anJ s p:s e tpro pe rty -设立j
39、 avab e an的属性J s p:g e tP ro pe rty 输出j avab e an的属性J s p:fo rw ard -把请求转到一个新的页面1 2.J s p中的动态i n c l u d e与静态i n c l u d e的区别语法上、静态%i n c l u d e fi l e二 嘤)动态j s p:i n c l u d e pag e状态上、静态的是编译时包含、动态的是运营时包含针对对象来说、静态包含的是静态页面、动态的包含静态页面和动态页面均可包含静态的是j s p引擎对所包含的文献进行语法分析动态的是j s p引擎不对所包含的文献进行语法分析、只获得解决结果、
40、假如包含的内容是静态内容、那么使用i n c l u d e指令、由于它的运营速度快Struts1.s tru ts的运营机制s tru ts架构从本质上M V C设计模式的具体实现、表达层一般使用试图组件实现、控制器使用控制器组件实现、而应用逻辑层使用模型组件实现、作为表达层和应用层之间的中介、控制器解决模型和视图之间、起到了桥梁的沟通作用2.控制器组件的相关类A c ti o n S e rvl e t-是s tru ts架构中的中央控制器R e qu e s tP ro c e s s o r 包含了s tru ts控制器解决s e rvl e t请求时所遵循的控制逻辑A c ti o
41、n 解决业务逻辑A c ti o n F o rm -保存用户表单数据、以便于在不同页面间传递A c ti o n M appi n g 用于控制在状态数据改变后的事件解决方式A c ti o n F o rw ard -用户指向或者视图选择3.s tru ts标签库s tru ts-h tm l.tl d 扩展h tm l fo rm的j s p标记s tru ts-b e an.tl d 扩展解决j avab e an的j s p标记s tru ts-l o g i c.tl d-扩展测试属性值的j s p标记4.s tru ts 1的A c ti o n是否是线程安全的S tru ts
42、l A c l i o n是单例模式并且必须是线程安全的、由于仅有A c ti o n的一个实例来解决所有请求、单例策略限制了s tru l s lA c ti o n能做的事、并且要在开发是特别小心、A ct i on资源必须是线程安全或同步的5.s t r u t s的工作流程在w e b应用启动时就会加载初始化a ct i on S e r v l e t、a ct i on S e r v l e t从s t r u t s-con f i g.x m l文献中读取配置信息、把他们存放到各种配置对象中、当A ct i on S e r v l e t接受到一个客户请求时将执行如下流程(
43、1)检索和用户请求匹配的A ct i on M a ppi n g实例、假如不存在就返回请求途径无效信息(2)假如a ct i on F or m实例不存在、就创建一个A ct i on F or m对象、把客户提交的表单数据保存到A ct i on F or m对象中(3)根据配置信息决定是否需要表单验证、假如需要验证就会调用A ct i on F or m的v a l i da t e。(4)假如A ct i on F or m的v a l i da t e()返|口 n u l 或返|可一个不包含A ct i on Y e s s a g e的A ct i on E r r or s对象
44、就表达表单验证成功(5)A ct i on S e r v l e t根据A ct i on M a ppi n g所包含的映射信息决定将请求转发给哪个A ct i on、假如相应的A ct i on实例不存在、就先创建这个实例、然后调用A ct i on的e x e cu t e ()(6)A ct i on 的e x e cu t e ()返|可个 A ct i on F or w a r d 对象、A ct i on S e r v l e t 再把客户请求转发给 A ct i on F or w a r d 对象所指向的j s p组件(7)A ct i on F or w a r d对
45、象指向j s p组件生成动态网页、返回给客户6.s t r u t s 1的优缺陷优点:是开源软件、使开发者能更进一步的了解其内部的机制、业界标准学习资源丰富、标签和页面导航(1)运用s t r u t s提供的标签可以大大节约开发时间(2)维护扩展比较方便、通过一个配置文献即可把握整个系统个部分之间的联系、这对于后期的维护有莫大的好处(3)表现与逻辑分离(4)便于团队开发缺陷:(1)大量使用标签对于初学者难度很大(2)A ct i on F or m使用不便无法进行单元测试7.T i l e s框架是什么?T i l e s框架为创建w e b页面提供了一种模板机制、它能将网页的布局和内容分
46、离8.s t r u t s 的M V C框架M o d l e s t r u t s没有提供m o d l e类、这个业务逻辑必须由w e b应用程序的开发者以ja v a b e a n或EJ B的形式提供、V ie w s t r u t s提供Ac l io n Fo r m创建Fo r m B e a n、用于在c o n l r o l e r和v ie w间传输数据、此外、s t r u t s提供了自定义js p标签库、辅助开发者用js p创建交互式的以表单为基础的应用程序、应用程序资源文献(.p r o p e r t y文献)保存了一些文本常量和错误信息、可转变成其它语言
47、用于js p中C o n t r o l e r提供了一个核心控制器Ac t io n S e r v l e t、通过这个核心控制器来调用其它用户注册的自定义控制器Ac t io n、自定义Ac t io n需要符号S t r u t s l的自定义Ac t io n的规范、还需要在s t r u t s-c o n f ig.x m l特定配置文献中进行配置、接受js p输入字段形成Ac t i o n Fo r m、然后调用个Ac t io n控制器、S t r u t s l 和 s t r u t s 2 的比较(1)Action 类:strutsl规定Action类要扩展自一个抽象
48、基类、struts1的个共有的问题是面向抽象类编程而不是面向接口编程struts2的Action类实现了一个Action接口、连同其它接口一起实现可选择和自定义服务、提供了一个名叫ActionSupport的基类实现一般使用的接口、Action接口不是必须的、任何使用execute()的普通java对象可以被当作5“仇$2的2(:宜011对象使用(2)线程模型:strutsl Action是单例的、因只有一个实例控制所有的请求、单例策略导致了 一定的限制、Action资源必须是线程安全或者同步的Struts2对象对每一个请求都实例化对象所有没有线程安全问题(3)Servlet依赖:struts
49、l的Action类的依赖于Servlet API 以HttpServletRequest和HttpServletResponse作为参数传递给execute()Struts 2的Action不和容器有关、Servlet上下文被表现成简朴的maps(4)易测性:测试strutsl的重要障碍是execute()方法暴露了API、stuts2的Action可以通过实例化Action测试、设立属性然后调用方法(5)接受输入Strutsl使用actionform对象捕获输入,向action同样,actionform必须扩展基类。因其他的javabean不能做actionform使用,开发者经常创建多余的
50、类捕获输入。Struls2的act ion属性做为输入属性。排除第2个输入对象的需要,输入属性也许有丰富的对象类型,这些属性有他们自己的属性。Action的属性可以通过标签库访问(6)表达式语言:Strutsl整合jstl所以使用jstl的表达式语言、表达式语言有基本的图形对象移动、但是相对很弱的集合和被索引的属性支持、Struts2使用jstl、但是框架也支持更大更灵活的表达式、叫做“对象图形符号语言(0GNL)(7)将值绑定到视图上Struts使用标准jsp机制来绑定对象到页面上下文、struts2使用ValueStack技术、标签库可以不用连接你的视图到对象的表现类型访问值(8)类型转换