Java基础知识(51-100)


51、垃圾回收的优点

和原理。并考虑2种回收机制。
Java 语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内

存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存

管 理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对

象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使

用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情

况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员

不能 实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有

分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

52、请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要

捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不

能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是

按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对

象的锁,而是让它们竞争。

53、你所知道的集合类都有哪些?主要方法?
最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector

,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表

。 List 适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键

"和"值"),其中每个键映射到一个值。

54、描述一下JVM加载class文件的原理机制?
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个

重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

55、char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,

所以放一个中文是没问题的

56、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify

57、JSP的内置对象及方法。
request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且

提供了几个用于获取cookie, header, 和session数据的有用的方法。
response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的

响应的方法(如cookies,头信息等)
out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏

览器回送输出结果。
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取

各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相

关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存

贮用户的状态信息
applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关

servlet引擎和servlet环境的信息
config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实

例的初始化参数。
page表示从该页面产生的一个servlet实例

58、线程的基本概念、线程的基本状态以及状态之间的关系
线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都

有一个线程,也就是程序本身。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。

59、JSP的常用指令

isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)

" target="_blank">http://......"%>

60、什么情况下调用doGet()和doPost()?
Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用

doPost()。

61、servlet的生命周期
web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行

servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的

do***()方法。结束服务,web容器调用servlet的destroy()方法。

62、如何现实servlet的单线程模式


63、页面间对象传递的方法
request,session,application,cookie等

64、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
JSP 是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表

达。JSP编译后是"类servlet"。Servlet和JSP最 主要的不同点在于,Servlet的

应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情

况是Java和HTML可以组合 成一个扩展名为.jsp的文件。JSP侧重于视图,

Servlet主要用于控制逻辑。

65、四种会话跟踪技术
会话作用域ServletsJSP 页面描述
page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java

servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。

这既包括 servlet 又包括被编译成 servlet 的 JSP 页面
request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可

能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的

关系)
session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一

个 Web 会话可以也经常会跨越多个客户机请求
application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越

整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域

66、Request对象的主要方法:
setAttribute(String name,Object):设置名字为name的request的参数值
getAttribute(String name):返回由name指定的属性值
getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举

的实例
getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
getContentLength():返回请求的Body的长度
getHeader(String name):获得HTTP协议定义的文件头信息
getHeaders(String name):返回指定名字的request Header的所有值,结果是

一个枚举的实例
getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例
getInputStream():返回请求的输入流,用于获得请求中的数据
getMethod():获得客户端向服务器端传送数据的方法
getParameter(String name):获得客户端传送给服务器端的有name指定的参数


getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是

一个枚举的实例
getParameterValues(String name):获得有name指定的参数的所有值
getProtocol():获取客户端向服务器端传送数据所依据的协议名称
getQueryString():获得查询字符串
getRequestURI():获取发出请求字符串的客户端地址
getRemoteAddr():获取客户端的IP地址
getRemoteHost():获取客户端的名字
getSession([Boolean create]):返回和请求相关Session
getServerName():获取服务器的名字
getServletPath():获取客户端所请求的脚本文件的路径
getServerPort():获取服务器的端口号
removeAttribute(String name):删除请求中的一个属性

67、J2EE是技术还是平台还是框架?
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。

68、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,

如何输出一个某种编码的字符串?
Public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}

69、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。
区别主要答两点:a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔

型,而且可以操作数值型
b.逻辑操作不会产生短路

70、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方

式?
a: 两种形式 dtd schema
b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展

schema的根本目的)
c:有DOM,SAX,STAX等
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成

的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内

存,适合对XML的随机访问
SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要

一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结

束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文

件,适合对XML的顺序访问
STAX:Streaming API for XML (StAX)

xml文档有两种定义方法:
dtd:数据类型定义(data type definition),用以描述XML文档的文档结构,

是早期的XML文档定义形式。
schema:其本身是基于XML语言编写的,在类型和语法上的限定能力比dtd强,处

理也比较方便,因为此正逐渐代替dtd成为新的模式定义语言。

