问题及答案来源自《Java程序员面试笔试宝典》第五章 Java Web 5.2 J2EE与EJB
1、什么是J2EE?
J2EE是Java平台企业版的简称,是用来开发和部署企业级应用的一个架构,提供了统一的、开放标准的多层平台
J2EE核心是一组技术规范与指南,其中所包含的各类组件、服务架构及技术层次,均有共同的标准及规格,让各种
依循J2EE架构的不同平台之间,存在良好的兼容性,解决过去企业后端使用的信息产品彼此之间无法兼容,企业内部
或外部难以互通的窘境。
J2EE组件和“标准的” Java类的不同点在于:它被装配在一个J2EE应用中,具有固定的格式并遵守J2EE规范,由J2EE服务器对其进行管理。
J2EE组件:
- 客户端应用程序和applet是运行在客户端的组件
- Java Servlet和Java Server Pages (JSP) 是运行在服务器端的Web组件
- Enterprise Java Bean (EJB )组件是运行在服务器端的业务组件
3、EJB有哪些不同的类型?
EJB:
EJB是enterprise JavaBean的简称,相当于分布式组件对象模型,它是一种服务器端组件体系结构,用于开发和部署
多层的、分布式的以及面向对象的应用体系的跨平台体系结构。EJB简化了Java开发企业级的分布式组件应用程序的
过程, 它定义了一组可重用的组件:Enterprise Beans
EJB分为如下三种类型:
(1)Session Bean
Session Bean用来实现服务器端的业务逻辑,同时协调Bean之间的交互,另外Session Bean仅存在于客户应用和服务器交互的
时间段内,Session Bean中的数据不会保存在数据库中
Session Bean可以分为两种状态:
- Stateless Session Bean(无状态的Session Bean)
- Stateful Session Bean(有状态的Session Bean)
(2)Entity Bean
Entity Bean主要是资料组件,代表数据库里的记录,因此它与数据库中的数据有着相同的生存周期,也就是说只要数据库中的
数据存在,Entity Bean就一直存在。另外Entity Bean还可以被多个客户应用共享
(3)Message Driver Bean
Message Driver Bean用来处理异步消息,一般不是由用户调用,它的调用方式是一旦有异步消息发到某个Message Driver Bean
后,容器都会负责调用Message Driver Bean的OnMessage()方法来处理异步请求
4、EJB与JavaBean有什么异同?
EJB:
EJB是基于Java的远程方法调用技术,可以被远程访问(跨进程、跨计算机),但它必须部署在webspere、weblogic等容器中
EJB客户从不直接访问真正的EJB组件,而是通过其容器访问,EJB容器是EJB组件的代理,其组件由容器创建和管理
Java Bean:
Java Bean是可重用的组件,没有严格的规范限制,因此可以说任何一个类都是一个javabean,但是通常情况下,java bean是
由容器所创建的(比如tocamt).而且javabean必须要有自己的无参构造器,必须实现serializable接口便于持久化操作。所以
Java Bean就相当于com组件,是不能被跨进程访问的。
EJB与Java Bean的区别:
- EJB主要用在服务器端的开发,Java Bean主要用在客户端的开发
- EJB可作为独立的单元被部署到EJB容器中,Java Bean不可部署
- EJB支持使用部署描述对EJB应用进行定制化,Java Bean定制化只能在开发阶段
- EJB构件分布式对象,可以被远程的对象访问,Java Bean构件不是分布式对象,只能在应用程序内部被访问
- EJB构件对终端用户不可见,部分Java Bean对终端用户可见
5、EJB有哪些生命周期?
EJB有 entity bean, session bean, MD bean(Message Driver Bean)
其实entity bean 是随便服务器启动而初始化,随着服务器关闭而销毁。
MD bean作为JMS的消费端,不包含客户端状态,它的生命周期有EJB容器用对象池管理管理。所以应该是当JMS端访问
MD bean时候 可能会创建,也可能会调用一个已经存在的。
关于session bean, 分为有状态和无状态。
- 有状态session bean 的生命周期是客户端访问请求时候创建,并且受事务管理,在事物完成后销毁。
- 无状态session bean 的生命周期类似于MD bean,有对象池管理。
6、EJB的角色有哪几种?
EJB将开发部署EJB应用的任务划分到了6个不同的角色,它们分别为:
- Enterprise Bean Provider:企业级组件开发者
- Application Assembler:应用组合者
- EJB Deployer:EJB部署者
- EJB Server Provider:EJB服务器提供者
- EJB Container Provider:EJB容器提供者
- System Administrator:系统管理员
每个角色都可以由不同的开发商提供,每个角色所做的工作都必须严格遵循EJB规范,并保证彼此之间的兼容性
11、web服务器与web应用服务器有什么区别?
web服务器:
真正意义上的web服务器就两个 : IIS 和 apache
web 服务器可以提供代理服务,即可以访问本地磁盘上所有的资源文件,即使项目资源文件没有放在服务器中。
常见的web服务器有: nginx , nginx 是Apache 提供的web服务器,nginx是一款高性能、轻量级的web服务器和
反向代理服务器以及邮件代理服务器。支持高并发,并发量50000 。nginx不能解析动态的jsp页面
web应用服务器:
在java web开发时,最早接触的web服务器是tomcat,其实tomcat是web应用服务器,任何的 web项目资源文件如果
没有部署在tomcat应用服务器中(资源文件没有放在tomcat安装目录中),都将不能访问得到
类似的web应用服务器还有 weblogic 和 jetty等
两者的区别:
- web服务器只能解析静态页面,即html页面,它请求的路径是固定的
- web应用服务器可以解析动态的jsp页面,即它请求的路径是动态生成的,负责的是请求的逻辑处理
一般在web项目开发 中,apache+tomcat+nginx联合使用,访问静态资源时用apache解析,访问动态资源时
用tomcat解析,nginx作为反向代理服务器,同时支持高并发
12、什么是Web Service?
WebService:
WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的
相互调用,通过Internet进行基于Http协议的网络应用间的交互。 WebService实现不同语言间的调用,是依托于一个
标准,webservice是需要遵守WSDL(web服务定义语言)/SOAP(简单请求协议)规范的。
WebService=WSDL+SOAP+UDDI(webservice的注册)
Web Service是通过提供标准的协议和接口,可以让不同的程序集成的一种SOA架构。
WebService基于以下协议实现:
- XML:可拓展标记语言
- WSDL:web服务描述语言
- UDDL:通用描述、发现与集成服务
- SOAP:简单对象存取协议
WebService的优点:
- 完好的封装性
- 松耦合
- 动态性
WebService的基本原理:
- Service Provider采用WSDL描述服务
- Service Provider 采用UDDI将服务的描述文件发布到UDDI服务器(Register server)
- Service Requestor在UDDI服务器上查询并 获取WSDL文件
- Service requestor将请求绑定到SOAP,并访问相应的服务
13、SOAP与REST有什么区别?
SOAP和REST:
SOAP:将HTTP协议作为传输层协议,本质是采用HTTP进行传输,使用XML封装消息内容的RPC调用。
REST:REST并不是一种协议,只是一种设计规范,该设计规范要求程序遵守HTTP协议最初设计的初衷,
使用HTTP的GET/PUT/DELTET/POST对资源进行操作,REST接口是以URI资源为基础,对资源进行CRUD操作的接口。
SOAP和REST的对比:
SOAP相对REST来说较为重量级
SOAP接口是自解释的,采用WSDL进行描述,程序可以基于WSDL进行解释并自动生成SOAP调用代码;
REST接口只能通过接口文档进行描述,难以做到程序解释接口定义。
SOAP采用HTTP作为传输层协议,对HTTP协议来说服务调用是透明的,防火墙上难以对SOAP进行细粒度的权限控制,
也难以使用http的缓存机制提高效率。而REST是标准的HTTP访问,可以充分利用HTTP协议提供的一些好处,例如
可在防火墙上进行权限控制(最小粒度可以基于每个URL的操作),也可充分利用缓存提高响应速度和系统的吞吐效率。
由于REST是标准的HTTP访问,其适用性更广,web应用,移动应用都可以在不使用第三方库的情况下使用REST接口构造应用程序
根据REST设计原则,接口是无状态的,因此可以简单地通过对服务器进行水平扩展提升服务能力
15、数据库连接池的工作机制是怎样的?
数据库连接池的作用:
数据库连接池负责分配、管理并释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立新的数据库
连接,同时它还负责释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接泄漏
数据库连接池的原理:
在J2EE中,服务器启动时会创建一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序
会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有
配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接
16、J2EE开发中有哪些调优方法?
调优方式如下:
- 优化设计:组合代替继承
- 使用数据库连接池
- 给web容器配置合理的线程数量来处理客户端的http请求
- 使用框架(eg:Hibernate)提高系统效率
- 使用缓存
- 优化IO性能
- 优化查询
- 对session进行合理管理及设置