版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面试必备的相关知识
目的:为了更好的认识java体系,同时为了找更高的薪水。
1、java基础知识
1.1基础知识
i.i.i配置环境变量
新建java_home变量(安装目录),值为:C:\ProgramFiles\Java\jdkl.6.0_14;此值
为JDK的安装位置。
新建classpath变量(类加载路径),值
为:.;%java_home%\lib;%java_home%\lib\tools.jar
修改path变量(使得系统可以在任何路径下识别java命令),值
为:%java_home%\bin;%java_home%\jre\bin
1.1.2访问修饰符
Public:任何地方可以访问
Private:只有自身可以访问
Protected:同一个包和子类可以访问
默认:只有同一个包内可以访问
1.2对象的清理
1.2.1认识Java的自动垃圾回收
垃圾回收是Java语言的一大特性,方便了编程,是以消耗性能为代价的。而垃圾
在这里只无用的对象。而C++是需要程序员自己写析构函数来释放内存的,麻烦,也有
可能忘记而导致内存泄露。
Java语言对内存的分配管理是通过JVM内部机制决定的。程序员可以不关心其处
理。
1.2.2垃圾回收的原理和意义
Java虚拟机中有个称之为垃圾回收器的东西,实际上这个东西也许真正不存在,或
者是已经集成到JVM中了,但这无关紧要,我们仍然可以称为为垃圾回收器。
垃圾回收器的作用是查找和回收(清理)无用的对象。以便让JVM更有效的使用
内存。
垃圾回收器的运行时间是不确定的,由JVM决定,在运行时是间歇执行的。虽然
可以通过System.gc()来强制回收垃圾,但是这个命令下达后无法保证JVM会立即响
应执行,但经验表明,下达命令后,会在短期内执行你的请求。JVM通常会感到内存
紧缺时候去执行垃圾回收操作。
垃圾回收过于频繁会导致性能下降,过于稀疏会导致内存紧缺。这个JVM会将其
控制到最好,不用程序员担心。但有些程序在短期会吃掉大量内存,而这些恐怖的对象
很快使用结束了,这时候也许有必要强制下达一条垃圾回命令,这是很有必要的,以便
有更多可用的物理内存。
从上面了解到,没有用的对象就是垃圾。准确的说,当没有任何线程访问一个对象
时,该对象就符合垃圾回收的条件。
对于String,存在一个字符串池,这个不属于本文讨论的范围,字符串池中的垃圾
回收,算法和这里所讨论的垃圾回收完全是两码事。但是不得不说的是,字符串的胡乱
拼接,往往导致性能急剧下降,尤其是在庞大的循环语句中,拼接字符串就是在让程序
慢性自杀。这也是很多Java程序员容易犯的毛病。
字符串既然是池,就是为了缓冲,为了有更高的命中率,因此垃圾回收的频率也许
会比JVM对象垃圾回收器要低很多。
垃圾回收器仅仅能做的是尽可能保证可用内存的使用效率,让可用内存得到高效的
管理。程序员可以影响垃圾回收的执行,但不能控制。
1.2.3通过编程影响垃圾回收
虽然程序员无法控制JVM的垃圾回收机制。但是可以通过编程的手段来影响,影
响的方法是,让对象符合垃圾回收条件。
分别说来有一下几种:
1、将无用对象赋值为null.
2、重新为引用变量赋值。比如:
Personp=newPerson("aaa");
p=newPerson("bbb");
这样,newPerson("aaa'O这个对象就是垃圾了一一符合垃圾回收条件了。
3、让相互联系的对象称为“岛”对象
Personpl=newPersonC'aaa");
Personp2=newPerson("bbb");
Personp3=newPerson("cccn);
pl=p2;p2=p3;p3=pl;
pl=null;p2=null;p3=null;
在没有对pl、p2、p3置null之前,它们之间是一种三角恋关系。分别置null,三
角恋关系依然存在,但是三个变量不在使用它们了。三个Person对象就组成了一个孤
岛,最后死在堆上一一被垃圾回收掉。
1.2.4强制的垃圾回收System.gc()
实际上这里的强制,是程序员的意愿、建议,什么时候执行是JVM的垃圾回收器
说了算。
调用垃圾回收也不一定能保证未使用的对象一定能从内存中删除。
唯一能保证的是,当你内存在极少的情况,垃圾回收器在程序抛出
OutofMemaryException之前运行一次。
1.3集合
:"■;"…一二..:Produces:Produces
;Iteratory■Collectionf;Map;
:…西飞」
…8'W"A
1.4文件流
1.4.1输出字节流
1.4.2输入字节流
1.4.3输入输出字符流
Critix-Ax*x*«iyKeu<ler-
PushhackReaciei"
1ItouLSLx-ouniKouclux-f7£1oRouclux'
P1clRotadex"
S±T'ir»£tRF»»cic»T-
ObJoct
CliarAx-x'tiyWx-ltox'
Wi-ito»-Oi»t.ptit.Stj-<9ixmWt-i1.«=»r---—Fl1GWI-1上。r
PipeciWi'iter
PT-InrWi'iter
Stx-lrBHWr-ILox-
1.5网络
1.5.1TCP和UDP的区另lj
TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠的无差别错的数据传输。
UDP是无连接通信协议,UDP不保证可靠的数据的传输,但能够向若干个目标发送数
据,接受发自若干个源的数据。
1.6多线程
1.6.1实现多线程
实现多线程:继承自Thread类,可以重写run()方法去覆盖去Thread中的run()方法;
实现Runnable接口并实现它的run()方法。
线程的优先级代表该线程的重要程度(不是绝对的),当有多个线程同时处于可执行状
态并等待获得CPU时间时•,线程调度系统根据各个线程的优先级来决定给谁分配CPU时
间,优先级高的线程有更大的机会获得CPU时间,优先级低的线程也不是没有机会,只是
机会要小一些罢了。
1.6.2多线程方法的解释和区别
1.start。是启动一个线程。
2.join()是直到执行完(或强制执行一段时间)当前的线程后才往下执行主线程或其他的
线程
3.stop()是停止当前的线程。
阻塞线程比较多
sleep()方法:sleep()允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定
的时间内进入阻塞状态,不能得到CPU时间,指定的时间一过,线程重新进入可执行状态。
可能给其他线程执行的机会(自私,睡着了,不释放锁,时间到了才放锁)
suspend()和resume()方法:两个方法配套使用,suspend。使得线程进入阻塞状态,并
且不会自动恢复,必须其对应的resume。被调用,才能使得线程重新进入可执行状态。
yield()方法:yieldO使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线
程仍处于可执行状态,随时可能再次分得CPU时间。调用yield()的效果等价于调度程序
认为该线程已执行了足够的时间从而转到另一个线程。不过yield。只能使同等级别的线程获
取执行的机会(公平竞争,释放大家再次选举)。而sleep(lOOO)使同级别或不同级别的都有
可能。
wait()和notifyO和notifyAll()方法是Object中定义的方法:
必须在synchronized代码块中使用,在synchronized代码被执行期间,线程可以调用对
象的wait()方法,释放对象的锁标志,进入等待的状态,并且可以调用notify。或者notifyAll()
方法通知正在等待的其他线程。notify。通知的是等待队列中的第一个线程,notifyAH。通知
的是等待队列中的所有数量。
几个方法配套使用,wait。使得线程进入阻塞状态,它有两种形式,一种允许指定以
毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的notifyO被调用或者超
出指定时间时线程重新进入可执行状态,后者则必须对应的notifyO被调用。
1.6.3wait和sleep的区别
wait。在object类里定义;sleep。在Thread类里定义。
wait。方法只能放在同步方法或同步块中,表示资源同步时,线程需要等待。
sleep。方法可放在任何位置,表示当前线程睡眠。
wait。方法会释放对象锁;sleep。不会释放对象锁。
wait。方法要等待唤醒之后,线程才会继续执行。
sleep。则是休眠一段时间,线程自动恢复执行.
sleep。必须捕获异常,而wait。,notify。和notifyAll()不需要捕获异常
1.6.4notify。和notifyAU()的区别
notifyO方法导致解除阻塞的线程是从因调用该对象的wait()方法而阻塞的线程中随
机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确
定性而产生问题。
notifyAll()方法将把因调用该对象的wait()方法而阻塞的所有线程一次性全部解除阻
塞。当然,只有获得锁的那一个线程才能进入可执行状态。
1.6.5run和start的区别
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用:
start。方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;
start。方法是启动(即开辟)一个线程的方法,因此线程的启动必须通过此方法,
而run()方法,只是Thread类的一个方法,它本身并不能开辟线程。
1.7异常
运行时异常和Error是catch不了的。
throw和throws的区别
throw是抛出一个具体的异常类,产生一个异常。
throws则是在方法名后标出该方法会产生何种异常需要方法的使用者捕获并处理。
自定义异常必须继承Exception类。
1.8格式化
略
1.9数字运算
1.10正则表达式
1.10.1次数限定符
*o次或多次
+至少i次
?0或1次
{n}指定n次
{n,)至少n次
{n,m}匹配n-m次
2、JAVA面向对象的基础知识
2.1面向对象的三个特征
2.1.1封装
属性是私有,方法的公开的。
自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
2.1.2继承
它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这
些功能进行扩展。
2.1.3多态
实现多态有2种方式:静态多态(编译时的多态,在同一个类中)和动态
多态(一个对象可以有多种类型)。
是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值
之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
一句话:允许将子类对象赋值给父类的引用或父类指向子类的对象。
2.1.4总结
封装可以隐藏实现细节,使得代码模块化。
继承可以扩展已存在的代码模块(类)。
封装和继承属于代码重用。
多态是为了接口重用。
1封装
面
实现继承
向
对
象可视继承
基
本接口继承
特
征
纯虚类
虚函数
多态
同名函数
2.1.5继承、聚合、组合、关联的区别
继承很好理解,下图表示(实线):
△
实现也很好理解,下图表示(虚线):
依赖(代码中通常表示的是局部变量、方法参数、返回值),下图表示:
关联(代码中通常表示的类的属性),下图表示:
ClassB
0..1
聚合(关联的一种,此时整体与部分之间是可分离的,他们可以具有各自的生命周
期,部分可以属于多个整体对象,也可以为多个整体对象共享;has-a,空心菱形),下图
表示
组合(关联的一种,表示更强的关系,整体与部分是不可分的,整体的生命周期结
束也就意味着部分的生命周期结束,contains-a,实心菱形),下图表示
2.2抽象、接口定义及区别
抽象类里面可以有非抽象方法
但接口里只能有抽象方法
声明方法的存在而不去实现它的类被叫做抽像类(abstractclass),它用于
要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现
该类的情况。不能创建abstract类的实例。然而可以创建一个变量,其类型是
一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静
态方法。Abstract类的子类为它们父类中的所有抽像方法提供实现,否则它们
也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在
类中实现这些方法。
接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继
承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个
有程序体。接口只可以定义staticfinal成员变量。接口的实现与子类相似,除
了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将
程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何
对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类
型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,
instanceof运算符可以用来决定某对象的类是否实现了接口。
2.3匿名类、内部类、匿名内部类
在一个类中定义另外一个类,这个类就叫做内部类或内置类(innerclass)。
内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class
文件,但是前面冠以外部类的类命和$符号。内部类不能用普通的方式访问。内
部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无
论是否是private的。
我们为什么使用内部类?
A、在内部类(innerclass)中,可以随意的访问外部类的成员,这可以让
我们更好地组织管理我们的代码,增强代码的可读性.
B、内部类可以用于创建适配器类,适配器类是用于实现接口的类。使用
内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。
C、内部类的更多用法(匿名innerclass实现一■个接口,不过切记最后那个
分号;实现继承和接口实现时出现同名方法的问题;实现多重继承的功能)
2.4反射
这种动态的获取信息及动态调用方法的机制在Java中称为“反射”
(reflection)<>
Reflection是Java被视为动态(或准动态)语言的一个关键性质。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于
java.lang.reflect包中:
Class类:代表一个类;
Field类:代表类的成员变量(成员变量也称为类的属性);
Method类:代表类的方法;
Constructor类:代表类的构造方法;
Array类:提供了动态创建数组,以及访问数组的元素的静态方法;
在java.lang.Object类中定义了getClass。方法,因此对于任意一个Java对
象,都可以通过此方法获得对象的类型。Class类是ReflectionAPI中的核心
类,它有以下方法:
getName():获得类的完整名字;
getFields():获得类的public类型的属性(包括继承的类的public属性);
getDeclaredFields():获得类的所有属性;
getMethods():获得类的public类型的方法;(包括继承的类的public方
法);
getDeclaredMethods():获得类的所有方法;
getMethod(Stringname,Class[]parameterTypes):获得类的特定方法,name
参数指定方法的名字,parameterTypes参数指定方法的参数类型;
getConstructors():获得类的public类型的构造方法;
getConstructor(Class[]parameterTypes):获得类的特定构造方法,
parameterTypes参数指定构造方法的参数类型;
newlnstance():通过类的不带参数的构造方法创建这个类的一个对象;
通过默认构造方法创建一个新对象:
ObjectobjectCopy=classType.getConstructor(newClass[]{}),newlnstance(new
Object[]{});
以上代码先调用Class类的getConstructor。方法获得-一个Constructor对象,
它代表默认的构造方法,然后调用Constructor对象的newlnstance。方法构造一
个实例。
获得对象的所有属性:
Fieldfields[l=classType.getDeclaredFields();
Class类的getDeclaredFields。方法返回类的所有属性,包括public>
protected、默认和private访问级别的属性。
Java允许我们从多种途径为一个class生成对应的Classobject
(一)运用getClass。方法
(二)运用Class.getSuperclass。方法
(三)运用静态方法Class.forName(),这个最常用
(四)运用.class语法
(五)运用原始包装类的TYPE方法
2.5浅复制和深复制
浅负责也叫浅克隆,深复制也叫深克隆。
克隆一般通过实现Cloneable中的clone方法来实现浅克隆和深克隆,但是
深克隆有一个问题,如果引用对象有很多,或者说引用套引用很多重,那么太
麻烦了。
业界常用的方法是使用串行化然后反串行化的方法来实现深克隆。由于串
行化后,对象写到流中,所有引用的对象都包含进来了,所以反串行化后,等
于生成了一个完全克隆的对象。绝!这个方法的要求是对象(包括被引用对象)
必须事先了Serializable接口,否则就要用transient关键字将其排除在复制过程
中。
3、UML相关知识
3.1软件工程的生命周期
3.1.1软件工程的生命周期
需求捕获、系统分析与设计、系统实现、测试、维护
3.2.UML(UnifiedModelingLanguage)概述
3.3UML组成
视图(View)是一个或多个图组成的对系统某个角度的抽象
图(Diagram)是模型元素集的图形表示
模型元素(ModelElement)代表面向对象中的类、对象、接口、消息和关系的概念
通用机制(GeneralMechanism)用于表示其他信息,如注释、模型元素的语义等
3.4视图
视图由图组成,UML提供9种不同的视图,其中视图的包括
用例视图(强调系统功能)也称用户模型视图
用例图
逻辑视图(展现系统的静态或结构组成特征)也称为结构模型视图或静态视图
类图、对象图
并发视图(体现系统的动态或行为特征)也称为行为模型视图或动态视图
时序图、协作图、状态图、活动图
组件视图(体现系统实现的结构和行为特征)也成为实现模型视图
组件图
配置视图(体现系统实现的环境的结构和行为特征)也称环境模型视图或物理视图
配置图
3.5静态建模机制和动态建模机制
UML内容归纳为2大类:静态建模机制和动态建模机制
静态建模机制包括用例图、类图、对象图、组件图、配置图、包等
动态建模机制包括时序图、协作图、状态图、活动图、消息等
3.6UML用来描述模型内容的有3种:事物、关系、图(静
态视图和动态视图)
主要说说事物和关系
事物包括如下
结构事物:用例(椭圆)、类(矩形)、接口(圆心)、协作(虚椭圆)、活动类(粗线矩
形)、组件、节点(资源:电脑)
行为事物:交互(通常画成带箭头的信息)、状态机(对象的一个或多个状态的集合)
组织事物:包
辅助事物:注释
关系:关联、依赖、泛化、实现
3.7类与类关系
类(矩形:名称、属性、操作、职责)
其中表示+、-、#是public、private>protected
关系
依赖(有方向的虚线):使用依赖、抽象依赖、授权依赖、绑定依赖
泛化(父类和子类的关系):描述了类之间的“isakindof”的关系,用子类指向父类
的空心三角形箭头(实线)表示该关系。泛
化使得多态成为可能。
关联:描述一组具有相同结构特征、行为特征、关系和语义的链接。
关联的修饰有:名称(描述关系的性质)、角色(职责)、多重性(O..n)、聚合(整体和
部分,即hasa的关系)、
组合(是更强的关系,是另外一种聚合,整体有管理部分特有的职责并且有一致的生命
周期)等。
实现:实现规格说明和其实现间的关系。它表示不继承结构而只继承行为。大多数情
况下,实现关系用来规定接口和实现接口的类或
组件之间的关系。(带空心的箭头表示,线是虚线)
3.8类图
描述类、接口、协作以及它们之间关系的图。
类图包括7个元素:类、接口、协作、依赖关系、泛化关系、实现关系以及关联关系
类图的作用:对系统的词汇建模、对简单的协作建模、对逻辑数据库模式建模
3.9对象图
表示某一刻一组对象以及它们之间关系的图
3.10包图(略)
3.11用例视图
用例(UseCase):对一个系统或一个应用的一种单一的使用方式所作的描述。
参与者(Actor):系统外部的一个实体(可以说任何事物或人)
参与者之间的关系(泛化关系、包含关系、扩展关系)
导出割按0知
«extend*
genecaHzaaon:
泛化♦相当于复承.如
子连闻里承了父查西・
extend:
«extend*幕用保星一个SS?的用
M.即使没有子用■的
参号.也可以完成一个
起的功雷.如3出剂
理通知如*了查看室接
喙
Include:
基用例界车一个完整的
MM•斯llinciude美系
中的摹用例处筑和不用
<extend*力一起使用才W元建.
子用便也仍然被推行.
加发布包含了放您分
发布木曜通知
创建洌震厘如:extend:
«lndude»
«include»
4z
<indude»
其它业务用一
L
JMS*WebServite8UK
分发
312时序图
描述对象之间传递消息的时间顺序,他用来表示用例中的行为顺序,是强调消息时间的
交互图
包括4个元素:对象、生命线、激活、消息
3.13协作图
强调参与交互的各对象结构的信息。协作图是一种类图。
协作图中包含3个元素:对象、链、消息。
如图:
3.14状态图
通过类对象的生命周期建立模型来描述对象随时间变化的动态行为。
它包括:状态和转换
注意:初始状态:实圆心、终止状态:半实圆心。
状态机、状态、转化
其中状态包括:名字、入口/出口动作、内部转换、延迟事件、子状态。
转换包括:源状态、目标状态、出发事件、监护条件、动作
______[退订数=-预订数]—
3.15活动图
描述一个过程或操作的步骤。描述状态外,更突出活动
动作状态、活动状态、动作流、分支、分叉和汇合、泳道、对象流。
活动状态
3.16组件图
描述软件组件及组件之间的关系。
包括:组件、接口、关系(依赖、泛化、关联、实现)。
图12*1粗件图
3.17配置图
显示软件系统运行的物理硬件。
包括节点(单个物理对象)、组件和关系(依赖和关联)
Ofioywr*Vi»w/
N«m«D*pl«ym«ntVi«w
D*ploym«ntVi«w
V«KiOA1.0
4、熟悉LINUX
(略)
5、SSH框架的配置及相关知识
5.1MVC
5.1.1简介
MVC模式的目的就是实现Web系统的职能分工。Model层实现系统中的业务
逻辑,通常可以用JavaBean或EJB来实现。View层用于与用户的交互,通常
用JSP来实现。Controller层是Model与View之间沟通的桥梁,它可以分派
用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它
们映射为模型层可执行的操作。
5.1.2MVC的优缺点
优点:低耦合、高可复用性和可适用性、较低的生命周期成本、快速部署、可维护性、
有利于软件工程化管理。
缺点:原理较复杂花费时间思考、程序分成三个部分需要管理更多的文件。
5.1.3MVC的现有框架
Struts:Apache的,最流行的MVC组件
Struts2:Apache用Struts和WebWork的组合出来的新产品,目前上升势头强劲
WebWork:这个可是老牌的MVC组件,后来组合成了Struts2,不过自身仍在发展
SpringMVC:SpringFramework自己整合自己Spring的优势推出的MVC组件,用户也
不少。
JSF:这个是一个规范,Sun的和Apache的都有各自的实现。用户量很大,被众多IDE
支持。
5.1.4Modell和Modell
Modell是将业务、控制、视图都放在jsp页面、Model2是由业务(javaBean)、控制
(ActionServlet)^视图(Jsp)组成。
5.2三个框架的作用
5.2.1Struts
简介
Struts2是Struts的下一代产品,是在struts和WebWork的技术基础上进行了合并的全
新的Struts2框架。其全新的Struts2的体系结构与Struts1的体系结构的差别巨大。Struts2
以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控
制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。虽然
从Struts1到Struts2有着太大的变化,但是相对于WebWork,Struts2只有很小的变化。
目的:是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。
Struts2的体系与Struts1体系的差别非常大,因为Struts?使用了WebWork的设计核心,
而不是Strutsl的设计核心。Struts2中大量使用拦截器来处理用户的请求,从而允许用户的
业务逻辑控制器与ServletAPI分离。
Struts2框架的大概处理流程如下:
1、加载类(FilterDispatcher)
2、读取配置(struts配置文件中的Action)
3、派发请求(客户端发送请求)
4、调用Action(FilterDispatcher从struts配置文件中读取与之相对应的Action)
5、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证)
6、处理业务(回调Action的execute。方法)
7、返回响应(通过execute方法将信息返回到FilterDispatcher)
8、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:SUCCESS、ERROER,
将跳转到哪个jsp页面)
9、响应用户(jsp-->客户浏览器端显示)
10、struts2标签库(相比strutsl的标签库,struts2是大大加强了,对数据的操作功能很
强大)。
Struts2和Strutsl的对比
在Action的实现方面:Strutsl要求必须统一扩展自Action类,而Struls2中可以是一个
普通的POJOo
线程模型方面:Strutsl的Action工作在单例模式,一个Action的实例处理所有的请求。
Struts2的Action是一个请求对应一个实例。没有线程安全方面的问题。
Servlet依赖方面:Struts1的Action依赖于ServletAPL比如Action的execute方法的参
数就包括requestresponse对象。这使程序难于测试。Struts2中的Action不再依赖于Servlet
API,有利于测试,并且实现TDD。
封装请求参数:Strutsl中强制使用ActionForm对象封装请求的参数。Struts2可以选择
使用POJO类来封装请求的参数,或者直接使用Action的属性。
表达式语言方面:Strutsl中整合了EL,但是EL对集合和索引的支持不强,Struts2整
合了OGNL(ObjectGraphNavigationLanguage)(,
绑定值到视图技术:Strutsl使用标准的JSP,Struts2使用“ValueStack”技术。
参见文档:http:〃/freeman1984/archive/2011/02/16/344447.html
类型转换:Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL
进行转换,可以更方便的使用。
数据校验:Struts!中支持覆盖validate方法或者使用Validator框架。Struts?支持重写
validate方法或者使用XWork的验证框架。
Action执行控制的对比:Struts1支持每一个模块对应一个请求处理,但是模块中的所有
Action必须共享相同的生命周期。Struts?支持通过拦截器堆栈为每一个Action创建不同的
生命周期。
5.2.2Hibernate
5.2.3Spring
5.3如何集成三个框架
6、设计模式
6.1设计模式的目的
设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过
分类编目的、代码设计经验的总结。使用设计模式是为「可重用代码、让代
码更容易被他人理解、保证代码可靠性、可维护性。毫无疑问,设计模式
于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式
是软件工程的基石,如同大厦的一块块砖石一样。
6.2设计模式的原则
6.2.1开闭原则
开闭原则(对扩展开放,对修改关闭)
如简单工厂模式,只要再创建一个子类就可以了,然后在工厂的方法中
返回一个新的子类对象就可以了。
6.2.2里氏替换原则
里氏替换原则(任何基类可以出现的地方,子类一定可以出现)
如果调用的是父类的话,那么换成子类也完全可以运行。Java编译程序
会检查程序是否符合里氏代换原则。还记得java继承的一个原则吗?子类
override方法的访问权限不能小于父类对应方法的访问权限。可以说:里氏
代换原则是继承复用的一个基础。
6.2.3合成复用原则
合成复用原则(少用继承,多用合成/聚合)
在面向对象的设计里,有两种基本的办法可以在不同的环境中复用已有
的设计和实现,即通过合成/聚合或通过继承。
合成/聚合复用.
优点:支持包装、黑箱复用看不见内部的细节。依赖较少。这种复用可
以在运行时间内动态进行,新对象可以动态地引用与成分对象类型相同的对
象。
缺点:是通过使用这种复用建造的系统会有较多的对象需要管理
继承复用:
优点:新的实现较为容易,因为超类的大部分功能都可以通过继承关系
自动进入子类,修改或扩展继承而来的实现较为容易。
缺点:继承复用破坏包装,因为继承将超类的实现细节暴露给子类。因
为超类的内部细节常常是对子类透明的,因此这种复用是透明的复用,又称
“白箱”复用。如果超类的实现发生改变,那么子类的实现也不得不发生改
变。从超类忌辰而来的实现是静态的,不可能在运行时间内发生改变,因此
没有足够的灵活性。
一般来说,对违反里氏代换原则的设计进行重构时,可以采取两种办法:
一是加入一个抽象超类;二是将继承关系改写为合成/聚合关系。
“IS-A”是严格的分类学意义上的定义,意思是一个类是另一个类的
“一种”。而“HAS-A”则不同,它表示某一个角色具有某一项责任。
6.2.4依赖倒置原则
依赖倒置原则(抽象不应该依赖于细节,细节应当依赖于抽象)
要针对接口编程,而不是针对实现编程。
传递参数,或者在组合聚合关系中,尽量引用层次高的类。
主要是在构造对象时可以动态的创建各种具体对象,当然如果一些具体
类比较稳定,就不必在弄一个抽象类做它的父类,这样有画蛇添足的感觉。
6.2.5接口隔离原则
接口隔离原则(使用多个专门的接口比使用单一的总接口要好)
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关
系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
“不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所
在的类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它
们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面
临由于这些不使用的方法的改变所带来的改变。
6.2.6迪米特原则
迪米特原则(最少知识原则。不要和陌生人说话)
迪米特法则的各种表述
①只与你直接的朋友们通信;
②不要跟“陌生人”说话;
③每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本
单位密切相关的软件单位。
狭义的迪米特法则
☆如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互
作用。如果其中的一个类需要调用另外一个类的某一个方法,可以通过第三
者转发这个调用。
FriendAbstractran«er
_stranger:AbstractStranger正叩eratjon3:voia
+operation2:void
+provide:AbstractStrangerX
Stranger
+operation3:void
在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统
的商务逻辑无关。
遵循类之间的迪米特法则会是一个系统的局部设计简化,因为每一个局
部都不会和远距离的对象有直接的关联。但是,这也会造成系统的不同模块
之间的通信效率降低,也会使系统的不同模块之间不容易协调。
门面模式和调停者模式实际上就是迪米特法则的应用。
广义的迪米特法则在类的设计上的体现:
优先考虑将一个类设置成不变类。
尽量降低一个类的访问权限。
谨慎使用Serializable。
尽量降低成员的访问权限。
注意:在进行设计的时候,我们尽量从抽象类继承,而不是从具体类继承。
如果从继承等级树来看,所有叶子节点应当是具体
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食物运输管理制度
- 安全的信息保障制度
- 安全制度和应急疏散预案
- 员工绩效考核制度
- 幼儿园建筑安全管理制度
- 房管局抵押合同
- 黄斑变性患者的临终关怀与护理
- 贲门癌术后康复成功案例
- 人工智能与区块链 课件 第1-4章 人工智能与区块链融合导论-共识与验证算法
- 型客户服务流程与规范模板
- 员工职业道德培训课程内容
- 北京市西城区2024-2025学年三年级下学期期末英语试题(含答案含听力原文无听力音频)
- 现浇板下加钢梁施工方案
- 《中国艾滋病诊疗指南(2025版)》HIV暴露处理与预防阻断
- 水力发电工程水轮发电机组运行与调试
- 特斯拉QMS培训课件
- 制造企业生产质量自查报告
- 2025医美行业白皮书-罗兰贝格x美团医美-202508
- 高中青年教师培养计划及实施方案
- 外卖运营 技巧培训课件
- 急性阑尾炎教学课件
评论
0/150
提交评论