71、简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。

synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在

finally从句中释放。

72、EJB的角色和三个对象
一 个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同

的开发商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证

彼此之间的兼容性。这六个角色分别是EJB组件开发者(Enterprise Bean

Provider) 、应用组合者(Application Assembler)、部署者(Deployer)、

EJB 服务器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container

Provider)、系统管理员(System Administrator)
三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类

73、EJB容器提供的服务
主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行

管理等服务。

74、EJB规范规定EJB中禁止的操作有哪些?
1. 不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等),2.

不能操作awt,3.不能实现服务器功能,4.不能对静态属 生存取,5.不能使用IO

操作直接存取文件系统,6.不能加载本地库.,7.不能将this作为变量和返回,

8.不能循环调用。

75、remote接口和home接口主要作用
remote接口定义了业务方法,用于EJB客户端调用业务方法。
home接口是EJB工厂用于创建和移除查找EJB实例

76、bean 实例的生命周期
对 于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在

缓冲池管理,而对于Entity Bean和Statefull Session Bean存在Cache管理,通

常包含创建实例,设置上下文、创建EJB Object(create)、业务方法调用、

remove等过程,对于存在缓冲池管理的Bean,在create之后实例并不从内存清除

,而是采用缓冲 池调度机制不断重用实例,而对于存在Cache管理的Bean则通过

激活和去激活机制保持Bean的状态并限制内存中实例数量。

77、EJB的激活机制
以Stateful Session Bean 为例:其Cache大小决定了内存中可以同时存在的

Bean实例的数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活

机制是当客户端调 用某个EJB实例业务方法时,如果对应EJB Object发现自己没

有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回

复(激活)此实例。状态变迁前会调用对应的 ejbActive和ejbPassivate方法。

78、EJB的几种类型
会话(Session)Bean ,实体(Entity)Bean 消息驱动的(Message Driven)

Bean
会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种
实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种

79、客服端调用EJB对象的几个基本步骤
设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用

Create方法创建Remote接口,通过Remote接口调用其业务方法。

80、如何给weblogic指定大小的内存?
在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的

startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以调整最小内存

为32M,最大200M

81、如何设定的weblogic的热启动模式(开发模式)与产品发布模式?
可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修

改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true。

82、如何启动时不需输入用户名与密码?
修改服务启动文件,增加 WLS_USER和WLS_PW项。也可以在boot.properties文件

中增加加密过的用户名和密码.

83、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及

ejb或连接池等相关信息进行配置后,实际保存在什么文件中?
保存在此Domain的config.xml文件中,它是服务器的核心配置文件。

84、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的

helloWorld.jsp放入何目录下,然的在浏览器上就可打入 http://主机:端口

号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的

javaBean该如何办?
Domain 目录服务器目录applications,将应用目录放在此目录下将可以作为应

用访问,如果是Web应用,应用目录需要满足Web应用目录要求,jsp文 件可以直

接放在应用目录中,Javabean需要放在应用目录的WEB-INF目录的classes目录中

,设置服务器的缺省应用将可以实现在浏览器上无 需输入应用名。

85、在weblogic中发布ejb需涉及到哪些配置文件
不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-

jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-

jar.xml

86、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行

ssl的配置
缺 省安装中使用DemoIdentity.jks和DemoTrust.jks KeyStore实现SSL,需要配

置服务器使用Enable SSL,配置其端口,在产品模式下需要从CA获取私有密钥和

数字证书,创建identity和trust keystore,装载获得的密钥和数字证书。可以

配置此SSL连接是单向还是双向的。

87、如何查看在weblogic中已经发布的EJB?
可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB

