1.什么是事务控制?
答:事务控制就是将一系列操作当成一个不可拆分的逻辑单元,保证这些操作要么都成功,要么都失败。在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
事务是恢复和并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
事务有两种操作:提交,回滚
2.过滤器的作用?
过滤器是一个对象,可以传输请求或修改响应。它可以在请求到达Servlet/JSP之前对其进行预处理,而且能够在响应离开Servlet/JSP之后对其进行后处理。所以如果你有几个Servlet/JSP需要执行同样的数据转换或页面处理的话,你就可以写一个过滤器类,然后在部署描述文件(web.xml)中把该过滤器与对应的Servlet/JSP联系起来。你可以一个过滤器以作用于一个或一组servlet,零个或多个过滤器能过滤一个或多个servlet。一个过滤器实现java.servlet.Filter接口并定义它的三个方法:1. void init(FilterConfig config) throws ServletException:在过滤器执行service前被调用,以设置过滤器的配置对象。2. void destroy();在过滤器执行service后被调用。3. Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;
3.为什么要引入连接池?
首先在Web开发中,如果使用 JDBC连接数据库,那么每次访问请求都必须建立连接——打开数据库——存取数据库——关闭连接等一系列步骤。但是我们知道数据库的连接打开不仅费时,而且消耗比较多的系统资源。如果进行数据库操作的次数比较少,那么还不至于有多大的影响,但是假如频繁的进行数据库操作,那么系统的性能将会受到很大影响。
其次,是造成数据库连接泄漏。数据库连接泄漏这个词是第一次听说,指的是如果在某次使用或者某段程序中没有正确地关闭Connection、 Statement和ResultSet资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏。数据库连接的资源是宝贵而且是有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。
为了解决上述问题,因此就引入了数据库连接池技术。用一句话概括数据库连接池技术那就是负责分配、管理和释放数据库连接。
4.JSP中动态INCLUDE与静态INCLUDE的区别?
动态INCLUDE用jsp:include动作实现它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。
静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面
<%@include file=”"%> 编译期导入合并成1个Servlet 效率较高 (用include伪码实现,适用于包含静态页面)
<jsp:include file=”"> 动态连接效率低于<%@include file=”"%> (但它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数)
主要就是1个编译期就合成1个Servlet了一个是2个Servlet 动态连接
(JSP 最终就是被容器编译成个 Servlet )
5. jsp中,session对象存在哪个地方,如何进行存取,存在服务器哪个地方,如何存的?
1、session在何时被创建
一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session=”false”%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。
由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
2、session何时被删除
综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)
3、如何做到在浏览器关闭时删除session
严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。
4、有个HttpSessionListener是怎么回事
你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。
5、存放在session中的对象必须是可序列化的吗
不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象,在session销毁时会有一个Exception,很奇怪。
6、如何才能正确的应付客户端禁止cookie的可能性
对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL,具体做法参见
http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770
7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
参见第三小节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。
8、如何防止用户打开两个浏览器窗口操作导致的session混乱
这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。
9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue
做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变,需要向其他服务器进程复制新的session值。
10、为什么session不见了
排除session正常失效的因素之外,服务器本身的可能性应该是微乎其微的,虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过;浏览器插件的可能性次之,笔者也遇到过3721插件造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。
出现这一问题的大部分原因都是程序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。
6.<%…%>和<%!…%>的区别?
<%…%>用于在JSP页面中嵌入Java脚本
<%!…%>用于在JSP页面中申明变量或方法,可以在该页面中的<%…%>脚本中调用,声明的变量相当于Servlet中的定义的成员变量
7.什么是WEBSERVICE?及它的常用开发框架?
Web Service就是为了使原来各孤立的站点之间的信息能够相互通信、共享而提出的一种接口。
Web Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用。
优势:(1).跨平台。
(2).SOAP协议是基于XML和HTTP这些业界的标准的,得到了所有的重要公司的支持。
(3).由于使用了SOAP,数据是以ASCII文本的方式而非二进制传输,调试很方便;并且由于这样,它的数据容易通过防火墙,不需要防火墙为了程序而单独开一个“漏洞”。
(4).此外,WebService实现的技术难度要比CORBA和DCOM小得多。
(5).要实现B2B集成,EDI比较完善与比较复杂;而用WebService则可以低成本的实现,小公司也可以用上
(6).在C/S的程序中,WebService可以实现网页无整体刷新的与服务器打交道并取数。
缺点:
(1).WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。
(2).WebService规范没有规定任何与实现相关的细节,包括对象模型、编程语言,这一点,它不如CORBA
webservice的几种常用框架及开发过程:
Net环境 IDE为Microsoft Visual Studio2005
Java环境 CXF CXF的前身是Xfire,具体内容可参照http://xfire.codehaus.org/ 。
IDE为Eclipse 3.2 (JDK 1.5以上)
NetBeans 由于Sun已经在J2EE5.0中提供了对Jax-ws规范的实现,并且提供了NetBeans IDE对J2EE5.0的支持,使得开发web service非常简单。前提条件是我们需要到http://www.netbeans.org/ 下载NetBeans 6.0。官方的下载文件中已经集成了Tomcat6.0和J2EE5.0。
Axis 比较
? 开发过程比较
1、NetBeans IDE基本可以与.Net的开发工具VS 2005相媲美,后者有内嵌的测试服务器,前者也可以使用内嵌的glassfish。
2、CXF相对而言也比较简单(依赖于与Spring的集成),Axis要更复杂些,且难以掌握
? 性能比较
1、 CXF对于大数据量的处理,性能要优于NetBeans IDE开发的webservice;小数据量的处理两者差不
2、对于.Net开发的webservice的性能很难与Java环境下开发的webservice进行性能比较,由于应用服务器不相同(前者依赖于IIS的支持)。
? 结论
考虑到服务的性能和现有应用的整合,使用CXF进行web service开发是比较适中的选择。从简单易用方面考虑,可以使用NetBeans进行上手入门。从与之前作的webservice的兼容方面考虑,可以采用Axis,只有它还支持RPC的调用方式。
8.请具体说J2EE是怎样分层的?
1.客户端层(Client Tier) 客户端层用来实现企业级应用系统的操作界面和显示,另外,某些客户端程序也可实现业务逻辑
可分为基于Web的和非基于Web的客户端两种情况
基于Web的情况下主要作为企业Web服务器的浏览器
非基于Web的客户层则是独立的应用程序,可以完成瘦客户机无法完成的任务
2.Web层 Web层由Web组件组成 ,J2EE Web组件包括JSP页面和Servlets
Web层也可以包括一些JavaBeans Web层主要用来处理客户请求,调用相应的逻辑块,并把结果以动态网页的形式返回到客户端。
3.业务层(Business Tier) 业务层也叫EJB层或应用层,它由EJB服务器和EJB组件组成
一般情况下许多开发商把Web服务器和EJB服务器产品结合在一起发布,称为应用服务器 .EJB层用来实现企业级信息系统的业务逻辑。这是企业级应用的核心,由运行在业务层中的EJB来处理。一个Bean从客户端接收数据、处理,然后把数据送到企业信息系统层存储起来。同样,一个Bean也可以从企业信息系统取出数据,发送到客户端程序。业务层中的EJB要运行在容器中,容器解决了底层的问题,如事务处理、生命周期、状态管理、多线程安全管理、资源池等
4.企业信息系统层(Enterprise Information System tier)处理企业系统软件,包括企业基础系统、数据库系统及其他遗留的系统。J2EE支持连接架构(Connector Architecture)。提供连接J2EE平台和企业信息系统层的标准API。
9.EJB容器提供的服务?
容器提供的服务有很多,包括:1.组件池和寿命周期管理 2.客户端会话管理 3.数据库连接池
4.事务管理 5.验证与访问控制 6.持久性
10. EJB的角色和三个对象?
六个角色分别是EJB组件开发者(Enterprise Bean Provider)、应用组合者(Application Assembler)、部署者(Deployer)、EJB 服务器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、系统管理员(System Administrator)。三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类
11.你对spring+struts的耦合方式和原理?
使用了Spring的IoC来实组件之间的依赖关系注入, 使控制层与业务实现分离,即客户通过
调用业务委托接口来调用具体的业务组件的实例,避免控制层与业务层的藕合带来的维护
或升级困难。由Spring为DAO生成代理对象来为DAO添加事务服务,由IoC容器DAO的代理实例注入到业务组件中,业务组件通过DAO的委托接口调用DAO对象,使得上层组件不直接依赖于DAO的实现类,使得持久层更换或修改不影响上层组件。
12.对于apache common通信包了解多少?
Commons BeanUtils
说明:针对Bean的一个工具集。由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装。
Commons Codec
说明:这个工具是用来编码和解码的,包括Base64,URL,Soundx等等。
Commons CLI
说明:这是一个处理命令的工具.比如main方法输入的string[]需要解析。你可以预先定义好参数的规则,然后就可以调用CLI来解析。
Commons Collections
说明:你可以把这个工具看成是java.util的扩展。
Commons Configuration
说明:这个工具是用来帮助处理配置文件的,支持很多种存储方式
1. Properties files 2. XML documents 3. Property list files (.plist)
4. JNDI 5. JDBC Datasource 6. System properties 7. Applet parameters
8. Servlet parameters
Commons DBCP
说明:Database Connection pool, Tomcat就是用的这个
Commons DbUtils
说明:我以前在写数据库程序的时候,往往把数据库操作单独做一个包
Commons FileUpload
说明:jsp的上传文件功
Commons HttpClient
说明:这个工具可以方便通过编程的方式去访问网站。
Apache Common BeanUtil
是一个常用的在对象之间复制数据的工具类,著名的web开发框架struts就是依赖于它进行ActionForm的创建。
13.Spring框架解析?
Spring既是全面的又是模块化的。Spring有分层的体系结构,这意味着你能选择仅仅使用
它任何一个独立的部分,而它的架构又是内部一致。因此你能从你的学习中,得到最大的
价值。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对
象。
它的设计从一开始就是要帮助你编写易于测试的代码。Spring是使用测试驱动开发的工程
的理想框架。
Spring不会给你的工程添加对其他的框架依赖。Spring也许称得上是个一站式解决方案,
提供了一个典型应用所需要的大部分基础架构。它还涉及到了其他framework没有考虑到的
内容。
Spring的核心即是个IoC/DI的容器,它可以帮程序设计人员完成组件之间的依赖关系注
入,使得组件之间的依赖达到最小,进而提高组件的重用性,Spring是个低侵入性(invas
ive)的框架,Spring中的组件并不会意识到它正置身于Spring中,这使得组件可以轻易的
从框架中脱离,而几乎不用任何的修改,反过来说,组件也可以简单的方式加入至框架
中,使得组件甚至框架的整合变得容易。
Spring最为人重视的另一方面是支持AOP(Aspect-Oriented Programming),然而AOP框架
只是Spring支持的一个子框架,说Spring框架是AOP框架并不是一件适当的描述,人们对于
新奇的 AOP关注映射至Spring上,使得人们对于Spring的关注集中在它的AOP框架上,虽然
有所误解,但也突显了Spring的另一个令人关注的特色。
Spring也提供MVC Web框架的解決方案,但您也可以将自己所熟悉的MVC Web框架与Spring
解合,像是Struts、Webwork等等,都可以与Spring整合而成为进用于自己的解決方案。Sp
ring也提供其它方面的整合,像是持久层的整合如JDBC、O/R Mapping工具(Hibernate、i
BATIS)、事务处理等等,Spring作了对多方面整合的努力,故说Spring是个全方位的应用
程序框架
14.Spring IoC底层运行原理?
Spring IoC 反向控制原理:
IoC,直观地讲,就是容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入(Dependency Injection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象地说,即由容器动态地将某种依赖关系注入到组件之中。
反向控制是Spring框架的核心。通常,应用代码需要告知容器或框架,让它们找到自身所需要的类,然后再由应用代码创建待使用的对象实例。因此,应用代码在使用实例之前,需要创建对象实例。然而,IoC模式中,创建对象实例的任务交给IoC容器或框架(实现了IoC设计模式的框架也被称为 IoC容器),使得应用代码只需要直接使用实例[5],这就是IoC。相对IoC 而言,“依赖注入”的确更加准确的描述了这种设计理念。所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
任何重要的系统都需要至少两个相互合作的类来完成业务逻辑。通常,每个对象都要自己负责得到它的合作(依赖)对象。你会发现,这样会导致代码耦合度高而且难于测试。使用IoC,对象的依赖都是在对象创建时由负责协调系统中各个对象的外部实体提供的,这样使软件组件松散连接成为可能。
15. Ajax是如何工作的?
Ajax 基本上就是把 JavaScript 技术和 XMLHttpRequest 对象放在 Web 表单和服务器之间。当用户填写表单时,数据发送给一些 JavaScript 代码而不是直接发送给服务器。相反,JavaScript 代码捕获表单数据并向服务器发送请求。同时用户屏幕上的表单也不会闪烁、消失或延迟。换句话说,JavaScript 代码在幕后发送请求,用户甚至不知道请求的发出。更好的是,请求是异步发送的,就是说 JavaScript 代码(和用户)不用等待服务器的响应。因此用户可以继续输入数据、滚动屏幕和使用应用程序。
然后,服务器将数据返回 JavaScript 代码(仍然在 Web 表单中),后者决定如何处理这些数据。它可以迅速更新表单数据,让人感觉应用程序是立即完成的,表单没有提交或刷新而用户得到了新数据。 JavaScript 代码甚至可以对收到的数据执行某种计算,再发送另一个请求,完全不需要用户干预!这就是 XMLHttpRequest 的强大之处。它可以根据需要自行与服务器进行交互,用户甚至可以完全不知道幕后发生的一切。结果就是类似于桌面应用程序的动态、快速响应、高交互性的体验,但是背后又拥有互联网的全部强大力量。
16.列出曾经使用过的开源框架、工具以及类库等?对哪些Web框架比较熟悉?分析下这些Web框架的优缺点?
开源框架:struts、hiberante、spring、dwr
工具:eclipse3.4、MyEclipse5.5、JBuild、NetBeans、JBossIDE2.0、Dreamweave
类库: Java提供的部分常用包
java.lang.*—— Java编程语言的基本类库
java.util.*——– 包括集合类、时间处理模式、日期时间工具等各类常用工具包
java.io———–提供了通过数据流、对象序列以及文件系统实现的系统输入、输出
java.sql———提供了访问和处理来自于Java标准数据源数据的类
java.applet—–提供了创建applet需要的所有类
java.awt.*——- 提供了创建用户界面以及绘制和管理图形、图像的类
javax.swing.*—- 提供了一系列轻量级的用户界面组件,是目前Java用户界面常用的包
java.math.*—— 提供了简明的整数算术以及十进制算术的基本函数
java.rmi———-提供了与远程方法调用相关的所有类
javax.naming.*— 为命名服务提供了一系列类和接口
java.net———-提供了用于实现网络通讯应用的所有类
java.test———包括以一种独立于自然语言的方式处理文本、日期、数字和消息的类和接口
比较熟悉Web框架:struts1.2、struts2.0、spring mvc、WebWork
struts优缺点:
1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.
2. 有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。
3. 页面导航.页面导航将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
4. 提供Exception处理机制 .
5. 数据库链接池管理
6. 支持I18N
缺点:
1、转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向,需要配置forward,如果有十个展示层的 jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而 tomcate这样的服务器,还必须重新启动服务器,如果业务变更复杂频繁的系统,这样的操作简单不可想象。现在就是这样,几十上百个人同时在线使用我们的系统,大家可以想象一下,我的烦恼有多大。
2、 Struts 的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。
3、测试不方便. Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试。
4、类型的转换. Struts的FormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。
5、对Servlet的依赖性过强. Struts处理Action时必需要依赖ServletRequest 和ServletResponse,所有它摆脱不了Servlet容器。
6、前端表达式语言方面.Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。
7、对Action执行的控制困难. Struts创建一个Action,如果想控制它的执行顺序将会非常困难。甚至你要重新去写Servlet来实现你的这个功能需求。
8、对Action 执行前和后的处理. Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操作。
9、对事件支持不够. 在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件。
Struts重要的表单对象ActionForm是一种对象,它代表了一种应用,这个对象中至少包含几个字段,这些字段是Jsp页面表单中的input字段,因为一个表单对应一个事件,所以,当我们需要将事件粒度细化到表单中这些字段时,也就是说,一个字段对应一个事件时,单纯使用Struts就不太可能,当然通过结合JavaScript也是可以转弯实现的。
spring mvc优缺点: 他是一个典型的可以说是教科书式的mvc构架,而不像structs等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的我觉得 spring是最好的,他的实现就是教科书!第二他和tapestry一样是一个纯正的servlet系统,这也是他和tapestry相比 structs所没有的优势。而且框架本身有代码,而且看起来也不费劲比较简单可以理解。
缺点:使用人数少、jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器
WebWork 优缺点: 优点:结构简单易于扩展、标签库易于定制、拦截器非常出色
缺点:文档示例很少、客户端验证技术不成熟
17.介绍几种常用的设计模式:
1.业务委托模式:表示层组件将与业务层服务交互。这样,业务层改变会使表示层也需要改变。业务委托模式可以解决这个问题。
业务委托模式的目的就是减少表示层和业务层的耦合,隐藏业务服务的各种复杂实现细节,如查找与访问细节。
2.会话门面模式:在服务器方编写服务层组件时,我们要处理复杂的企业Bean,封装业务逻辑和数据。由于提供的接口很复杂,因此会使服务层也更复杂。会话门面设计模式可以减少这种复杂性。
会话门面模式在需要隐藏业务层对象交互的细节时很有用。其主要意图是处理几种工作流。也就是管理业务对象,提供客户的统一、粗粒度对象服务访问。在对象术语中,粗粒度对象具有自己的寿命周期,同时管理自己与其他对象的关系。此外,粗粒度对象的方法通常是高层的(例如addPerson()而不是 setLastName()、setFirstName()之类的)。
3.数值对象设计模式:在用ejb框架建立的企业应用程序中,不同的分布式组件之间需要交换数据。此外,前面曾介绍过,EJB框架将企业应用程序业务组件实现为会话Bean或实体Bean。而数值对象设计模式可以简化企业 Bean之间的数据交换。用数值对象设计模式封装业务数据。客户向EJB请求业务数据是,EJB构造数值对象,在对象中填入数据,按数值传递给客户。如果客户需要返回数据,则也差不多:构造数值对象,在对象中填入数据并发送给EJB。
4.累积实体设计模式:众所周知,实体Bean主要用于持久存储。设计企业应用程序时,实体Bean不需要表示每个持久对象,这更适合数据结构方法。累积实体设计模式可以设计这种粗粒机制。累积实体设计模式用于建模、表示和管理一组相关持久对象,而不是细粒实体Bean。它表示完整的对象图。
5.工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
6.DAO 模式通过对底层数据的封装,为业务曾提供一个面向对象的接口,使得业务逻辑开发员可以面向业务中的实体进行编码。通过引入DAO模式,业务逻辑更加清晰,且富于形象性和描述性,这将为日后的维护带来极大的便利。试想,在业务曾通过Customer.getName方法获得客户姓名,相对于直接通过SQL语句访问数据库表并从ResultSet中获得某个字符型字段而言,哪种方式更加易于业务逻辑的形象化和简洁化?
DAO模式,在项目开发中主要用在数据层,封装数据的访问操作,为业务层提供数据服务。
7.MVC模式,在J2EE项目开发中主要用在表示层框架中,很好解决视图和流程控制。在项目中采用的Struts、WebWork等框架。
8.IoC模式,在项目开发中业务层有大量对象,他们之间存在依赖关系,可以使用IoC模式减少他们之间的代码耦合,提高系统的可扩展性。实际项目中使用的Spring框架来实现业务组件的装配。
9.Observer模式,在Servlet的监听器中应用到了观察者模式。
10.singleton单例模式和Factory工厂模式结合使用在项目中无需使用者了解过多的细节就可获取有关的对象实例。比如Hibernate项目中通过SessionFactory来获取Session。
11.bridge模式,在项目中使用JDBC驱动访问数据库。
18.几种常用的数据结构及内部实现原理?
链表:一个链表由很多节点组成,每个节点包含表示内容的数据域和指向下一个节点的链域两部分。正是通过链域将节点连接形成一个表。围绕链表的基本操作有添加节点、删除节点和查找节点等。
堆栈:限定了只能从线性表的一端进行数据的存取,这一端称为栈顶,另一端为栈底。入栈操作是先向栈顶方向移动一位,存入数据;出栈操作则是取出栈顶数据,然后向栈底移动一位。体现LIFO/FILO的思想。
队列:限定了数据只能从线性表的一端存入,从另一端取出。存入一端成为队尾,取出一端称为队首。体现LILO/FIFO的思想。
二叉树:树中的每个节点最多有两个子节点。这两个子节点分别称为左子节点和右子节点。在建立二叉搜索树时,要求一个节点的左子节点的关键字值小于这个节点而右子节点的关键字值大于或等于这个节点。常见的遍历操作有前序、中序和后序遍历。