88、CORBA是什么?用途是什么?
CORBA 标准是公共对象请求代理结构(Common Object Request Broker

Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标

准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许

应用程序间互操作的协议。 其目的为:用不同的程序设计语言书写在不同的进

程中运行,为不同的操作系统开发。

89、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
Session Facade Pattern:使用SessionBean访问EntityBean
Message Facade Pattern:实现异步调用
EJB Command Pattern:使用Command JavaBeans取代SessionBean,实现轻量级

访问
Data Transfer Object Factory:通过DTO Factory简化EntityBean数据提供特


Generic Attribute Access:通过AttibuteAccess接口简化EntityBean数据提供

特性
Business Interface:通过远程(本地)接口和Bean类实现相同接口规范业务逻

辑一致性
EJB架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重

用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。

90、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题

而JMS服务器依然会将消息在此MDB可用的时候发送过来,而non-persistent方

式的消息将被丢弃。

既然没有标准答案,就根据自己的所了解的,补充修正一下好了

91、Servlet执行时一般实现哪几个方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()

init ()方法在servlet的生命周期中仅执行一次,在服务器装载servlet时执行

。缺省的init()方法通常是符合要求的,不过也可以根据需要进行 override,

比如管理服务器端资源,一次性装入GIF图像,初始化数据库连接等,缺省的

inti()方法设置了servlet的初始化参数,并用它 的ServeltConfig对象参数来

启动配置,所以覆盖init()方法时,应调用super.init()以确保仍然执行这些任

务。

service ()方法是servlet的核心,在调用service()方法之前,应确保已完成

init()方法。对于HttpServlet,每当客户请求一个 HttpServlet对象,该对象

的service()方法就要被调用,HttpServlet缺省的service()方法的服务功能就

是调用与 HTTP请求的方法相应的do功能,doPost()和doGet(),所以对于

HttpServlet,一般都是重写doPost()和doGet() 方法。

destroy()方法在servlet的生命周期中也仅执行一次,即在服务器停止卸载

servlet时执行,把servlet作为 服务器进程的一部分关闭。缺省的destroy()方

法通常是符合要求的,但也可以override,比如在卸载servlet时将统计数字保

存在文件 中,或是关闭数据库连接。

getServletConfig()方法返回一个servletConfig对象,该对象用来返回初始化

参数和servletContext。servletContext接口提供有关servlet的环境信息。

getServletInfo()方法提供有关servlet的信息,如作者,版本,版权。

92、j2ee常用的设计模式?说明工厂模式。
Java中的23种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模

式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式)


Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式

),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式

),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式


工 厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以

根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象

父类并且 实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作

。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然

后需要定义一个 工厂类,工厂类可以根据条件生成不同的子类实例。当得到子

类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子

类的实例。

93、EJB需直接实现它的业务接口或Home接口吗,请简述理由。
远程接口和Home接口不需要直接实现,他们的实现代码是由服务器产生的,程序

运行中对应实现类会作为对应接口类型的实例被使用。

其实一直都不是很明白EJB的remote接口,home接口,Bean类究竟是如何使用的

,或许应该进一步了解EJB的原理吧,查到了一个原创文章,那就说说EJB调用的

原理吧。其实在这个问题上,最需要理解的是RMI机制原理。

一个远程对象至少要包括4个class文件:远程对象、远程对象接口、实现远程接

口的对象的stub、对象的skeleton。

而在EJB中则至少要包括10个class:
Bean类,特定App Server的Bean实现类
Bean的remote接口,特定App Server的remote接口实现类,特定App Server的

remote接口的实现类的stub类和skeleton类。
Bean的home接口,特定App Server的home接口实现类,特定App Server的home接

口的实现类的stub类和skeleton类。

和RMI不同的是,EJB中这10个class真正需要用户写的只有3个,Bean类,remote

接口,home接口,其它的7个究竟怎么生成,被打包在哪里,是否需要更多的类

文件,否根据不同的App Server表现出较大的差异。

Weblogic:
home接口和remote接口的weblogic的实现类的stub类和skeleton类是在EJB被部

署到weblogic的时候,由weblogic动态生成stub类和skeleton类的字节码,所以

看不到这4个类文件。

对 于一次客户端远程调用EJB,要经过两个远程对象的多次RMI循环。首先是通

过JNDI查找Home接口,获得Home接口的实现类,这个过程其实相当复 杂,首先

是找到Home接口的Weblogic实现类,然后创建一个Home接口的Weblogic实现类的

stub类的对象实例,将它序列化传送给客户 端(注意stub类的实例是在第1次

RMI循环中,由服务器动态发送给客户端的,因此不需要客户端保存Home接口的

Weblogic实现类的stub 类),最后客户端获得该stub类的对象实例(普通的RMI

需要在客户端保存stub类,而EJB不需要,因为服务器会把stub类的对象实例发

送给客户 端)。

客户端拿到服务器给它的Home接口的Weblogic实现类的stub类对象实例以后,调

用stub类的create方法, (在代码上就是home.create(),但是后台要做很多事

情),于是经过第2次RMI循环,在服务器端,Home接口的Weblogic实现类的

skeleton类收到stub类的调用信息后,由它再去调用Home接口的Weblogic实现类

的create方法。

在服务端,Home 接口的Weblogic实现类的create方法再去调用Bean类的

Weblogic实现类的ejbCreate方法,在服务端创建或者分配一个EJB 实例,然后

将这个EJB实例的远程接口的Weblogic实现类的stub类对象实例序列化发送给客

户端。

客户端收到remote接 口的Weblogic实现类的stub类的对象实例,对该对象实例

的方法调用(在客户端代码中实际上就是对remote接口的调用),将传送给服务

器端 remote接口的Weblogic实现类的skeleton类对象,而skeleton类对象再调

用相应的remote接口的Weblogic实现类, 然后remote接口的Weblogic实现类再

去调用Bean类的Weblogic实现类,如此就完成一次EJB对象的远程调用。

先拿普通RMI来说,有4个class,分别是远程对象,对象的接口,对象的stub类

和skeleton类。而对象本身和对象的stub类同时都实现了接口类。而我们在客户

端代码调用远程对象的时候,虽然在代码中操纵接口,实质上是在操纵stub类,

例如:
接口类:Hello
远程对象:Hello_Server
stub类:Hello_Stub
skeleton类:Hello_Skeleton

客户端代码要这样写:
Hello h = new Hello_Stub();
h.getString();

我们不会这些写:
Hello_Stub h = new Hello_Stub();
h.getString();

因 为使用接口适用性更广,就算更换了接口实现类,也不需要更改代码。因此

客户端需要Hello.class和Hello_Stub.class这两个文件。 但是对于EJB来说,

就不需要Hello_Stub.class,因为服务器会发送给它,但是Hello.class文件客

户端是省不了的,必须有。表面 上我们的客户端代码在操纵Hello,但别忘记了

Hello只是一个接口,抽象的,实质上是在操纵Hello_Stub。

拿Weblogic上的EJB举例子,10个class分别是:
Bean类:HelloBean (用户编写)
Bean类的Weblogic实现类:HelloBean_Impl (EJBC生成)

Home接口:HelloHome (用户编写)
Home接口的Weblogic实现类 HelloBean_HomeImpl(EJBC生成)
Home接口的Weblogic实现类的stub类 HelloBean_HomeImpl_WLStub(部署的时候

动态生成字节码)
Home接口的Weblogic实现类的skeleton类 HelloBean_HomeImpl_WLSkeleton(部

署的时候动态生成字节码)

Remote接口: Hello (用户编写)
Remote接口的Weblogic实现类 HelloBean_EOImpl(EJBC生成)
Remote接口的Weblogic实现类的stub类 HelloBean_EOImpl_WLStub(部署的时候

动态生成字节码)
Remote接口的Weblogic实现类的skeleton类 HelloBean_EOImpl_WLSkeleton(部

署的时候动态生成字节码)

客户端只需要Hello.class和HelloHome.class这两个文件。

HelloHome home = (Home) PortableRemoteObject.narrow(ctx.lookup

("Hello"), HelloHome.class);

这一行代码是从JNDI获得Home接口,但是请记住!接口是抽象的,那么home这个

对象到底是什么类的对象实例呢?很简单,用toString()输出看一下就明白了,

下面一行是输出结果:
HelloBean_HomeImpl_WLStub@18c458
这表明home这个通过从服务器的JNDI树上查找获得的对象实际上是

HelloBean_HomeImpl_WLStub类的一个实例。
接下来客户端代码:

Hello h = home.create()

同样Hello只是一个抽象的接口,那么h对象是什么东西呢?打印一下:
HelloBean_EOImpl_WLStub@8fa0d1
原来是HelloBean_EOImpl_WLStub的一个对象实例。

用这个例子来简述一遍EJB调用过程:

首先客户端JNDI查询,服务端JNDI树上Hello这个名字实际上绑定的对象是

HelloBean_HomeImpl_WLStub,所以服务端将创建HelloBean_HomeImpl_WLStub的

一个对象实例,序列化返回给客户端。

于 是客户端得到home对象,表面上是得到HelloHome接口的实例,实际上是进行

了一次远程调用得到了 HelloBean_HomeImpl_WLStub类的对象实例,别忘记了

HelloBean_HomeImpl_WLStub也实现了 HelloHome接口。

然后home.create()实质上就是 HelloBean_HomeImpl_WLStub.create(),该方法

将发送信息给 HelloBean_HomeImpl_WLSkeleton,而

HelloBean_HomeImpl_WLSkeleton接受到信息后,再去调用 HelloBean_HomeImpl

的create方法,至此完成第1次完整的RMI循环。

注意在这次RMI循环过程中,远程对象 是HelloBean_HomeImpl,远程对象的接口

是HelloHome,对象的stub是HelloBean_HomeImpl_WLStub, 对象的skeleton是

HelloBean_HomeImpl_WLSkeleton。

然后HelloBean_HomeImpl 再去调用HelloBean_Impl的ejbCreate方法,而

HelloBean_Impl的ejbCreate方法将负责创建或者分配一个 Bean实例,并且创建

一个HelloBean_EOImpl_WLStub的对象实例。

这一步比较有趣的是,在前一步RMI循环 中,远程对象HelloBean_HomeImpl在客

户端有一个代理类HelloBean_HomeImpl_WLStub,但在这一步,

HelloBean_HomeImpl自己却充当了HelloBean_Impl的代理类,只不过

HelloBean_HomeImpl不在客户端,而是 在服务端,因此不进行RMI。

然后HelloBean_EOImpl_WLStub的对象实例序列化返回给客户端,这一步也很有

趣, 上次RMI过程,主角是HelloBean_HomeImpl和它的代理类

HelloBean_HomeImpl_WLStub,但这这一次换成了 HelloBean_EOImpl和它的代理

类HelloBean_EOImpl_WLStub来玩了。


Hello h = home.create();h.helloWorld();

假设Hello接口有一个helloWorld远程方法,那么表面上是在调用Hello接口的

helloWorld方法,实际上是在调用HelloBean_EOImpl_WLStub的helloWorld方法

然 后HelloBean_EOImpl_WLStub的helloWorld方法将发送信息给服务器上的

HelloBean_EOImpl_WLSkeleton,而HelloBean_EOImpl_WLSkeleton收到信息以后

,再去调用 HelloBean_EOImpl的helloWorld方法。至此,完成第2次完整的RMI

循环过程。

在刚才 HelloBean_EOImpl是作为远程对象被调用的,它的代理类是

HelloBean_EOImpl_WLStub,但现在 HelloBean_EOImpl要作为HelloBean_Impl的

代理类了。现在HelloBean_EOImpl去调用 HelloBean_Impl的helloWorld方法。

注意!HelloBean_Impl继承了HelloBean,而HelloBean中的 helloWorld方法是

我们亲自编写的代码,现在终于调用到了我们编写的代码了!

至此,一次EJB调用过程终于完成。在整个过程 中,服务端主要要调用的类是

HelloBean_Impl, HelloBean_HomeImpl,HelloBean_HomeImpl_WLSkeleton,

HelloBean_EOImpl, HelloBean_EOImpl_WLSkeleton。客户端主要调用的类是

HelloBean_HomeImpl_WLStub, HelloBean_EOImpl_WLStub,这两个类在客户端

代码中并不会直接出现,出现在代码中的类是他们的接口HelloHome和 Hello,

因此客户端需要这两个接口文件,而Stub是服务器传送给他们的。

http://www.pbase.com/nobo123/image/27229257

http://forum.javaeye.com/viewtopic.php?

t=3832&postdays=0&postorder=asc&start=0

94、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、

快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排

序、基数排序)
快速排序的伪代码。
/ /使用快速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点
把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于

支点,而right 中的元素都大于等于支点
递归地使用快速排序方法对left 进行排序
递归地使用快速排序方法对right 进行排序
所得结果为l e f t + m i d d l e + r i g h t

95、请对以下在J2EE中常用的名词进行解释(或简单描述)
web 容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使

JSP,SERVLET直接和容器中的环境变量接接口互,不必关注其它系统问 题。主要

有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口

严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务

器就叫做J2EE中的WEB容器。
Web container:实现J2EE体系结构中Web组件协议的容器。这个协议规定了一个

Web组件运行时的环境,包括安全,一致性,生命周期管理,事务, 配置和其它

的服务。一个提供和JSP和J2EE平台APIs界面相同服务的容器。一个Web

container 由Web服务器或者J2EE服务器提供。
EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在

其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被

容器进行高效率的管理。并 且可以通过现成的接口来获得系统级别的服务。例

如邮件服务、事务管理。
一个实现了J2EE体系结构中EJB组件规范的容器。
这个规范指定了一个Enterprise bean的运行时环境,包括安全,一致性,生命

周期,事务,
配置,和其他的服务。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供

的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引

,从而满足快速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的

通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应

用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的

框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP: (Remote Method Invocation /internet对象请求中介协议)他们主

要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股

票分析服务,我们可以在本地计算机 上实现对其直接调用。当然这是要通过一

定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。
RMI-IIOP出现以前,只有RMI和 CORBA两种选择来进行分布式程序设计。RMI-

IIOP综合了RMI和CORBA的优点,克服了他们的缺点,使得程序员能更方便的编写

分布式程序设 计,实现分布式计算。首先,RMI-IIOP综合了RMI的简单性和

CORBA的多语言性(兼容性),其次RMI-IIOP克服了RMI只能用于Java 的缺点和

CORBA的复杂性(可以不用掌握IDL)。

96、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分

别代表什么意义?在try块中可以抛出异常吗?

Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供

了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它 子

类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信

息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是

通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下

是用try来执行一段程序,如果出现异常,系统会抛 出(throws)一个异常,这

时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器

来处理。
用try来指定一块预防所有"异常"的程序。紧跟在try程序后面,应包含一个

catch子句来指定你想要捕捉的"异常"的类型。
throw语句用来明确地抛出一个"异常"。
throws用来标明一个成员函数可能抛出的各种"异常"。
Finally为确保一段代码不管发生什么"异常"都被执行一段代码。
可 以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个

try语句保护其他代码。每当遇到一个try语句,"异常"的框架就放到堆栈上 面

,直到所有的try语句都完成。如果下一级的try语句没有对某种"异常"进行处理

,堆栈就会展开,直到遇到有处理这种"异常"的try语句。

http://www.programfan.com/article/showarticle.asp?id=2731

97、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以。必须只有一个类名与文件名相同。

98、MVC的各个部分都有那些技术来实现?如何实现?
MVC 是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(

通过JavaBean,EJB组件实现), "View" 是应用的表示面,用于与用户的交互

(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个

Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组

件实现。这些组件可以进行交互和重 用。
model层实现系统中的业务逻辑,view层用于与用户的交互,controller层是

model与view之间沟通的桥梁,可以分派用户的请求并选择恰当的视图以用于显

示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

99、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()

和suspend()方法为何不推荐使用?
有两种实现方法,分别是继承Thread类与实现Runnable接口
用synchronized关键字修饰同步方法
反 对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如

果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结

果 很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()

的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此 时,其他

任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来

说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就 会造

成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,

指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入

等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

100、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,

请说出他们分别是哪些类?
字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于

InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,

主要是为了提高性能和使用方便。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值