Java常见面试题

js860126

贡献于2014-10-20

字数:85706 关键词: 面试题目 试题 Java

 常 见 面 试 题 使用:________ 整理:王 泽 浩 时间:2008-3-5 第 页 共 42 页 目 录 1、Struts 框架的组件结构 7 2、我相信Spring是独特的,因为若干个原因 7 3、Spring的架构性的好处 7 4、Spring覆盖了许多方面,我们已经清楚它的概念,那它应该涉及什么和不应该涉及什么 7 5、Spring的设计核心是org.springframework.beans包,是怎样与javabeans一起工作的 8 6、org.springframwork.benas.factory.BeanFactory是一个简单的接口,为什么说是为了底层存储方法而实现的 8 7、通过Bean Factory概念,Spring成为一个倒置控制容器 8 8、为什么说Spring BeanFactories是非常轻量级的 8 9、Spring ApplicationContext是什么 8 10、在J2EE应用中常看到什么用来配置三个应用对象 8 11、Hibernate是什么 8 12、两个比较重要的概念 8 13、Hibernate核心接口的层次架构关系 9 14、Hibernate的工作方式 9 15、使用Hibernate的场合 9 16、再使用Hibernate进行查询 9 17、传统上,Hibernate的配置依赖与外部XML文件 9 18、为什么要使用Hibernate?使用Hibernate的好处 10 19、javaServer Faces(JSF)是一种用与构建Web应用程序的新标准java框架 10 20、JSF体系结构 10 21、JSF的生命周期 10 22、javaServer Faces的用户界面组件 11 23、javaServer Faces是sun公司的一项技术,简称JSF 11 24、具有代表性的JSF简化Web开发技术 11 25、SPRING的特点 11 26、组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下 13 27、IOC和AOP 13 28、MVC有以下优点 14 29、WebWork 14 30、WebWork2的特性 14 31、作为J2EE开发人员,我们似乎经常关注“后端机制” 14 32、术语Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验。 14 33、Adaptive Path公司的Jesse James Garrentt 这样定义Ajax 15 34、Ajax工作原理 15 35、AJAX能够使用户体验更加愉快,可以提供更加灵活的UI,并消除页面刷新所带来的闪烁。 15 36、AJAX是什么 15 37、AJAX适用场景 15 38、AJAX不适用的场景 15 39、HIBERNATE IN ACTION 16 40、面向对象的特征有哪些方面 16 41、String是最基本的数据类型吗 16 42、int和Integer有什么区别 16 43、String和StringBuffer的区别 16 44、运行时异常与一般异常有异同 16 45、说出Servlet的生命周期,并说出Servlet和CGI区别 16 46、说出ArrayList,Vector,LinkedList的存储性能和特性 16 47、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,Stateful Bean和Stateless Bean的区别 16 48、Collection和Collections的区别 17 49、&和&&的区别 17 50、HashMap和Hashtable的区别 17 51、final、finally、finalize的区别 17 第 页 共 52 页 52、sleep()和wait()有什么区别 17 53、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型 17 54、error和exception有什么区别 17 55、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 17 56、abstract class和interface有什么区别 17 57、forward和redirect的区别 18 58、EJB与JAVA BEAN的区别 18 59、Static Nested Class和Inner Class的不同 18 60、JSP中动态Include与静态Include的区别 18 61、什么时候用assert 18 62、GC是什么?为什么要有GC? 18 63、short s1 = 1 ; s1 = s1 + 1 ; 有什么错? short s1 = 1; s1 += 1 ; 有什么错? 18 64、Math.round(11.5)等于多少?Math.round(-11.5)等于多少? 18 65、String s = new String(“xyz”);创建了几个String Object? 18 66、设计4个线程,其中两个线程每次对j增加1,另外两线程对j每次减少1。写出程序。以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 18 67、Java有没有goto? 19 68、启动一个线程是用run()方法还是start()方法? 19 69、EJB包括(Session Bean,Entity Bean)说出他们的生命周期,及如何管理事务的? 19 70、应用服务器有哪些? 19 71、给出一个最常见到的runtime exception 19 72、接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承实体类? 19 73、List,Set,Map是否继承自Collection接口? 19 74、说出数据连接池的工作机制是什么? 19 75、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 19 76、数组有没有length()这个方法?String有没有length()这个方法? 19 77、Set里的元素是不能重复的,那么用什么防那个法来区分重复与否呢?是用==还是equals()?他们有何区别? 19 78、构造器Constructor是否可被override? 19 79、是否可以继承String类? 20 80、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上? 20 81、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会执行,什么时候被执行,在return前还是后? 20 82、编程题:用最有效率的方法算出2乘以8等于几? 20 83、两个对象之相同(x.equals(y)==true),但却可有不同的hash code,这句话对不对? 20 84、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 20 85、当一个线程进入一个对象的一个synchronized方法后,其他线程是否可进入此对象的其他方法? 20 86、编程题:写一个Singleton出来。 20 87、Java的接口和C++的虚类的相同和不同处。 20 88、Java中的异常处理机制的简单原理和应用。 20 89、垃圾回收的优点和原理。并考虑2种回收机制。 20 90、请说出你所知道的线程同步的方法。 21 91、你所知道的集合类都有哪些?主要方法? 21 92、描述一下JVM加载class文件的原理机制? 21 93、char型变量中能不能存贮一个中文汉字?为什么? 21 94、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 21 95、JSP的内置对象及方法。 21 96、线程的基本概念、线程的基本状态以及状态之间的关系。 21 97、JSP的常用指令 21 98、什么情况下调用doGet()和doPost()? 21 99、servlet的生命周期 21 100、如何现实servlet的单线程模式 21 101、页面间对象传递的方法 21 102、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 21 第 页 共 52 页 103、四种会话跟踪技术 22 104、Request对象的主要方法 22 105、J2EE是技术还是平台还是框架 22 106、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso-8859-1等,如何输出一个某种编码的字符串? 22 107、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。 22 108、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 22 109、简述synchronized和java.util.concurrent.locks.Lock的异同? 23 110、EJB的角色和三个对象 23 111、EJB 容器提供的服务 23 112、EJB 规范规定EJB中禁止的操作有那些? 23 113、Remote接口和Home接口主要的作用 23 114、Bean实例的生命周期 23 115、EJB的激活机制 23 116、EJB的几种类型 23 117、客服端调用EJB对象的几个基本步骤 23 118、如何给weblogic指定大小内存 23 119、如何设定weblogic的热启动模式(开发模式)与产品发布模式 23 120、如何启动是不需要输入用户名和密码 23 121、在weblogic管理控制台中队一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中 23 122、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloworld.jsp放入何目录下,然后再浏览器上就可以打入http://主机:端口号//helloworld.jsp就看到运行结果了。又比如这其中用到了自己写的一个javaBean该如何办? 23 123、在weblogic中发布ejb需涉及到那些配置文件 24 124、如何在weblogic中进行ssl 配置与客户端的认证配置或说说j2ee(标准)进行ssl配置 24 125、如何查看在weblogic中发布的EJB 24 126、CORBA是什么?用途是什么 24 127、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法 24 128、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 24 129、Servlet执行时一般实现哪几个方法 24 130、j2ee常用的设计模式?说明工厂模式。 24 131、EJB需直接实现它的业务接口或Home接口吗,请简述理由。 24 132、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。 24 133、请对以下在J2EE中常用的名词进行解释(或简单描述) 25 134、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗 25 135、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 25 136、MVC的各个部分都有那些技术来实现?如何实现? 25 137、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 26 138、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 26 139、java中会存在内存泄漏吗,请简单描述。 26 140、java中实现多态的机制是什么? 26 141、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 26 142、静态变量和实例变量的区别? 26 143、什么是java序列化,如何实现java序列化? 26 144、是否可以从一个static方法内部发出对非static方法的调用? 26 145、写clone()方法时,通常都有一行代码,是什么? 26 146、在JAVA中,如何跳出当前的多重嵌套循环? 26 147、List、Map、Set三个接口,存取元素时,各有什么特点? 26 148、J2EE是什么 26 149、UML方面 26 150、说出一些常用的类,包,接口,请各举5个 26 151、开发中都用到了那些设计模式?用在什么场合? 26 152、应用服务器与WEB SERVER的区别? 27 153、BS与CS的联系与区别。 27 154、LINUX下线程,GDI类的解释。 27 第 页 共 52 页 155、STRUTS的应用(如STRUTS架构) 27 156、Jdo是什么? 27 157、内部类可以引用他包含类的成员吗?有没有什么限制? 28 158、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 28 159、JAVA代码查错 28 160、JAVA编译题 29 161、以下三条输出语句分别输出什么? [C] 30 162、非 C++ 内建类型 A 和 B,在哪几种情况下 B 能隐式转化为 A ? [C++] 30 163、以下代码中的两个 sizeof 用法有问题吗? [C] 30 164、以下代码有什么问题? [C] 30 165、以下代码有什么问题? [C++] 30 166、以下反向遍历array数组的方法有什么错误?[STL易] 31 167、以下代码有什么问题?[STL] 31 168、heap和stack有什么区别 31 169、如何设置Java 2(JDK1.2)的环境变量? 31 170、Java 2环境变量的设置如下例所示 31 171、哪些Java集成开发工具支持Java 2? 31 172、如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围? 31 173、当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码? 31 174、当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示? 32 175、如何设置Java WebServer的CLASSPATH,以包含用户的class文件? 32 176、为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢? 32 177、编写Java application时,如何设置proxy的信息,以便访问外部网站? 32 178、Swing组件JList的列表数据修改了,如何通知JList改变显示? 32 179、在Java applet中如何实现一个模式对话框? 33 180、在Java applet中如何显示另外一个HTML页面? 33 181、JDK实现的签名applet,可否在Netscape或IE中运行? 33 182、用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库? 33 183、在Java语言中,如何列出PC机文件系统中的所有驱动器名? 33 184、为什么Runtime.exec("ls")没有任何输出? 33 185、如何产生签名applet,以使applet能够访问本地资源? 33 186、若通过ObjectOutputStream向一个文件中多次以追加方式写入Object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException? 34 187、对象的序列化(Serialization)类是面向流的,应如何将对象写入到随机存取文件中? 34 188、运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之? 34 189、使用类printJob进行打印操作时,应如何设置打印机名等打印属性? 34 190、JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法替代之? 34 191、使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行或最后一行? 34 192、哪几种Web Server支持Servlet?如何使HS支持Servlet? 35 193、如何在java应用中将图像到图像文件中? 35 194、问如何用Java语言向串口读写数据? 35 195、作用域public,private,protected,以及不写时的区别 35 196、ArrayList和Vector的区别,HashMap和Hashtable的区别 35 197、继承时候类的执行顺序问题,一般都是选择题,问将会打印出什么? 35 198、float型float f = 3.4是否正确? 36 199、介绍JAVA中的Cllention FrameWork(包括如何写自己的数据结构)? 36 200、Java的通讯编程,编程题(或回答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示? 36 201、用JAVA实现一种排序,JAVA类实现序列化的方法(二种)?如在COLLECTION框架中,实现比较要实现什么样的接口? 37 202、编写一个截取字符串的函数,输入为一个字符串和字节数,输入为按字节截取的字符串。但是要保证汉字不能被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC+汉的半个”。 38 203、jsp有哪些动作?作用分别是什么? 38 204、JSP中动态INCLUDE与静态INCLUDE的区别? 38 205、两种跳转方式分别是什么?有什么区别? 38 206、说一说Servlet的生命周期? 38 第 页 共 52 页 207、JAVA SERVLET API 中forward()与redirect()的区别? 38 208、Servlet的基本构架 39 209、写Jdbc连Oracle的程序,并实现数据查询。 39 210、Class.formName的作用?为什么? 39 211、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 39 212、你在项目中用到了XML技术的哪些方面?如何实现的? 40 213、用JDOM解析XML文件时如何解决中文问题?如何解析? 40 214、编程用JAVA解析XML的方式 40 215、EJB2.0有哪些内容?分别在什么场合?EJB2.0和EJB1.1的区别? 41 216、EJB的基本架构 41 217、如何校验数字型 42 第 页 共 52 页 1、Struts 框架的组件结构 作为一个MVC的框架,Struts对Model,View,和Controller都提供了对应的实现组件。 Controller:控制器的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。在Struts中Controller功能由ActionServlet 和ActionMapping对象构成(web.xml)。 Model: Struts 为Model部分提供了Action和ActionForm对象。Action访问ActionForm中的数据,处理和响应客户请求,它还调用后台的Bean组件,这些组件封装了具体的业务逻辑。ActionForm组件对象,来保存请求的参数,这些Bean的属性名称与Http请求参数的名称相对应,控制器将请求参数传递到ActionForm bean的实例,然后将这个实例传送到Action类。Action处理器对象可以直接对它进行读写,而不再需要和request,response对象进行交互。典型的ActionForm只有属性的设置与读写方法(getXXX),而没有实现事务逻辑的方法。只有简单的输入检查逻辑,使用的目的是为了存储用户在相关表单中输入的最新数据,以便可以将同一网页进行再生,同时提供一组错误信息,这样就可以让用户修改不正确的输入数据。而真正对数据有效性进行检查的是Action类。 View:Struts应用中的View部分是通过JSP(包含:JSP代码、模板元素、指令元素、动作元素、脚本元素、声明、表达式、Scriptlets和JSP内建对象)技术实现的。其实我们还可以在加一层,就是DB处理的层,我们可以把一些DB 处理写成一个或几个类,把它的一些基本操作封装起来。 几个configure : 1.页面validator,这个可以在要实现这个功能需要在以下几个文件中进行配置:struts-configue.xml, validator.xml, validator-rules.xml。当然如果你想自己定义自己的验证规则那么你就必须自己写验证类了。这些东西可以取参照struts中的写法。 2.数据库的配置:在Struts中可以在Struts中添加属性来实现数据库的配置,然后在Action中调用相关的方法可以得到DataSource。再由DataSource可以得到Connection,而且通过配置实现连接池的功能。 3.日志的管理:在Struts中可以使用common-logging,或者使用log4j。这些的使用其实都可以从Struts的一些工程中学到。 下图为Struts的工作原理: JSP JSP ActionServlet ActionForm Action 初始页 (JSP/HTML) struts-config.xml 提交 响应 Struts的工作流程: Tomcat启动时:首先寻找项目下面的web.xml文件,读取web.xml文件并加载到内存,然后加载并实例化ActionServlet(控制器),ActionServlet读取struts-config.xml文件的配置信息,为每一个Action映射定义信息,实例化一个ActionMapping对象,为每一个Form-bean影射定义信息,实例化一个ActionForm对象。 向客户端发送一个请求:当用户发送一个请求时,经过web服务器,web服务器交给ActionServlet处理,ActionServlet接受该请求,检索有没有与用户请求匹配的ActionMapping实例,如果不存在,则返回错误信息,如果检索存在,ActionServlet一方面把请求数据传递给FormBean实例化一个FormBean对象,并根据配置信息决定是否要进行表单验证,如果需要就调用ActionForm的vaildate()方法执行;另一方面ActionServlet根据ActionMapping实例包含的影射信息决定将请求转给哪个Action,如果相应的Action实例不存在就先创建这个实例,然后调用Action的execute()方法执行,Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件,ActionForward对象指向的JSP组件生成动态网页返回给客户。 2、我相信Spring是独特的,因为若干个原因 1.它定位的领域是许多其他流行的Framework没有的。Spring关注提供一种方法管理你的业务对象。2.Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部它的架构仍然是内在稳定的。3.它的设计底部帮你编写易于测试的代码。Spring是用于测试驱动工和理想的Framework。Spring对工程来说,它不需要一个以上的framework,Spring是潜在地上站式解决方案,定位于典型应用相关的大部分基础结构。它也涉及到其他 framework没有考虑到的内容。 3、Spring的架构性的好处 1.Spring能有效地组织你的中间层对象,无论你是否使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIS的framework,你会发现Spring管住了遗留下的问题。2.Spring能消除在许多工程上对Singleton的过多使用。这是一个主要的问题,它减少了系统的可测试性和面向对象特征。3.Spring能消除使用各种各样的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。4.Spring能通过接口而不是类,促进良好的编程习惯,减少编程代码到几乎为零。5.Spring被设计为只让使用它创建的应用,尽可能减少依赖于它的APIS。在Spring应用中的大多数业务对象没有依赖于Spring。6.使用Spring构件的应用程序易于单元测试。7.Spring能使EJB的使用成为一个实现选择而不是应用构架的必然选择。能选择用POJOs或locals EJBs来实现业务接口,却不会影响调用代码。8.Spring帮助你能解决许多问题,而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例:Spring能使用AOP提供声明性事务而不是用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。9.Spring为数据存取提供了一致的框架,无论是使用JDBC或O/R mapping产品(如Hibernate)。Spring确实是你能通过最简单的可行的解决方法解决你的问题。 4、Spring覆盖了许多方面,我们已经清楚它的概念,那它应该涉及什么和不应该涉及什么 第 页 共 52 页 Spring的主要目的是使用J2EE易于和促进良好编程习惯。Spring不重新开发已有的东西。因此,在Spring中,你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如:Commons Logging用来做所有的日志输出,或Commons DBCP用来作数据连接池),或由你的应用程序服务器提供。因为同样的原因,我们没有提供O/R mapping层,对此已有很好的解决方法,如Hibernate和JDO。Spring的目标是使已存在的技术更加易用。例如,尽管我们没有体层事务协调处理,但我们提供了一个抽象层覆盖了JTA或任何气体的食物策略。Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。 5、Spring的设计核心是org.springframework.beans包,是怎样与javabeans一起工作的 这个包一般不直接被用户使用,但作为基础为更多的其他功能服务,下一个较高层面的抽象是bean Factory。Spring Bean Factory 是一个普通的factory,他使对象能按名称获取,并且能管理对象间的关系。 Bean factories支持两种对象模式:Singleton: 在此模式中,有一个具有特定名称的共享对象实例,在查找时被获取。这是默认的,而且是最为经常使用的。它对于无状态对象是一种理想的模式。Prototype: 在此模式中,每次获取将创建一个独立的对象。例如,这可以被用于允许用户拥有他们自己的对象。 6、org.springframwork.benas.factory.BeanFactory是一个简单的接口,为什么说是为了底层存储方法而实现的 能够方便地实现自己的BeanFactory,尽管很少用户需要。最为常用的定义是:XmlBeanFactory: 可解析简单直观的定义类和命名对象属性的xml结构。我们提供了一个DTOD来使编写更容易。ListableBeanFactoryImpl:可提供解析存放在属性文件中的bean定义,和可通过编程创建bean factories。每个bean定义可能是一个POJO(通过类名和javabean初始属性定义),或是一个Factorybean。Factorybean接口添加了一个间接层。通常,使用AOP或其他方法来创建代理对象。例:添加了声明性事务管理的代理(在这个概念上和EJB侦听相似,但在实践中实现更为简单)。Bean Factories能在一个层次接构中可选择性的参与,根据来自祖先的继承定义。这使在整个应用中公共配置的共享成为可能。虽然个别资源,如controller servlets,也拥有他们自己的独立的对象集合。 7、通过Bean Factory概念,Spring成为一个倒置控制容器 倒置控制容器的概念在Hollywood原则中经常表述Don’t call me,I’ll can you. Ioc将控制职责搬进了框架中,并脱离应用代码,映射到配置的地方。意思是说在传统的容器体系接口中,如:EJB,一个组件可以调用容器并问,我需要他给我做工作的对象x在哪里?使用Ioc容器则只须指出组件需要x对象,在运行时容器会提供给他。容器基于方法名做出这种说明,或可根据配置数据,如:XML。 倒置控制的几个重要好处:如:因组件不需要在运行时间寻找合作者,所以代码可更简单的编写和维护。在Spring的Ioc版本里,组件通过暴露javabean的setter方法表达他们依赖的其他组件。相当于EJB通过JNDI来查找,EJB查找需要开发人员编写代码,同理,应用代码更容易测试。Javabean属性是简单的,java核心的,并容易测试:仅编写一个包含自身的junit测试方法用来创建对象设置相关属性即可。一个好的IOC实现隐藏了强类型,如使用一个普通的factory来寻找合作者,必须通过类型转换将返回结果转变为想要的类型。这不是一个主要问题,但是不雅观。使用IOC,在代码中表达强类型依赖,框架将负责类型转换。这意味着在框架配置应用时,类型不匹配将导致错误;在你的代码中,你无需担心类转换异常。大部分业务对象不依赖于IOC容器的APIs。这使得很容易使用遗留下来的代码,且很容易的使用对象,无论在容器内或不再容器内。如,Spring用户经常配置jakarta Commons DBCP数据源为一个Spring bean,不需要任何定制代码去做这些,我们这不是侵入性的。使得它并不会使代码依赖于它的APIs,任何javabean在SpringFactory中都是一个组件。最后应该强调的是,IOC不同于传统的容器的体系结构,应用代码最小程度的依靠于容器。这意味着业务对象可以潜在的被运行在不同的IOC框架上或在任何框架之外不需要任何代码。 8、为什么说Spring BeanFactories是非常轻量级的 用户已成功的将他们应用在Applets中和单独的Swing应用(也很好的工作在EJB容器中)。没有特殊的部署步骤和可察觉的启动时间。这个能力表明在应用的任何层面差不多立即可发挥非常大的价值。Spring BeanFactory概念应用贯穿于Spring整体,而且是Spring如此内在一致的关键原因。在IOC容器中,Spring也是唯一的,它使用IOC作为基础概念贯穿于整个框架。对应用开发人员,最重要的是,一个或多个BeanFactory 提供一个定义明确的业务对象层。这是类似的,但比local session bean 层更简单。与EJB不同,在这个层中的对象可能是相关的,且它们的关系被自己的factory管理。有一个定义明确的业务对象层对于一个成功的体系结构是非常重要的。 9、Spring ApplicationContext是什么 Spring ApplicationContext是BeanFactory的子接口,为下列提供支持:消息寻找,国际化支持,事件机构,允许应用对象发布和随意的注册为时间监听,使文件和资源访问XmlBeanFactory。例:Spring 用户在XML bean定义文件中配置他们的应用。Spring的XML bean 定义文档的根是一个元素。该元素包含一个或多个定义,一般指定一个bean定义的类和属性。我们也必须制定ID作为标识,我们将在代码中使用该标志。 10、在J2EE应用中常看到什么用来配置三个应用对象 J2EE DataSource。使用DataSource的dao,在处理过程中使用dao的业务对象。 11、Hibernate是什么 Hibernate是采用ORM映射机制的持久层开发工具,是java应用和关系数据库之间的桥梁,负责java对象和关系数据库之间的映射。内部封装了jdbc访问数据库的操作。向上层应用提供了面向对象的数据库访问API。在java应用中使用到Hibernate的步骤:(1)创建Hinernate配置文件;(2)创建持久类;(3)创建对象—关系—映射文件;(4)通过HibernateAPI编写访问数据库的代码。 12、两个比较重要的概念 POJO:在Hibernate中理解为数据库表所对应的Domain Object,如果从子面上理解就是无格式普通java对象,简单的理解就是一个不包含逻辑代码的值对象。从数据层上看,pojo作为数据实体的对象化表现形式,也成为实体。 ORM:ORM可以理解成为一种机制也可以理解成为一种模式,对象-关系-映射,我个人觉得如果想理解它可以和MVC比较,模型-视图-控制。ORM是把对象和关系数据库映射到一起。而MVC是把视图和模型控制在一起。 第 页 共 52 页 13、Hibernate核心接口的层次架构关系 Business Layer: UserType Interceptor Persitent Classes Lifecyele Validatable Persisence Layer SessionFactory Query Transation Session Configuration JTA JDBC JNDI Hibernate的核心接口有五个:Session、SessionFactory、Transation、Query、Configuration。核心接口在任何中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事物控制。 Session接口:Session接口负责执行持久化对象CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常用的SQL语句)。但要注意的是Session对象是非线程安全的。同时Hibernate的 Session不同于 JSP 应用中的HttpSession,这里当使用Session这个术语时,其实指的是Hibernate的 Session,而以后会将HttpSession对象称为用户Session。 SessionFactory接口:SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象,这里用到工厂模式。要注意的是SessionFactory并不是轻量级的。一般情况下,一个项目通常只需要一个SessionFactory就够了,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。 Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置读取配置,然后创建SessionFactory对象。 Transaction接口:Transaction接口负责事物相关的操作。它是可选的,开发人员也可以设计编写自己的底层事物处理代码。 Query 和Criteria接口:Query 和Criteria接口负责执行各种数据库查询。可以使用HQL 语言或SQL语言两钟表达方式。 14、Hibernate的工作方式 Hibernate不会对你造成防碍,也不会强迫你修改对象的行为方式,不需要实现任何不可思议的接口以便能够持续的存在。唯一需要做的就是创建一份XML“映射文档”,告诉Hibernate希望能够保存在数据库中的类,以及他们如何关联到该数据库的列和表,然后就可以要求他以对象的形式获取数据,或者把对象保存为数据。与其他解决方案相比,他几乎已经很完美了。 运行时,Hibernate读取映射文档,然后动态构建java类,以便管理数据库与java之间的转换。在Hibernate中有一个简单而直观的API,用于对数据库所表示的对象执行查询。要修改这些对象,(一般情况下)只要在程序中与他们进行交互,然后告诉Hibernate保存修改即可。类似的创建新对象也很简单,只需要以常规方式创建他们,然后告诉Hibernate有关他们的信息,这样就能在数据库中保存他们。Hibernate API学习起来很简单,而且与程序流的交互很自然。再适当的位置调用,就可以达到目地。带来很多自动化和代码节省方面的好处,所以花一点时间学习是很值得的。而且还可以获得另一个好处,即代码不用关心要使用的数据库的类型,只需要简单的修改Hibernate配置文件即可。 这里讨论假定已经通过创建Hibernate映射文档,建立一个关系数据库,并且拥有映射的java类有一个Hibernate“工具集”可在编译时使用,以支持不同的工作流。 15、使用Hibernate的场合   对于熟悉使用关系数据库和了解如何执行完美的SQL查询与企业数据库交互得人来说,Hibernate似乎有些碍手碍脚,这就象带有动力和自动排挡的快艇车会使注重性能的赛车驾驶员不耐烦一样。如果你属于这种人,如果你所在的项目团对拥有一个强大的DBA,或者有一些存储过程要处理,你可能想研究一下iBATIS.Hibernatede的创建者本身就把iBATIS当作是另一种有趣的选择.我对他很有兴趣,因为我曾为一个电子商务站点开发了一个类似的系统(其功能更为强大),而且从那时到现在,我对他们已经在其他环境中使用过他,尽管在发现Hibernate之后,再新项目中我们通常更喜欢Hibernate。你可以认为,以SQL为中心的解决方案(比如iBATIS)是“反向的”对象/关系映射工具,而Hibernate是更为传统的ORM。当然,还有其他的外部原因会导致采用另外的方法。 16、再使用Hibernate进行查询 的时候大家都会用到Hibernate缓存,其中Session缓存即一快内存空间,存放了相互关联的java对象,这些位于Session缓存,其中的对象就是持久化对象,Session根据持久化对象的状态变化来同步更新数据库。这个Session缓存是Hibernate的一级缓存。此外,SessionFactory有一个内置缓存和外置缓存即Hibernate的第二级缓存。而Hibernate正是由于这些缓存的存在,才使其数据库操作效率提高。就是说,再提供了方便易操作的操作数据库数据的方式的同时保证了工作效率,但是不能因此而免去后顾只忧,需要在设计业务逻辑层的时候考虑使用最优的架构节省有效的系统资源。再查询方面,Hibernate主要从以下几个方面来优化查询性能:1)降低访问数据库的频率,减少select得数目。实现手段包括:使用迫切左连接或迫切右连接的检索策咯。2)避免多余加载程序不需要访问数据。实现手段包括:使用延长检索策咯,使用集合过滤。 17、传统上,Hibernate的配置依赖与外部XML文件 第 页 共 52 页 数据库映射文件被定义为一组XML映射文件,并且在启动时进行加载。创建这些映射有很多方法,可以从已有数据库模式或java类模式中自动创建,也可以手工创建。无论如何,最终将获得大量的Hibernate映射文件。此外,还可以使用工具,通过javadao样式的注释生成映射文件,尽管这样会给你的构件过程增加一个步骤。再最近发布的几个Hibernate版本中,出现了一种基于java5注释的更为巧妙的新方法。借助新的Hibernate Annotaion库,即可一次性的分配所有旧映射文件,一切都会按照你的想法来定义,注释直接潜入到你的java类中,并提供一种强大及灵活的方法来声明持久性的映射。届由自动代码完成和语法突出显示功能,最近发布的javaIDE也为其提供了有力的支持。 Hibernate Annotaion还支持新的Ejb3.0持久性规范这些规范旨在提供一种标准化的java持久性机制。由于Hibernate3还提供了一些扩展,因此你可十分轻松的遵循这些标准,并使用Ejb3.0编程模型来对Hibernate持久层进行编程。 要使用Hibernate Annotaion,至少需要具备Hibernate3.2和java5。可以从Hibernate站点下载Hibernate3.2和 Hibernate Annotaion库。除了标准的HibernateJAR和依赖项之外,你还需要Hibernate Annotaion.jar文件(Hibernate Annotaion.jar)'java持久性API(lib/ejb3-persistence.jar)。 18、为什么要使用Hibernate?使用Hibernate的好处 或问成:为什么要用持久层?使用持久层的好处? 根据分层体系结构,应用程序可以分为表述层(提供与用户交互的界面),业务逻辑层(实现各种业务逻辑),数据库层(负责存放和管理应用的持久性业务数据)。 在软件开发的不同阶段,需要为目标系统创建不同类型的模型。在分析阶段,需要创建概念模型。在设计阶段,需要创建域模型和数据模型。 概念模型描述了每个实体的概念和属性,以及实体之间的关系。在这个阶段,并不描述实体的行为。这些实体在设计阶段很有可能变为类。显然此模型是面向对象的。 数据模型是在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。SQL语句是面向关系的,依赖于数据模型。这给应用程序带来以下缺点:1)实现业务逻辑的代码和数据库访问代码参杂在一起,使程序结构不清晰,可读性差;2)在程序代码中嵌入面向关系的SQL语句,使得开发人员不能完全运用面向对象的思想来编写程序;3)业务逻辑和关系数据模型绑定,如果关系数据模型发生变化,那么必须手工修改程序代码中所有相关的SQL语句,这增加了维护软件的难度;4)如果程序代码中的SQL语句包含语法内容,在编译时不能检查这种错误,只有在运行时才能发现这种错误,这增加了调试程序的难度。 为了解决这些问题,我们引入了域模型。域模型也是在软件设计阶段根据概念模型建立起来的,域模型是面向对象的。在面向对象术语中,域模型也称为设计模型。 一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录。但是域模型与关系模型之间存在许多不匹配之处,例如用户类有两个地址类型的属性,用户类和地址类之间是聚合关系,而在数据库中有多种存储格式。此外,域模型中类之间的多对多关联关系和继承关系都不能直接在关系数据模型中找到对应的等价物。在关系数据模型中,表之间只存在外键参照关系,有点类似于域模型中多对一或一对一的单向关联关系。因此我们需要采用对象—关系映射模式(ORM)来建立两种模型之间的映射关系。 ORM提供了实现持久层的一种模式,它采用映射元数据来描述对象——关系映射的细节,使得ORM中间件能在任何一种Java应用的业务逻辑层和数据库层之间充当桥梁。 持久化层封装了数据访问细节,为业务逻辑层提供了面向对象的API。其好处有:1)代码可重用性高,能够完成所有的数据库访问操作;2)如果需要的话,能够支持多种数据库平台;3)具有相对独立性,当持久化层的实现发生变化,不会影响上层的实现;4)实现了实体域对象的持久化,使得它们可以在应用程序再次运行时被重新读入到内存,并重新构造出域对象。 19、javaServer Faces(JSF)是一种用与构建Web应用程序的新标准java框架 它提供了一种组件为中心,来开发javaWeb用户界面的方法从而简化了开发javaServer Faces还引起了广大java/web开发人员的兴趣。企业开发人员和web设计人员将发现JSF开发可以简单到只需将用户界面(UI)组件拖放到页面上,而系统开发人员将发现丰富而强健的JSF API为他们提供了无与伦比的功能和编程灵活性。JSF 还通过将良好构架的模型-视图-控制器(MVC)设计模式集成到他的体系结构,确保了应用程序具有更高的可维性。最后,由于JSF 是通过java Community Process(JCP)开发的一种java标准,因此开发工具供应商完全能够为javaServer Faces提供易于使用的、高效的可视化开发环境。 20、JSF体系结构 javaServer Faces 的MVC实现图: JSF的主要优势之一就是他既是javaWeb用户界面标准又是严格遵循模型-视图-控制器(MVC)设计模式的框架用户界面代码(视图)与应用程序数据和逻辑(模型)的清晰分离是JSF应用程序更易于管理。为了准备提供页面对应用程序数据访问的JSF上下文和防止对页面未授权或不正确的访问,所有与应用程序的用户交互均由一个前端“Faces”Servlet(控制器)来处理。 21、JSF的生命周期 Faces Controller Servlet充当用户和JSF应用程序之间的扭带。在明确限定的JSF生命周期(规定了用户请求之间的整个事件流)的范围内工作。例如,一收到访问JSF应用程序的初始Web请求,Faces Controller Servlet使通过首先准备JSF上下文(存放所有应用程序数据的一个java对象)来处理 第 页 共 52 页 ,然后控制器把用户指引到所请求的页面。该页面通常使用简单的表达式语句来处理来自JSF上下文应用程序数据,一旦收到后续请求,控制器就更新所有模型数据(假设输入了新的数据)JSF开发人员可以通过编程的方式在应用程序中运行期间随时访问整个JSF生命周期,从而随时对应用程序的行为进行高度控制。 22、javaServer Faces的用户界面组件 javaServer Faces的真正威力在于他的用户界面组建模型,再该模型中,应用程序完全用组件集合构件,这些组件可以针对多种客户端类型用不同的方式来进行显示。与其他转有技术(如ASP.Net)有点类似,JSF的UI组建模型技术使开发人员能够使用预先构件的用户界面(UI)组件来构建Web用户界面(而非完全从头构建用户界面),从而提供了前所未有的开发效率JSFUI 组件有多种形式,可以简单到只是显示文本outputLable,或者复杂到可以表示来自数据集合(如数据表)的表格化数据的dataTable。 javaServer Faces规范再其参考实施中提供了一组基本UI组件,这些组件本身是非常有用的。他们包括两个组件库,即“HTML”组件库-他大部分映射了标准的HTML输入元素:以及“核心”库-他辅助常见的应用程序开发任务(如,国际化和验证/转换输入数据)。除了提供一个基本UI组件库之外,JSF API还提供了括展和创建定制JSF UI组件的功能,从而在基本组件之上提供更多功能。 23、javaServer Faces是sun公司的一项技术,简称JSF 按sun公司的定义JSF是 javaWeb应用的用户界面框架,其设计目标是简化Web应用的开发和维护 JSF对 Web 应用开发的简化,可以概括为四个方面:第一,JSF提供了一组用户截面组件,这些组件是可重用的,程序员可以利用这些组件方便的构建 Web应用的用户界面;第二:利用JSF,再用户界面组件和业务逻辑之间传递数据将变的非常简单;第三:JSF可以维护用户组件的状态,并且可以将从一个请求传递到另一个请求;第四:JSF充许程序员非常容易的开发自定义的用户界面而组件,而且这些自定义用户界面组件同样可以重用。 JSF技术的另一个重要特征是,JSF是面向工具的。 JSF建立了开放的标准,工具厂商依据这个标准,可以为 Web应用开发过程中的各个角色,提供强大的工具支持。 24、具有代表性的JSF简化Web开发技术 站在技术的角度,JSF是相当复杂的一个框架。因此,JSF技术的完整介绍,是一项“大工程”,其内容包括:请求处理生命周期;用户界面组建模型;标准用户界面组建模型;统一的表达式语言;托管bean机制;请求的上下文状态信息;页面导航方法;呈现模式与 JSF的集成以及生命周期管理等等。 要说明一项技术的领先性,最好的办法莫过于与其竞争对手进行对比,在 java Web编程中, JSF的最大对手无疑是Jsp和 Structs。前者是初级程序员的不二选择,而后者是 java Web 事实上的框架标准。不可否认,Jsp底于 JSF。 在Web应用的架构中,显然WebServer 位于抽象级别的最底层,直接处理 Http请求和响应:Structs在WebServer Server之上,具有会话管理,生命周期管理,基本的错误处理等功能;在Server 之上的就是 Jsp了,得益于他的可扩展的模版机制,JSP的抽象层次上比SERVLET更上了一层楼;在往上,我们来到了STRUTS,作为一个框架标准,STRUTS提供了非常丰富的服务,例如类型转换,导航,表单处理以及布局管理等;STRUTS是MODEL2的,但同时也带着MODEL1的某些特征,而抽象层次更高的JSP,则完全是MODEL2的,与STRURS相比,JSF包含STRUTS等。因此,JSF是比STRUTS抽象度更高的技术。 25、SPRING的特点 1.SPRING不同于其他的FRAMEWORK,它提供的是一种管理你的业务对象的方法。 2.SPRING有分层的体系结构,意味着你能选择仅仅使用它的任何一个独立的部分,而其他的仍然使用你的相关实现。 3.它的设计从一开始就是要帮助你编写易于测试的代码,SPRING是使用测试驱动开发(TDD)的工程的理想框架。 4.SPRING不会给你的工程添加对其他的框架依赖;同时SPRING又可以称的上是一个揽子解决方案。提供了一个典型应用所需要的大部分基础框架。 SPRING的好处:1.SPRING能有效的组织你的中间层对象;2.SPRING能消除在许多工程中常见的对SINGLETON的过多使用;3.通过一种在不同应用程序和项目一致的方法来处理配置文件,消除各种自定义格式的属性文件的需要,仅仅需要看看类的JAVABEAN属性,INVERSION OF CONTROL的使用帮助完成了这种简化(使用的是TYPE2的IOC);4.很容易培养你面向接口而不是面向类的编程习惯;5.SPRING的设计会让使用她创建的应用尽可能少的依赖于它的APIS,在SPRING应用中的大多数业务对象没有依赖于SPRING;6.使用SPRING构建的应用程序易于单元测试;7.SPRING使EJB成为一个实现选择,而不是必需的选择。你可以用POJO或LOCAL EJB来实现业务接口,却不会影响到调用代码;8.SPRING提供一些WEB应用上的EJB的替代方案,比如用AOP提供声明性事务管理;9.SPRING为数据存取提供了一个一致的框架,不论是使用JDBC还是O/R MAPPING的产品(HIBNATE,JDO)。 SPRING的任务描述:SPRING的主要目的就是使J2EE易用和促进良好的编程习惯。SPRING不会重新发明技术,只是让已有的技术更加易用,比如它没有底层事务协调处理,但是提供了一个抽象层覆盖了JTA和任何其他的事务策略。SPRING并没有和其他的开源项目竞争,不过还是在一些领域有新的方案提供,比如它的WEB FRAMEWORK,轻量级的IOC容器和AOP框架。 INVERSION OF CONTROL容器,SPRING的设计核心是ORG.SPRING.FRAMEWORK.BEANS包,用来协调JAVABEAN的工作。这个包一般不会被用户直接使用,而是作为其他功能的基础服务。 下一个高一些的抽象概念是BEAN FACTORY,一个SPRING BEAN FACTORY 是一个可以通过名称来获取OBJECT的通用工厂,并且管理OBJECT之间的关系。 1)BEAN FACTORY支持的两种对象模式 SINGLETON:默认的,最常用的,对于无状态的对象是一种理想的模式。 PROTOTYPE:每次获取将创建一个独立的对象,可以让用户拥有他们自己的对象。 由于ORG.SPRING.FRAMEWORK.BEANS.FACTORY.BEANFACTORY是一个简单的接口,所以你能够方便的实现出你自己的BEANFACTORY,但是很少用户需要这样做。 第 页 共 52 页 2)常用的BEANFACTORY定义 XMLBEANFACTORY:解析简单直观的定义类和命名对象属性的XML结构; LISTABLEBEANFACTORYIMPL:提供了解析存放在属性文件中定义的能力; 通过BEANFACTORY的概念,SPRING成为了一个INVERSION OF CONTROL容器。IOC背后的概念就是所谓的HOLLYWOOD原则:Don’t call me, I’ll call you .Ioc将控制创建的职责从对象的代码中搬进了框架中,使用IOC容器只须指出组件需要X对象。在运行期容器会提供给他具体的对象,而容器就只是通过察看方法的参数(例如:JavaBean的属性),Spring ApplicationContcxt 是BeanFactory 的子接口,为下列东西提供支持:1)信息查找,支持国际化;2)事件机制,允许发布应用程序以及可选的注册以接受到事件;3)可移植的文件和访问资源。 3)JDBC抽象和数据访问异常层次 JDBC提供了不错的数据库抽象,但是也有痛苦的地方;需要大量的错误代码来确保ResultSet,Statement,Connetion在使用后关闭;没有异常的层次。使用来响应所有的错误,并不知道具体错在那里。 Spring 用两种方式解决这类问题 1)通过API把冗长易出错的异常处理代码从程序转移到框架中,框架处理所有异常,而程序代码集中精力进行SQL和处理结果上:为要处理SQLEXECPTION的程序代码提供有意义的异常层次。当Spring第一次从数据源取得一个连接时,它检查元素以确定数据库,随后它使用这些信息把SQLEXECPTION映射为自己的异常层次中响应的异常,使你可以和有意义的异常打交道。 2)SPRING 提供两层JDBC API 第一个在org.spirngframework.jdbc.core包中,使用回掉机制移动控制权从程序转移到了框架中,这是一种不同的IOC(简写)。在org.springframcwork.jdbc.object包中是对JDBC的更高层次的抽象。这是建立在核心的JDBC回调功能基础上的,但是提供了一个能够对RDBMS操作的API。在这个API中无论是查询,更新或是存储过程,都是用JAVA对象来建模,这组API受到了JDO查询API的影响,非常直接,而且有用。Spring 数据访问异常层次是基于unchecked exception 的,这样开发者可以自己决定是否来扑捉这些异常从而恢复。 Spring JDBC带来的好处 1)不必像JDBC那样写FINALLY;2)需要编写的代码变少了;3)不必钻研RDBMS文档去解决理解,一个因为错误的列名而返回怪异错误码;4)不管使用何种持久技术,都可方便的使用DAO模式,让业务代码不依赖任何特定的数据访问API。 4)O/R mapping 集成:Spring 提供了对Hibernate2.x和JDO的集成支持,尤其是对Hibernate的集成; 为了使用,而不是直接使用呢? 1.用Hibernate的代码通常要为效率和适当的事务处理而用相同的Session对象,Spring通过在代码层上使用显式的template包含类或使用声明式的,AOP的方法拦截 (interception) 方式两种方案。使得能够很容易透明创建和邦定sesion到当前的线程。 2.资源管理,Spring的应用程序context能够处理Hibernate SessionFactory的位置处理和配置,jdbc数据源和其他的相关资源,使得易于管理和改变。 3.集成的事务管理Spring让你能够的Hibernate代码包装起来,通过2中方式:在代码层上使用显示的template包装类,或者使用声明使得方法拦截(interceptor)。 4.Spring 能够包装Hibernate异常为私有的,checked异常转换为一套抽象的运行时异常:使得能够在任何需要的地方法捕捉这个异常。同是这个异常也会被转到相同的层次,意味着能在一致的编程模型中,对JDBC执行于相同的操作。 5.为了避免和厂商绑定Hiberante强大、灵活、免费,当时仍然使用私有的API;Spring对Hibernate的事务和异常的抽象,使你很容易将hibernate-specific代码隔离开你的应用程序部分,而不会影响Hibernatre的强大功能。 6.测试简单Spring的Ioc,很容易改变Hibernate Session Factories的位置。数据源,事务管理和影射对象执行,这使得很容易隔离和测试每一块持久化关系代码。 5)事务管理 JTA是一个直接用起来很笨重的API,许多J2EE开发者都感到EJB CMT使得对于事务管理的唯一合理的选择。Spring提供了它对事务管理的抽象,提供了通过类似于JdbcTemptate的回顾模版编成管理事务,比起之后直接用JTA容易多。类似于EJB CMT的声明式事务管理,但不需要EJB容器。 6)AOP Spring的AOP支持的首要目标是要给POJOs提供J2EE服务,而且它有能够在应用服务器之间移植的优势,Spring AOP支持method interception ,关键概念包括: Interception:自定义行为能够在对接口和类的调用之前之后插入;指定advice会导致对象实现额外的接口,混乱了继承。 Spring 使用动态代理实现AOP或在运行时用CGLIB生成字节码(这是能够代理的类),两种方法都能够在任何服务中使用。 Spring实现了AOP Aliance接口的AOP框架。 Spring AOP最常用的应用是声明式事务管理,这是基于前面描述的 TransactionTemplate抽象上的,并且可以为任何POJO 提供声明是事务管理。 Spring的声明式事务管理类似于EJB CMT,但在以下方面不同: 1.事务管理能够应用于任何POJO;2.通过使用Spring的事务API能够在事务性POJO中实现编程回调,为此我们提供静态的方法,使用ThreadLocal变量,因此不需要传递EJBContext这样的对象确保回滚;3.可以声明式的定义“回滚规则”;4.事务管理部 第 页 共 52 页 绑定于JTA;5.还可使用Spring AOP实现程序特有的aspects。 7)MVC web框架 Spring的mvc model类似于Struts,在多线程服务对象这点上,Spring的Controller类似于Struts Action,只有一个实例处理所有的客户请求。 Spring MVC比起Struts的优点: 1.Spring 在Controller,Javabean ,model和views提供了一个非常清晰的划分; 2.Spring 的mvc是非常灵活的。不象Struts强制继续Action和Form对象,Spring mvc完全是基于接口的; 3.Spring mvc是真正与view无关的,不会被强制使用jsp; 4.和其他对象一样,Spring的Controller是通过Ioc配置的,易于测试; 5.web层变成了业务对象层上的薄薄一层。 8)EJB相关 实现EJB,如果选择使用EJB,Spring能在EJB实现客户端访问。EJB两方面都提供很大的好处。 Spring为session bean 和message drive bean 提供了方便的超类,通过自动载入基于包含在EJB jar文件中的XML文档,BeanFactory让这变得很容易,感觉不是很有用的样子。 使用EJB 使用EJB程序,使用Service Locator和Business Delegate模式,这些比在客户代码中使用JNDI查找强多了,但是还是有显著的缺点。 1.使用EJB的典型代码依赖于Service Locator或者Business Delegatons,难于测试;2)在Service Locator模式没有使用Business()下,程序代码还要在EJB home重点用create方法,并且可能导致异常,代码依然绑定在EJB API上;3)实现Business Delegate模式通常导致显著的代码重复。 我们只需要给EJB的Bean定义一个组件,在XML中指定它的jndi name,interface,spring AOP框架会为EJB创建一个代理,实现了业务方法的接口,缓存EJB Home,代理JNDI查找,调用响应的业务方法。从而使你的web层代码不依赖于EJB的使用,如果你要使用POJO或其他OBJECT代替EJB引用,只需要改变组件定义XML,而不影响代码。 26、组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下 核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式将应用程序的配置和和依赖性规范与实际的应用程序代码分开。 Spring上下文:它是一个配置文件向Spring框架提供上下文信息。Spring上下文包括企业服务、例如JNDI、EJB、电子邮件、国际化、校验和调度功能。 Spring AOP:通过配置管理特性,Spring AOP直接把面向切面的编程功能集成到了Spring框架中。所以,可很容易的使Spring框架管理任何对象支持AOP。Spring AOP模块为基于Spring的应用程序中的对象提供实务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。 Spring DAO:JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和各数据库供应商抛出的错误消息。异常层次结构简化了错误处理。并且极大的降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。 Spring ORM:Spring框架插入了若干个ORM框架,从而提供了ORM对象关系工具。其中包括JDO、Hibernate和iBatis SQL MAP。所有这些都遵从Spring通用事务和DAO异常层次结构。 Spring WEB模块:Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以Spring框架支持与Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。 Spring MVC框架:MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成高度可配置的,MVC容纳了大量的试图技术,其中包括JSP、Velocity、iText和POI。 Spring框架的功能可用到任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同的J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。 27、IOC和AOP 控制反转模式(依赖注入)的基本概念是:不创建对象,但是描述创建他的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(Spring框架中是IOC容器)负责将这些联系在一起。 在典型的IOC场景中,容器创建了所有对象,并设置必要的属性将他们联系在一起,决定什么时间调用方法。下表列出了IOC的一个实现模式。 类型1:服务需要实现专门的接口,通过接口,由对象提供这些服务,可以从对象查询依赖性(例如:需要的附加服务)。 类型2:通过javaBean的属性(例如setter方法)分配依赖性。 类型3:Spring 框架的IOC容器里面向方面的编程。 面向方面的编程,即AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP的核心是面向切面,它将那些影响多个类的行为封装到可重用的模块中。 AOP和IOC是补充性技术,可解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和java类中才能实现日志功能。在AOP方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是java类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用Spring AOP编写应用程序代码是松散耦合的。 第 页 共 52 页 AOP的功能完全集成到了Spring事务管理、日志和其他各种特性的上下文中。 IOC容器 Spring设计的核心是org.springframework.beans包,它的设计目标是与javaBean组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作多数功能的底层中介。下一个最高级抽象是BeanFactory接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory也可以管理对象之间的关系。 BeanFactory支持两个对象模型:1)单态:模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。SingleTon是默认的也是最常用的对象模型。对于无状态服务对象很理想。2)原型:模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模式最适合。 Bean工厂的概念是Spring作为IOC容器的基础。IOC将处理事情的责任从应用程序代码转移到框架。正如我将在下一示例演示的那样,Spring框架使用javaBean属性和配置数据来指出必须设置的依赖关系。 28、MVC有以下优点 可靠性:表示层和业务层的分离允许你更改表示层代码而不必重新编译模型和控制器代码。 高重用性和可适应性:MVC模式允许你使用各种不同样式的浏览器来访问同一个服务器端的代码。 较低的开发成本:MVC使降低开发和维护用户接口的技术含量成为可能。 快速的部署:开发时间得到相当大的缩减,它使业务程序员(java程序员)集中精力于业务逻辑,界面程序员(HTML和JSP)集中精力于表现上。 可维护性:表示层和业务逻辑层的分离也使得基于Struts的Web应用程序更易于维护和修改。 29、WebWork WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。WebWork目前最新版本是2.1,现在的WebWork2.x的前身是Richard Oberg开发的WebWork,但现在的WebWork已经被拆分了Xwork1和WebWork2两个项目。Xwork简捷、灵活功能强大。它是一个标准的Commond模式实现,并且完全从web层中脱离出来。Xwork提供很多核心功能:前端拦截器(intercepter),运行时表单属性验证,类型转化、强大的表达式语言,IOC容器等。WebWork建立在Xwork之上,处理Http响应和请求。WebWork2使用servletDispatcher将Http请求变成Action(业务层Action类),session(会话),applacation(应用程序)范围的映射,request请求参数映射。WebWork2支持多视图表示,视图部分可以使用JSP、Velecity、FrecMarker、JasperReports,XML等。在WebWork2.2添加了对AJAX的支持,这支持是构建在DWR与Dojo这两个框架基础上的。 WebWork最大的优点:简单性和灵活性。WebWork有一个很小的API,它使开发者可以迅速进行开发工作。 WebWork是许多特性和实用性的组合,包括使用variour view技术,例如JSP、Velecity、XSLT和JasperReporters。 30、WebWork2的特性 灵活的valadation框架:允许你在XML文件中定义验证内容,在运行时通过Intercepter自动应用,因此完全脱离Action类。新版支持客户端验证。 Type convertion:允许你在类之间很容易的转换对象。 表达式语言:允许动态对象图表遍历和方法执行,使用ValueStack透明访问多Bean的属性。WW2也具有使用JSTL的能力。 IOC容器:管理组件的生命周期,使客户获得组件实例不需要创建注册类(于容器环境无关)。 Velocity Templates:使UI组件可重用,从而允许开发者快速开发Web页面的信息。 Intercepters:在Actions处理的前后动态拦截,以简单化Action代码,增加减少代码的机会。 支持118N:容易和第三方软件集成,包括Hibernate、Spring、Pico、Sitemcsh等 支持Packages和NameSpaces,来管理Actions。 31、作为J2EE开发人员,我们似乎经常关注“后端机制” 我们通常会忘记,J2EE的主要成功之处在Web应用程序方面:许多原因使得人们喜欢利用Web开发应用程序,但主要还是应为其易于部署的特性允许站点以尽可能低的成本拥有上百万用户。遗憾的是,在过去几年中,我们在后端投入了太多的时间,而在使我们的Web用户界面对用户自然和响应灵敏方面投入不足。这里介绍一种方法,AJAX,使用它可以构建更为动态和响应更灵敏的Web应用程序。该方法的关键在于对浏览器端的JavaScript、DHTML和与服务器异步通信的组合。 32、术语Ajax用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验。 在Ajax之前,Web站点强制用户进入提交/等待/重新显示页面,用户的动作总是与服务器的“思考时间”同步,Ajax提供与服务器异步通信的能力,从而使用户从请求/响应得循环中解脱出来。借助于Ajax,可以在用户单击按钮时,使用JavaScript和Dhtml立即更新UI,并向服务器发出异步请求。以执行更新和查询数据库。当请求返回时,就可以用JavaScript和css来响应的更新UI,而不是刷新页面。最重要的是,用户甚至不知道浏览器和服务器正在通信:Web站点看起来是即时响应的。 虽然Ajax所需的基础架构已经出现了一段时间,但直到最近异步请求的真正威力才得到利用。能够拥有一个响应及其灵敏的Web站点是激动人心的。因它最终允许开发人员和设计人员使用标准的HTML/CSS/JavaScript堆栈创建“桌面风格的(desktop-like)”可用性。 通常,在J2EE中,开发人员过于关注服务器和持久层的开发,以至于用户界面的可用性已经落后。在一个典型的J2EE开发周期中,常常会听到这样的话, 第 页 共 52 页 “我们没有可投入UI的时间或不能用HTML实现”。但是以下Web站点证明,这些理由再也站不住脚:BackPack、Google Suggest、Google Maps、PalmSphere,所有这些Web站点都告诉我们,Web应用程序不必完全依赖于从服务器重新载入页面来向用户呈现更改。一切似乎都在瞬间发生。简而言之,在涉及到用户界面的相应灵敏度时,基准设得更高。 33、Adaptive Path公司的Jesse James Garrentt 这样定义Ajax Ajax不是一种技术。实际上,他有几种蓬勃发展的技术以新的强大方式组合而成。Ajax包含:1)基于XHTML和css标准表示;2)使用Document Object Model进行动态显示和交互;3)使用XMLHttpRequest与服务器进行异步通信;4)使用JavaScript绑定一切。 这样非常好,但为什么要以Ajax命名呢?其实术语Ajax是由Jesse James Garrett创造的,他说它是“Asynchronous JavaScript+XML的简写”。 34、Ajax工作原理 Ajax的核心是JavaScript对象XmlHttpRequest。该对象在intercept Explorer中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用javaScript向服务器提出请求并响应,而不阻塞用户。 35、AJAX能够使用户体验更加愉快,可以提供更加灵活的UI,并消除页面刷新所带来的闪烁。 目前,由于要刷新整个页面,要传递大量数据,因必须重新发送整个页面。如使用AJAX,服务器可返回一个包含感谢信息的500字节的消息,而不是发送26813字节的消息来刷新整个页面,即使使用的是高速的INTERNET,传送26K和1/2K的差别也是很大的,只要刷新一小节,而不是整个屏幕。 36、AJAX是什么 1)用Javascript向服务器发出的一条请求或是数据,这里是HTTP。2)服务器返回数据,这里是XML格式。3)数据在Javascript里面解析。4)把解析完的数据写到当前网页上。5)于是就有了无刷新技术这貌似强大的功能。 这样用户和服务器之间只要传递变化的那部分就OK了,没什么新意。AJAX主要是把B/S弄的象C/S,把浏览器发展成客户端。 37、AJAX适用场景 1)表单驱动交互 传统的表单提交,在文本框输入内容后,电击按钮,后台处理完毕后,页面刷新,在回头检查是否刷新结果正确,而AJAX在电击提交后,立即进行异步处理,并在页面显示更新后的结果。 2)深层次的树导航 深层次的级联菜单的操作引起的重载页面,不采用每次调用后台的方式,而是一次性将级联菜单的所有数据全部读取出来并写如数组,然后用户的操作Javascript来控制他的子集项的呈现,这样虽然解决了操作响应速度、不重载页面以及对服务器频繁发送请求的问题,但是如果用户不对菜单进行操作或只对菜单中的一部分进行操作的话,那么这部分就会成为冗余数据而浪费用户的资源,特别是在菜单结构复杂、数据量大的情况下,这种弊端就更为突出。 如果在此案中应用Ajax后,结果就会有所改观。在初始化页面时我们只读出它的第一级的所越偶数据并显示,在用户操作一级菜单其中一项时,会通过Ajax向后台请求当前一级项目所属的子菜单的所有数据,如果再继续请求已经呈现的二级菜单中的一项时,再向后面请求所有二级菜单对应的所有三级菜单的所有数据,以次类推……这样,用什么就取什么、用多少就取多少,就不会有数据的冗余和浪费,减少了数据下载总量,而更新页面时不用重载全部内容,而更新需要更新的那部分就即可,相对于后台处理并重载的方式缩短了用户等待时间,也把对资源的浪费降到最低。 3)快速的用户与用户的交流相应 在众多人参与的交流讨论的场景下,最不爽的事情就是让用户一遍又一遍刷新页面以便知道是否有新的讨论出现。新的回复应该以最快的速度显示出来,而把用户从分神的刷新中解脱出来,Ajax是最好的选择。 4)类似投票,Yes/no等无关痛痒的场景。 对于类似这样的的场景中,如果提交过程需要达到40秒,很多用户就会直接忽略过去而不直接参与,但是Ajax可以把时间控制在1秒内,从而更多的用户会加入进来。 5)对数据进行过滤和操作数据的场景 对数据使用过滤,按照时间排序,或者按照时间和名称排序,开关过滤器等等。任何要求具备很高的交互性数据操纵的场合都应该用JavaScript,而不是用一系列的服务器请求来完成。在每次数据更新后,再对其进行查找和处理需要消耗的较多的时间,而Ajax可以加速这个过程。 6)普通的文本输入提示和自动完成的场景。 在文本框等输入表单中给予提示,或者自动完成,可以有效的改善用户体验,尤其是那些自动完成的数据可能来自于服务器的场合,Ajax是很好的选择。 38、AJAX不适用的场景 1)部分简单的表单 虽然表单可以从Ajax获取最大的益处,但是一个简单的评论表单极少能从Ajax得到什么明显的改善。而一些较少用到表单提交,Ajax则帮不上什么忙。 2)搜索 有些使用了Ajax的搜索引擎如Start.com和Live.com不允许使用浏览器的后退按钮来查看前一次搜索的结果,这对已经养成搜索习惯的用户来说是不可原谅的。现在Dojo通过iframe来解决这个问题。 第 页 共 52 页 3)基本的导航 使用Ajax来做站点内的导航是一个坏主意马为什么不把时间放在让系统程序作的更好呢? 4)替换大量的文本 使用AJAX可以对实现页面的局部刷新,但是如果页面的整个都刷新的话为什么不重新连接一次服务器呢? 5)对呈现的操作 AJAX看起来像一个纯粹的UI,但实事上它不是。实际是一个数据同步、操纵和传输的技术。对可维护的干净的web应用,不使用AJAX来控制页面呈现是个不错的主意。JavaScript可以很简单的处理XHTML/HTML/DOM,使用CSS规则就可以很好的表达数据显示。 存在的问题:1)用Javascript做的AJAX引擎,Javascript的兼容性和DeBug是让人头疼的;2)AJAX无刷新使用户无法判断数据是否已经刷新,解决办法:在相关位置提示,数据已更新;3)中间过程不能被Bookmark,解决办法:GoogleMaps通过页面一个Link,另外还可通过URL链加无效的标记,但还未验证。 39、HIBERNATE IN ACTION 作者是CHRISTIAN BAUER和GAVIN KING,都是 HIBERNATE的创建者。 40、面向对象的特征有哪些方面 1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分的注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2)继承:继承是一个联结类的层次模型,并且允许和鼓励的类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类哪里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。而向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4)多态:多态是指允许不同类的对象对同一消息作出响应。多态包括参数化多态和包含多态。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 41、String是最基本的数据类型吗 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,故不可继承这个类、不能修改这个类。为了提高效率节省空间,应用StringBuffer类。 42、int和Integer有什么区别 Java提供两种不同类型:引用类型和原始类型(或内置类型)。int是java的原始类型,Integer是java为int提供的封装类。 Java为每个原始类型提供了封装类。(原始类型:封装类) boolean:Boolean char:Character byte:Byte short:Short int:Integer long:Long float:Float double:Double 引用类型和原始类型的行为完全不同,且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。 43、String和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符的数据。String类提供了数值不可改变的字符串。StringBuffer类提供了的字符串的修改功能。当知道字符数据要改变的时候,就可以使用StringBuffer。典型的,可以使用StringBuffer来动态构造字符数据。如果最后需要String,那么使用StringBuffer的toString()方法。 44、运行时异常与一般异常有异同 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。Java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未捕获的运行时异常。 45、说出Servlet的生命周期,并说出Servlet和CGI区别 Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet、doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 与CGI的区别在于servlet处于服务器进程中,通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。 46、说出ArrayList,Vector,LinkedList的存储性能和特性 ArrayList和Vector都是使用数组方式存储数据,此数组元素大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。Vector由于使用synchronized方法(线程安全),通常性能上较ArrayList差。而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但插入数据时只需要记录本项的前后项即可,所以插入速度较快。 47、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,Stateful Bean和Stateless Bean的区别 EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。 Session Bean在J2EE应用程序中用来完成一些服务器端的业务操作。如访问数据库、调用其他EJB组件。Entity Bean用来代表应用系统中用到的数据。 第 页 共 52 页 对于客户机,Session Bean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。Entity Bean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean还可分为Stateful Session Bean 和Stateless Session Bean,这两种的Session Bean都可以将系统逻辑放在method之中执行,不同的是Stateful Session Bean可以记录呼叫者的状态。因此通常来说,一个使用者会有一个相对应的Stateful Session Bean的实体。Stateless Session Bean虽也是逻辑组件,但却不负责使用者状态,也就是说当使用者呼叫Stateful Session Bean的时候,EJB Container并不会找寻特定的Stateless Session Bean的实体来执行这个method。换言之,很可能数个使用者在执行某个Stateless Session Bean的method时,会是同一个Bean的Instance在执行。从内存方面看,Stateful Session Bean 与 Stateless Session Bean 比较,Stateful Session Bean会消耗J2EE Server较多的内存,然而Stateful Session Bean的优势却在于他可以维持使用者的状态。 48、Collection和Collections的区别 Collection是集合类的上级接口,继承的接口主要有Set和List。 Collections是针对集合类的一个帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 49、&和&&的区别 &是位运算符,表示按位与运算;&&是逻辑运算符,表示逻辑与(and)。 50、HashMap和Hashtable的区别 HashMap是Hashtable的轻量级实现(非线程安全的实现),都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的Key或者value,而Hashtable不允许。 HashMap把Hashtable 的contains方法去掉了,改成了containsvalue和containsKey方法容易让人引起误解。 Hashtable 继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。 51、final、finally、finalize的区别 final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其它资源回收,例如关闭文件等。 52、sleep()和wait()有什么区别 sleep()是线程类(Thread)的方法,导致此线程暂停执行指定时间,将执行机会给其他线程,但是监控状态依然保持,到时会自动恢复。调用sleep不会释放对象锁。 wait()是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify()方法(或notifyAll())后本线程才进入对象锁定池准备获得对象锁进入运行状态。 53、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overriding是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 54、error和exception有什么区别 error表示恢复不是不可能,但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。Exception表示一种设计或实现问题,也就是说,它表示如果程序运行正常,从不会发生的情况。 55、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 56、abstract class和interface有什么区别 声明方法的存在而不去实现它的叫做抽象类(abstract class),它用于要创建一个体现某些特征的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract类的实例。然而可以创建一个变量,其类型是一个抽象类型,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。 第 页 共 52 页 57、forward和redirect的区别 forward是服务器请求资源,服务器直接访问目标地址的URL,把URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 58、EJB与JAVA BEAN的区别 Java Bean是可复用的组件,对Java Bean并没有严格的规范。理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器;另外,Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,是不能被跨进程访问的。Enterprise Java Bean相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但是EJB必须被布置在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过窗口来访问真正的EJB组件。 59、Static Nested Class和Inner Class的不同 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 60、JSP中动态Include与静态Include的区别 动态Include用jsp:include动作实现它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态Include用include伪码实现,定义不会检查所含文件的变化,适用于包含静态页面<%@ include file=”included.htm”%> 61、什么时候用assert assertion(断言)在软件开发中是一种常用的调试方法,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true。如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。 62、GC是什么?为什么要有GC? GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或错误的内在回收会导致程序或系统的不稳定甚至崩溃。Java提供的GC功能可自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显式操作方法。 63、short s1 = 1 ; s1 = s1 + 1 ; 有什么错? short s1 = 1; s1 += 1 ; 有什么错? short s1 = 1 ; s1 = s1 + 1 ; //s1+1运算结果是int类型,需要强制转换类型 short s1 = 1 ; s1 += 1 ; //可以正常编译 64、Math.round(11.5)等于多少?Math.round(-11.5)等于多少? Math.round(11.5) = 12; Math.round(-11.5) = -11; //round方法返回与参数最接近的长整数,参数加1/2后求其floor。 65、String s = new String(“xyz”);创建了几个String Object? 两个,一个是“xyz”,一个是指向“xyz”的引用对象s。 66、设计4个线程,其中两个线程每次对j增加1,另外两线程对j每次减少1。写出程序。以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest { private int j; public static void main(String[] args){ ThreadTest tt = new ThreadTest(); Inc inc = tt.new Inc(); Dec dec = tt.new Dec(); for(int i = 0; i < 2 ; i ++){ Thread t = new Thread(inc); t.start(); t = new Thread(Dec); t.start(); } } private synchronized void inc(){ j++; System.out.printIn(Thread.currentThread().getName()+”-inc:”+j); } private synchronized void inc(){ 第 页 共 52 页 j--; System.out.printIn(Thread.currentThread().getName()+”-dec:”+j); } class Inc implements Runnable{ public void run(){ for( int i = 0; i < 100; i ++) inc(); } } class Dec implements Runnable{ public void run(){ for( int i = 0; i < 100; i ++) dec(): } } } 67、Java有没有goto? Java中的保留字,现在没有在java中使用。 68、启动一个线程是用run()方法还是start()方法? 启动一个线程调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着可以由JVM调试并执行。但并不意味着线程就公立即运行。run()方法可以产生必须退出的标志来停止一个线程。 69、EJB包括(Session Bean,Entity Bean)说出他们的生命周期,及如何管理事务的? Session Bean:Stateless Session Bean 的生命周期是由容器决定的,当客户机发生请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。当客户机第一次调用一个Stateful Session Bean时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean的方法时容器会把调用分派到与此客户机相关联的Bean实例。 Entity Bean:Entity Beans能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在,Entity beans就一直存活。而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了,Entity beans也是存活的。Entity Beans生命周期能够被容器或者Beans自己管理。 EJB通过以下技术管理事务:对象管理组织(OMG)的对象实务服务(OTS)、Sun Microsystems的Transaction Service(JTS)、Java Transaction API(JTA)开发组(X/Open)的XA接口。 70、应用服务器有哪些? BEA WebLogic Server、IBM WebSphere Application Server、Oracle9i Application Server、JBoss、Tomcat等。 71、给出一个最常见到的runtime exception ArithmeticException ArrayStoreException BufferOverflowException BufferUnderflowException CannotRedoException CannotUndoException ClassCastException CMMException ConcurrentModificationException DOMException EmptyStackException IllegalArgumentException IllegalMonitorStateException IllegalPathStateException IllegalStateException ImagingOpException IndexOutOfBoundsException MissingResourceException NegativeArraySizeException NoSuchElementException NullPointerException ProfileDataException ProviderException RasterFormatException SecurityException SystemException UndeclaredThrowableException UnmodifiableSetException UnmodifiableSetException UnsupportedOperationException 72、接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承实体类? 接口可以继承接口;抽象类可以实现接口;抽象类是可继承实体类,但前提是实体类必须有明确的构造函数。 73、List,Set,Map是否继承自Collection接口? List,Set是,Map不是。 74、说出数据连接池的工作机制是什么? J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时池驱动程序会返回一个未使用的池连接并将其标记为忙。用户当前有空闲连接时,池驱动程序将此连接标记为空闲,其他调用就可以使用这个连接。 75、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 都不行。 76、数组有没有length()这个方法?String有没有length()这个方法? 数组没有这个length()方法,有length属性。String有length()这个方法。 77、Set里的元素是不能重复的,那么用什么防那个法来区分重复与否呢?是用==还是equals()?他们有何区别? Set里的元素是不能重复的,用iterator()方法来区分重复与否。equals()是判断两个Set是否相等。equals()和==方法决定引用值是否指向同一对象。equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。 78、构造器Constructor是否可被override? 第 页 共 52 页 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。 79、是否可以继承String类? String类是final的,故不可以继承。 80、switch是否能作用在byte上,是否能作用在long上,是否能作用在String上? switch(expr1)中,expr1是一个整数表达式。因此传递给switch和case语句的参数应该是int、short、char或者byte;long、String都不能作用于switch。 81、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会执行,什么时候被执行,在return前还是后? 会执行,在retrun前执行。 82、编程题:用最有效率的方法算出2乘以8等于几? 2<<3 83、两个对象之相同(x.equals(y)==true),但却可有不同的hash code,这句话对不对? 不对,有相同的hash code。 84、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递。Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。 85、当一个线程进入一个对象的一个synchronized方法后,其他线程是否可进入此对象的其他方法? 不能,一个对象的一个syncronized方法只能由一个线程访问。 86、编程题:写一个Singleton出来。 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 一般Singleton模式通常有几种形式: 第一种形式:定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例化,通过一个public的个体Instance方法过去对他的引用,继而调用其中的方法。 public class Singleton { private Singleton(){} //在自己内部定义一个实例,是不是很奇怪?注意这是private只供内部调用 private static Singleton instance=new Singleton(); //这里提供一个供外部访问本class的静态方法可以直接访问 public static Singleton getInstance(){ return instance; } } 第二种形式: public class Singleton { private static Singleton instance = null; public static synchronized Singleton getInstance() { //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次;使用时生成实例,提高效率 if(instance==null) instance = new Singleton(); return instance; } } 其他形式: 定义一个类,它的构造函数为private的,所有方法为static的。一般认为第一种形式要更加安全些。 87、Java的接口和C++的虚类的相同和不同处。 由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里所有的方法和属性,并且接口里的属性在默认状态下面都是public static,所有方法默认情况下是public。一个类可以实现多个接口。 88、Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。 89、垃圾回收的优点和原理。并考虑2种回收机制。 Java语言中一个显著的特点就是引入了垃圾回收机制,使C++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 第 页 共 52 页 90、请说出你所知道的线程同步的方法。 wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。 Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。 91、你所知道的集合类都有哪些?主要方法? 最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。 Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。 92、描述一下JVM加载class文件的原理机制? JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 93、char型变量中能不能存贮一个中文汉字?为什么? 能够定义成为一个中文的,因为java中以Unicode编码,一个char占16个字节,所以放一个中文是没问题的。 94、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口; 同步的实现方面有两种,分别是synchronized,wait与notify。 95、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可以存贮用户的状态信息 。 application 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息。 config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。 page表示从该页面产生的一个servlet实例。 Exception表示运行时的异常,只有在错误页面才可使用。 96、线程的基本概念、线程的基本状态以及状态之间的关系。 线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。 Java中的线程有四种状态分别是:运行、就绪、挂起、结束。 97、JSP的常用指令 <%@page language="java" contenType="text/html;charset=gb2312" session="true" buffer="64kb" autoFlush="true" isThreadSafe="true" info="text" errorPage="error.jsp" isErrorPage="true" isELIgnored="true" pageEncoding="gb2312" import="java.sql.*"%> isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式)。 <%@include file="filename"%> <%@taglib prefix="c"uri=" http://......"/> 98、什么情况下调用doGet()和doPost()? Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。 99、servlet的生命周期 web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。 100、如何现实servlet的单线程模式 <%@ page isThreadSafe="false"%> 101、页面间对象传递的方法 request,session,application,cookie等。 102、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。 第 页 共 52 页 103、四种会话跟踪技术 会话作用域ServletsJSP页面描述 page是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面。 request是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)。 session是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求。 application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。 104、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):删除请求中的一个属性。 105、J2EE是技术还是平台还是框架 J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 106、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso-8859-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; } 107、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。 a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型; b.逻辑操作不会产生短路。 108、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 两种形式:dtd和schema; 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的); 解析方式:有DOM,SAX,STAX等; DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问。 SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 第 页 共 52 页 。 STAX:Streaming API for XML (StAX)。 109、简述synchronized和java.util.concurrent.locks.Lock的异同? 主要相同点:lock能完成synchronized所实现的所有功能。 主要不同点:lock有比synchronized更精确的线程语义和更好的性能。Synchronized会自动释放锁,而lock一定要求程序员手工释放,并且必须在finally从句中释放。 110、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类。 111、EJB 容器提供的服务 主要提供声明周期管理、代码产生、持续化管理、安全、事务管理、锁和并发行管理等服务。 112、EJB 规范规定EJB中禁止的操作有那些? 1.不能操作线程和线程API(线程API指非线程对象的方法如:notify,wait等);2.不能操作awt;3.不能实现服务器功能;4.不能存放静态属性;5.不能使用IO操作直接存取文件系统;6.不能加载本地库;7.不能将this作为变量和返回;8.不能循环调用。 113、Remote接口和Home接口主要的作用 Remote接口定义了业务方法,用EJB客户端调用业务方法。 Home 接口是EJB工厂用于创建和移除查找EJB 实例。 114、Bean实例的生命周期 对于Stateless Session Bean、Entity Bean、Message Driven Bean 一般存在缓存池中管理,而对于 Entity Bean 和Statefull Session Bean存在Cache管理,通常包含创建实例、设置上下文、创建EJB Obiect (create)、业务方法调用、Remove等过程,对于存在缓存池中管理的Bean,在create之后实例并不从内存中消除,而是采用缓存池调用机制不断重用实例,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量。 115、EJB的激活机制 以Stateful Session Bean为例:其Cache大小决定里面内存中可同时存在的Bean实例得数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个EJB实例业务方法时,如对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)恢复(激活)此实例。状态变迁前会调用对应的ejbActicve和ejbPassivate方法。 116、EJB的几种类型 会话(Session)Bean,实体(Entity)Bean,消息驱动(Message Diven)Bean。 会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种。 实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种。 117、客服端调用EJB对象的几个基本步骤 设置JNDI服务工厂及JNDI服务地址系统属性,查找Home接口,从Home接口调用Create方法创建Remote接口,通过Remote接口调用其业务方法。 118、如何给weblogic指定大小内存 在启动weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加set MEM_ARGS=-Xms32m-Xmx200m,可以调整最小内存为32M,最大内存为200M。 119、如何设定weblogic的热启动模式(开发模式)与产品发布模式 可以在管理控制台中修改对应服务器的启动模式为开发模式之一,或者修改服务器的启动文件或者Commcnv文件,增加set production_mode=true。 120、如何启动是不需要输入用户名和密码 修改服务器启动文件,增加WLS_USER和WLS_PW项,也可在boot.properties文件增加加密过得用户名和密码。 121、在weblogic管理控制台中队一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中 保存在Domain的config.xml文件中,它是服务器的核心配置文件。 122、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloworld.jsp放入何目录下,然后再浏览器上就可以打入http://主机:端口号//helloworld.jsp就看到运行结果了。又比如这其中用到了自己写的一个javaBean该如何办? Domain目录服务器目录applications,将应用目录放在此目录下可作应用访问。如果是web应用,应用目录需要满足web应用目录要求,jsp文件可以直接放在应用目录中,javabean需要放在应用目录的WEB-INF目录的classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。 第 页 共 52 页 123、在weblogic中发布ejb需涉及到那些配置文件 不同的ejb涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xml。CMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml。 124、如何在weblogic中进行ssl 配置与客户端的认证配置或说说j2ee(标准)进行ssl配置 安装中使用DemoIdentity.jks和DemoTrust .jks、KeyStore实现SSL,需要配置服务器使用Enable SSL,配置其端口。在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trust keystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。 125、如何查看在weblogic中发布的EJB 可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB。 126、CORBA是什么?用途是什么 CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL),语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:用不同的程序设计语言书写在不同的进程中运行,为不同的操作系统开发。 127、说说你所熟悉或听说过的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架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。 128、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别 persistent方式的MDB可以保证消息传递的可靠性。也就是如EJB容器出现问题,而JMS服务器依然会将消息在此MDB可用的时候发送过来,而non-persistent方式的消息将被丢弃。 129、Servlet执行时一般实现哪几个方法 public void init(ServletConfig config); public ServletConfig getServletConfig(); public String getServletInfo(); public void service(ServletRequest request,ServletResponse response); public void destroy()。 130、j2ee常用的设计模式?说明工厂模式。 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(责任链模式) 工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类,可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类,并且实现了相同的方法,但这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法,而不必考虑到底返回的是哪一个子类的实例。 131、EJB需直接实现它的业务接口或Home接口吗,请简述理由。 远程接口和Home接口不需要直接实现,其实现代码由服务器产生,程序运行中对应实现类会作为对应接口类型的实例被使用。 132、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。 排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)。 快速排序: public class Test { public static void main(String[] args) { int array[] = { 55, 2, 6, 4, 32, 12, 9, 73, 26, 37 }; int len = array.length; 第 页 共 52 页 for (int i = 0; i < len; i++) Test.qsort(array, 0, len - 1); for (int i = 0; i < len; i++) System.out.print(array[i]+" | "); } public static void qsort(int value[], int left, int right) { int point, l, r, temp; l = left; r = right; point = value[(left + right) / 2]; while (l < r) { while (value[l] < point) ++l; while (value[r] > point) --r; if (l >= r) break; temp = value[l]; value[l] = value[r]; value[r] = temp; if (l != point) --r; if (r != point) ++l; } if (l == r) l++; if (left < r) qsort(value, left, l - 1); if (l < right) qsort(value, r + 1, right); } } 思想:使用快速排序方法对value[0:n-1]排序,从value[0:n-1]中选择一个元素作为middle,该元素为支点,把余下的元素分割为两段left和right,使得left中的元素都小于等于支点,而right 中的元素都大于等于支点,递归使用快速排序方法对left 进行排序,递归使用快速排序方法对right进行排序,所得结果为left+middle+right。 133、请对以下在J2EE中常用的名词进行解释(或简单描述) web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接从容器中的环境变量直接交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。 EJB容器:Enterprise java bean 容器。更具有行业领域特色。提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就被容器进行高效率的管理。并可通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。 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特有的。 134、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语句。 135、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以。必须只有一个类名与文件名相同。 136、MVC的各个部分都有那些技术来实现?如何实现? 第 页 共 52 页 MVC是Model-View-Controller的简写。Model是应用的业务逻辑(通过JavaBean,EJB组件实现),View是应用的表示面(由JSP页面产生),Controller是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。 137、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 有两种实现方法,分别是继承Thread类与实现Runnable接口,用synchronized关键字修饰同步方法。 反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们,结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。 138、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。 139、java中会存在内存泄漏吗,请简单描述。 会。如:int i,i2;  return (i-i2);   //当i为足够大的正数,i2为足够大的负数。结果会造成溢位,导致错误。 140、java中实现多态的机制是什么? 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。 141、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? 对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是“可达的”,哪些对象是“不可达的”。当GC确定一些对象为“不可达”时,GC就有责任回收这些内存空间。 可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。 142、静态变量和实例变量的区别? static i = 10; //常量 class A a;  a.i =10;//可变 143、什么是java序列化,如何实现java序列化? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。 序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。 144、是否可以从一个static方法内部发出对非static方法的调用? 不可以,如果其中包含对象的method();不能保证对象初始化。 145、写clone()方法时,通常都有一行代码,是什么? clone有缺省行为,super.clone();它负责产生正确大小的空间,并逐位复制。 146、在JAVA中,如何跳出当前的多重嵌套循环? 用break; return 方法。 147、List、Map、Set三个接口,存取元素时,各有什么特点? List以特定次序来持有元素,可有重复元素。Set无法拥有重复元素,内部排序。Map保存key-value值,value可多值。 148、J2EE是什么 J2EE是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model)。在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。 149、UML方面 标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。 150、说出一些常用的类,包,接口,请各举5个 常用的类:BufferedReader  BufferedWriter  FileReader  FileWirter  String  Integer; 常用的包:java.lang  java.awt  java.io  java.util  java.sql; 常用的接口:Remote  List  Map  Document  NodeList。 151、开发中都用到了那些设计模式?用在什么场合? 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。 第 页 共 52 页 152、应用服务器与WEB SERVER的区别? 应用服务器:Weblogic、Tomcat、Jboss; WEB SERVER:IIS、 Apache。 153、BS与CS的联系与区别。 C/S是Client server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。 C/S 与 B/S 区别: 1.硬件环境不同 C/S 一般建立在专用的网络上,小范围里的网络环境,局域网之间再通过专用服务器提供连接和数据交换服务。 B/S 建立在广域网之上,不必是专门的网络硬件环境,例:电话上网,租用设备。信息自己管理,有比C/S更强的适应范围,一般只要有操作系统和浏览器就行。 2.对安全要求不同 C/S 一般面向相对固定的用户群,对信息安全的控制能力很强。一般高度机密的信息系统采用C/S 结构适宜。可以通过B/S发布部分可公开信息。 B/S 建立在广域网之上,对安全的控制能力相对弱,可能面向不可知的用户。 3.对程序架构不同 C/S 程序可更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑。 B/S 对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上,比C/S有更高的要求。B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk 2000 Exchange 2000等,全面支持网络的构件搭建的系统。SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟。 4.软件重用不同 C/S 程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好。 B/S 是多重结构,要求构件相对独立的功能。能够相对较好的重用,就如:买来的餐桌可再利用,不像地上的石头桌子。 5.系统维护不同 C/S 程序由于整体性,必须整体考察,处理出现的问题以及系统升级,升级难,可能是再做一个全新的系统。 B/S 是构件组成,方便构件个别的更换,实现系统的无缝升级。系统维护开销减到最小,用户从网上自己下载安装就可以实现升级。 6.处理问题不同 C/S 程序面向用户固定,且在相同区域,安全要求高,与操作系统相关,应该都是相同的系统。 B/S 建立在广域网上,面向不同的用户群,分散地域,这是C/S无法作到的,与操作系统平台关系最小。 7.用户接口不同 C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高。 B/S 建立在浏览器上,有更加丰富和生动的表现方式与用户交流,并且大部分难度减低,减低开发成本。 8.信息流不同 C/S 程序一般是典型的中央集权的机械式处理,交互性相对低。 B/S 信息流向可变化,B-B、B-C、B-G等信息、流向的变化,更像交易中心。 154、LINUX下线程,GDI类的解释。 LINUX实现的就是基于核心轻量级进程的“一对一”线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。 GDI类为图像设备编程接口类库。 155、STRUTS的应用(如STRUTS架构) Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts的主要功能: 1.包含一个controller servlet,能将用户的请求发送到相应的Action对象;2.JSP自由tag库,且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。 3.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。 156、Jdo是什么? JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如:JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因它可在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。 第 页 共 52 页 157、内部类可以引用他包含类的成员吗?有没有什么限制? 一个内部类对象可以访问创建它的外部类对象的内容。 158、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 Web Service:基于网络的、分布式的模块化组件。执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。 JAXP(Java API for XML Parsing): 定义了在Java中使用DOM,SAX,XSLT的通用的接口。这样在你的程序中只要使用这些通用的接口,当需要改变具体的实现时候也不需要修改代码。 JAXM(Java API for XML Messaging):是为SOAP通信提供访问方法和传输机制的API。 WSDL:一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。 SOAP:简单对象访问协议(Simple Object Access Protocol),是用于交换XML编码信息的轻量级协议。 UDDI:的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,使别的企业能够发现访问协议的实现标准。 159、JAVA代码查错 1. abstract class Name { private String name; public abstract boolean isStupidName(String name) {} } 错。abstract method必须以分号结尾,且不带花括号。 2. public class Something { void doSomething () { private String s = ""; int l = s.length(); } } 错。局部变量前不能放置任何访问修饰符(private,public,和protected)。final可以用来修饰局部变量。 (注:final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable。) 3. abstract class Something { private abstract String doSomething (); } 错。abstract的method不能以private修饰。abstract的method就是让子类implements(实现)具体细节的,怎么可以用private把abstract method封锁起来呢?(同理,abstract method前不能加final)。 4. public class Something { public int addOne(final int x) { return ++x; } } 错。int x被修饰成final,意味着x不能在addOne method中被修改。 5. public class Something { public static void main(String[] args) { Other o = new Other(); new Something().addOne(o); } public void addOne(final Other o) { o.i++; } } class Other { public int i; } 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference。(比如: o = new Other();),那同上例这题也是错的。但这里修改的是o的member vairable(成员变量),而o的reference并没有改变。 6. class Something { int i; public void doSomething() { System.out.println("i = " + i); } } 正确。输出的是i = 0。int i属於instant variable(实例变量,或叫成员变量)。instant variable有default value。int的default value是0。 7. class Something { final int i; 第 页 共 52 页 public void doSomething() { System.out.println("i = " + i); } } 错。final int i是个final的instant variable。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为final int i = 0;。 8. public class Something { public static void main(String[] args) { Something s = new Something(); System.out.println("s.doSomething() returns " + doSomething()); } public String doSomething() { return "Do something ..."; } } 错。看上去在main里call doSomething没有什么问题,毕竟两个method都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成System.out.println("s.doSomething() returns " + s.doSomething());。同理,static method不能访问non-static instant variable。 9. 此处,Something类的文件名叫OtherThing.java class Something { private static void main(String[] something_to_do) { System.out.println("Do something ..."); } } 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。 10. interface A{ int x = 0; } class B{ int x =1; } class C extends B implements A { public void pX(){ System.out.println(x); } public static void main(String[] args) { new C().pX(); } } 错误。在编译时会发生错误(错误描述与JVM不同而信息不同),意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。 11. interface Playable { void play(); } interface Bounceable { void play(); } interface Rollable extends Playable, Bounceable { Ball ball = new Ball("PingPang"); } class Ball implements Rollable { private String name; public String getName() { return name; } public Ball(String name) { this.name = name; } public void play() { ball = new Ball("Football"); System.out.println(ball.getName()); } } 错,interface Rollable extends Playable Bounceable没有问题。interface 可继承多个 interface ,所以这里没错。问题出在 interface Rollable 里的 Ball ball=new Ball("PingPang");。任何在 interface 里声明的 interface variable(接口变量,也可以称成员变量),默认为 public static final。也就是说Ball ball=new Ball("PingPang");实际上是public static fianl Ball ball=new ball("PingPang");。在 Ball 类的 Play() 方法中,ball=new Ball("Football"); 改变了 ball 的 reference,而这里的 ball 来自 Rollable interface,Rollable interface 里的 ball 是 public ststic final 的,final 的 object 是不能改变 reference 的。因此编译器将在ball=new Ball("Football");这里显示有错。 160、JAVA编译题 现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一业面显示按什么顺序,结果为,提供reset。 import java.util.*; punlic class bycoma{ public ststic String[] splitStringByComma(String source){ if(source == null || source.trim.equals("")) return null; StringTokenizer commaToker = new StringTokenizer(source,","); 第 页 共 52 页 String[] result = new String[commaToker.countTokens()]; int i=0; while(commaToker.hasMoreTokens()){ result[i] = commaToker.nextToken(); i++; } return result; } public ststic viod main(String args[]){ String[] s = splitStringByComma("5,8,7,4,3,9,1"); int[] ii =new int[s.lenght]; for(int i = 0;i < s.lenght; i++) ii[i] = Integer.parseInt(s[i]); Arrays.sort(ii); //asc for(int i = o;i < s.lenght; i++) System.out.println(ii[i]); //desc for(int i =(s.lenght-1); i >= 0; i--) System.out.println(ii[i]); } } 161、以下三条输出语句分别输出什么? [C] char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc"; const char* str6 = "abc"; cout << boolalpha << (str1 == str2) << endl; // 输出false cout << boolalpha << (str3 == str4) << endl; // 输出false cout << boolalpha << (str5 == str6) << endl; // 输出true 162、非 C++ 内建类型 A 和 B,在哪几种情况下 B 能隐式转化为 A ? [C++] a.class B: class A{......} // B 公有继承自 A,可以是间接继承的 b.class B {operator A(;} // B 实现了隐式转化为A的转化 c.class A {A(const B& ;} // A 实现了 non-explicit 的参数为 B(可以有其他带默认值的参数)构造函数 d.A& operator = (const A&; // 赋值操作,虽然不是正宗的隐式类型转换,但也可以勉强算一个 163、以下代码中的两个 sizeof 用法有问题吗? [C] void UpperCase(char str) // 将str中的小写字母转化为大写字母 { for(size_t i = 0;i < sizeof(str)/sizeof(str[0]));i++ if('a'<= str[i] && str[i]<= 'z') str[i] = ('a'-'A'); } char str[] ="aBcDe"; cout << "str 字符长度为:" << sizeof(str)/sizeof(str[0]) << end1; UpperCase( str ); count << str << end1; 164、以下代码有什么问题? [C] void char2Hex(char c) //将字符以16进制表示 { char ch = c / 0x10 + '0';if(ch > 9) ch += ('A'-'9'-1); char ch = c % 0x10 + '0';if(cl > 9) ch += ('A'-'9'-1); cout << ch << cl << ' ' ; } char str[] = "I love 中国"; for(size_t i = 0; i < strlen(str); ++i) char2Hex(str[i]); cout << endl; 165、以下代码有什么问题? [C++] 第 页 共 52 页 struct Text { Text( int {} Text() {} void fun() {} }; void mian() { Text a(1); a.fun(); Text b(); b.fun(); } 166、以下反向遍历array数组的方法有什么错误?[STL易] vector array; array.push_back( 1 ); array.push_back( 2 ); array.push_back( 3 ); for( vector::size_type i=array.size()-1; i>=0; --I ) // 反向遍历array数组 cout << array[i] << endl; 167、以下代码有什么问题?[STL] typedef vector IntArray; IntArray array; array.push_back( 1 ); array.push_back( 2 ); array.push_back( 2 ); array.push_back( 3 ); // 删除array数组中所有的2 for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )    if( 2 == *itor ) array.erase( itor ); 168、heap和stack有什么区别 栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素。 169、如何设置Java 2(JDK1.2)的环境变量? Java 2安装后,需要设置PATH和JAVA_HOME环境变量.与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径。 170、Java 2环境变量的设置如下例所示 Solaris平台: setenv JAVA_HOME Java2的安装路径 setenv PATH $JAVA_HOME/bin:${;PATH}; Windows平台: set JAVA_HOME=Java2的安装路径 set PATH=$JAVA_HOMEbin;%PATH% 171、哪些Java集成开发工具支持Java 2? 目前流行的Java集成开发环境,如Inprise的JBuilder,Symantec的Visual Cafe, Sybase的PowerJ,都支持Java 2. 172、如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围? 当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM.而不同浏览器对JDK的支持程度也不尽相同. 因此,在Netscape或 IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该 applet,以确定错误的产生是与浏览器相关. 如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览 器不完全兼容JDK而引起的. 此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin. 如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误 提示检查applet程序。 173、当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码? 这个问题的实现通常与各个JDBC driver的实现有关. 目前大多数JDBC driver采用本地编码格式来传输中文字符,例如中文字符 "0x4175"会被转成"0x41"和"0x75"进行传输. 因此我们需要对JDBC driver返回的字符以及要发给JDBC driver的字符进行转换。 当用JDBC driver向数据库中插入数据时,需要先将Unicode转成native code; 当 JDBC driver从数据库中查询数据时,则需要将native code转换成Unicode. 下面给出了这两种转换的实现: String native2Unicode(String s) { 第 页 共 52 页 if (s == null || s.length() == 0) return null;   byte[] buffer = new byte[s.length()]; for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) { c = s.charAt(i); byte []buf = (""+c).getBytes(); buffer[j++] = (char)buf[0]; buffer[j++] = (char)buf[1]; }else { buffer[j++] = s.charAt(i); } } return new String(buffer, 0, j); } 除使用以上两个方法之外,有些JDBC driver如果对jdbc driver Manager设置了正确的字符集属性,以上2个方法就不需要了。 174、当用Servlet来处理http请求并产生返回的HTML页面时,如何使HTML页面中的中文字符能够正常显示? javax.servlet.http.HttpResponse类用于产生返回页面.通过HttpResponse定义的方法 getOutputStream()可以获得ServletOutputStream的实例,这样用户就可以利用 ServletOutputStream.write方法向输出流中写入返回页面的内容。但是ServletOutputStream使用的是缺省的编码方式,如果要使返回页面中的中文字 符能够正常显示,最好显示地指定所用的字符编码方式。 通常需要构造一个 OutputStreamWriter 。 例程如下: public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ res.setContentType("text/html"); ServletOutputStream out = res.getOutputStream(); OutputStreamWriter ow = new OutputStreamWriter(out,"GB2312"); ow.write("这是测试"); ow.flush(); ow.close(); } 175、如何设置Java WebServer的CLASSPATH,以包含用户的class文件? 有两种方法可以设置Java WebServer的CLASSPATH环境变量,以使用户编写的Servlet能够调用用户的class文件。将用户的class文件放到 JavaWebServer_Dir/classes目录下,在Java WebServer 启动时,classes目录被自动加入到CLASSPATH环境变量中了,修改httpd.nojre文件,将用户class文件所在的路径名加到CLASSPATH环境变量中。 176、为什么在Windows平台上用Naming.lookup来获取远程RMI对象时会很慢? 机器的网络设置不正确很可能会引起该问题的发生。 RMI使用了Java网络类,特别是java.net.InetAddress类,它将查询TCP/IP的主机名, 包括IP地址到主机名的映射和主机名到IP地址的映射。在Windows平台,这种查询功能 是由本地的Windows Socket库来实现的. 因此延时是发生在Windows库中,而非RMI中。 如果你的机器设置成使用DNS,问题通常是DNS服务器查不到主机名,你所发现的延时 是DNS查询的延时. 请尝试将RMI通信中涉及到的所有主机名、IP地址加到本地文件 winntsystem32driversetchosts或windowshosts中。 格式如下: IP地址 主机名 如此设置应当可以明显地减少查询所花的时间。 177、编写Java application时,如何设置proxy的信息,以便访问外部网站? 若在java application中访问外部网站,首先应设置proxy信息,样例代码如下: import java.util.properties; ..... Properties sys = System.getProperties(); sys.put("proxySet","true"); sys.put("proxyHost","myHTTP.proxyserver.com"); sys.put("proxyPort","80"); System.setProperties(sys); u = new URL(website); connect = (HttpURLConnection)u.openConnection(); ..... 178、Swing组件JList的列表数据修改了,如何通知JList改变显示? JList组件有一个单独的显示模式ListModel来表示JList的显示数据。JList创建以后,JList数据元素的值及数据元素的数量可以动态地改变。JList在它的数据模式ListModel中观察数据的改变.因此,一个ListModel 的正确实现应当在每次数据发生改变时,通知事件的监听者。 当使用构造函数JList(Object[])创建一个JList的实例时,系统将自动 创建一个DefaultListModel的实例来存储 JList的显示数据, 可以调用 DefaultListModel中定义的简便方法来动态地修改JList的数据,如:removeElementAt(index), addElement(Object)等 第 页 共 52 页 。DefaultListModel 在修改数据的同时,将通知JList关于数据的改变。 179、在Java applet中如何实现一个模式对话框? 在Java applet中实现模式对话框的关键就是在创建一个对话框的时候 要为该对话框指定一个正确的父窗口.因为Applet是Panel类的子类,不 可以作为对话框的父窗口,所以首先要获得applet所在的窗口,作为模式 对话框的父窗口. 样例代码如下: ..... Dialog d = new Dialog( getParentWindow(comp),title); // comp为applet上的任意一个组件 .... public void getParentWindow(Component compOnApplet,String title){ Container c = compOnApplet.getParent(); while (c != null) { if (c instanceof Frame) return (Frame) c; c = c.getParent(); } return null; } 180、在Java applet中如何显示另外一个HTML页面? 通过java.applet.Applet.getAppletContext()方法可以获得与该applet相关的AppletContext, AppletContext.showDocument(URL)方法就可以使applet所在的浏览器显示另外一个网页。 181、JDK实现的签名applet,可否在Netscape或IE中运行? 用JDK实现的签名applet,不可以在Netscape或IE中运行,但是可以在Hotjava浏览器中运行。不同的浏览器提供了不同的签名applet机制。如Netscape提供了zigbert工具和 Capability API,而IE则需要使用 CAB文件。但是,无论是Netscape工具产生的签名applet,还是用IE产生的签名applet,都不可以在其它的浏览器中运行。如果要使JDK产生的签名applet能够在Netscape或IE中运行,解决方法是在 Netscape或IE中安装Java Plugin,则用JDK实现的签名applet就可以在这两种浏览器中运行。 182、用JNI技术可以从Java应用中调用C程序库,但是如何使该C程序库可以调用另外的C程序库? 如一个被Java调用的C程序库C1仍需要调用另一个C程序库C2,那么在编译C1的时候应当联接程序库C2。 步骤如下(Solaris平台): 编写调用C库的Java文件,并编译;javac java文件名;产生C程序头文件;javah -jni java文件名(不带后缀.java);编写被Java调用的C程序C1.c,以及被C1调用的C2.c,并编译。cc -G -Iinclude路径名 C2.c -o libC2.so;cc -G -Iinclude路径名 -lC2 C1.c -o libC1.so;设置环境变量;setenv LD_LIBRARY_PATH libC1.so,libC2.so所在路径;:${;LD_LIBRARY_PATH};运行java应用。 183、在Java语言中,如何列出PC机文件系统中的所有驱动器名? 在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能。 184、为什么Runtime.exec("ls")没有任何输出? 调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用 Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin、stdou、stderr)都通过 Process.getOutputStream(),Process.getInputStream(),Process.getErrorStream ()方法重定向给它的父进程了。用户需要用这些stream来向子进程输入数据或获取子进程的输出。 所以正确执行Runtime.exec ("ls")的例程如下: try { process = Runtime.getRuntime().exec (command); InputStreamReader ir=newInputStreamReader(process.getInputStream()); LineNumberReader input = new LineNumberReader (ir); String line; while ((line = input.readLine ()) != null) System.out.println(line); }catch (java.io.IOException e){ System.err.println ("IOException " + e.getMessage()); } 185、如何产生签名applet,以使applet能够访问本地资源? 在jdk1.1中,可以使用javakey命令来产生公钥,私钥,证书和签名的jar文件,详细资料请参考: http://java.sun.com/security/usingJavakey.html。而java 2 对签名机制做了比较大的改进,允许用户更灵活地设置安全权限。Java 2提供了三个工具:keytool,policytool和jarsigner来实现签名applet。例如:Joe编写了一个签名applet:SignedApplet.java,那么产生一个简单的签名applet的过程如下: //产生密钥,密钥别名为joe,口令为sign12,存放在密钥库joestore中 keytool -genkey -alias joe -keypass sign12 -keystore joestore 第 页 共 52 页 //将SignedApplet.class及相关文件打包成jar文件 jar cvf SignedAppletDemo.jar //利用keytool生成的自签名的证书产生签名applet(jar文件) jarsigner -keystore joestore -signedjar joe.jar SignedAppletDemo.jar joe //将自签名证书从keystore中输出到文件 keytool -export -keystore joestore -alias joe -file joe.cer 面对于签名applet的接受方Susan,需要通过如下步骤来安全地执行 Joe编写的签名applet: //得到Joe的证书并将之读入到密钥库中susanstore中 keytool – import – alias joe – file joe.cer –keystore susanstore //运行policytool产生满足Susan要求的policy文件 policytool //用appletviewer运行之,或在浏览器中安装java plugin来运行之。 关于签名applet 在java Plugin中的部署请参考以下网页: http://java.sun.com/security/signExample12/ 注:以上的例子为简单起见,使用了keytool产生的自签名证书,其实,用户也可使用keytool-certreq向商业CA中心申请电子证书。 186、若通过ObjectOutputStream向一个文件中多次以追加方式写入Object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException? 使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应。ObjectOutputStream的构造函数会向输出流中写入一个标识头,所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedEception。一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法,被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object,则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法。 187、对象的序列化(Serialization)类是面向流的,应如何将对象写入到随机存取文件中? 目前,没有直接的方法可以将对象写入到随机存取文件中。但可使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象。要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误。例如java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中;相反,我们可以从随机存取文件中读出字节数组,利用它可以构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象。 188、运行RMI应用时,可不可以不手工启动名字服务rmiregistry,而是从程序中启动之? 可以,java.rmi包中提供了类java.rmi.registry.LocateRegistry,用于获取名字服务或创建名字服务,调用LocateRegistry.createRegistry(int port)方法可以在某一特定端口创建名字服务,从而用户无需再手工rmiregistry,此外,LocateRegistry(String host,int port)方法可用于获取名字服务。 189、使用类printJob进行打印操作时,应如何设置打印机名等打印属性? 使用如下方法可以获得printJob的实例用于控制打印操作: Toolkit.getPrintJob(Frame f,String jobtitle,Properties prop); 那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括: awt.print.destination:可以是“printer”或“file”; awt.print.printer:打印机名; awt.print.fileName:打印文件名; awt.print.numCopies: 打印份数; awt.print.options:打印命令的打印选项; awt.print.orientation:打印方向,可以是“portrait”或“landscape”; awt.print.paperSize:纸张大小,可以是“letter”,“legal”,“executive”和“a4”。 190、JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法替代之? Thread.suspend本身易于产生死锁,如一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被除数resume,否则其它线程都无法访问该系统资源。如另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁。因此,在java2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态,一量需要该线程继续运行,其它线程会调用notify()方法来通知它。 191、使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行或最后一行? 在JDK1.1中,ResultSet类中定义了next()方法支持数据指针的下移,但在java2中,ResultSet类增加了如下方法支持数据指针的移动,包括: ResultSet.first():将数据指针移到结果集的第一行;ResultSet.last():将数据指针移到结果集的最后一行;ResultSet.previous():将数据指针上移一行。 第 页 共 52 页 192、哪几种Web Server支持Servlet?如何使HS支持Servlet? 目前,支持Servlet的服务器端产品主要有:Sun公司的Java WebServer,Lotus DominoGo WebServer,BEA weblogic Tengah Server,Jigsaw,NetForge,AcmeServer和Mot Bays Jetty等。 193、如何在java应用中将图像到图像文件中? java Advanced Imaging API(包含在java Media API中)允许在java应用中执行复杂的,高性能的图像处理。JAI API提供了存储图像的能力。 目前,JAI API支持以下几种图像文件格式:BMP、JEPG、PNG、PNM、TIFF,下面给出了将图像存储到BMP文件的一段代码: OutputStream os=new FileOutputStream(file To Write To); BMPEncodeParam param=new BMPEncodeParam(); ImageENcoder enc=ImageCodec.createImageEncoder(“BMP”,os,param); Enc.encode(img); os.close(); 194、问如何用Java语言向串口读写数据? Sun公司的Java Communication API12.0可用于读写串口,它支持RS232串口与平台无关的串/并口通信机制。 195、作用域public,private,protected,以及不写时的区别 区别如下: 作用域 当前类 同一包 子孙类 其它包 public true true true true protected    true  true true false friendly true true false false private true false false false 不写时默认为friendly。 196、ArrayList和Vector的区别,HashMap和Hashtable的区别 ArrayList和Vector主要从二方面来说: 同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。 数据增长:当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的一半。 HashMap与HashTable主要从三方面来说的: 历史原因:Hashtable是基于阵旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。 同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。 值:只有HashMap可以让你将空值作为一个表的条目的key或value。 197、继承时候类的执行顺序问题,一般都是选择题,问将会打印出什么? 父类: public class FatherClass{ public FatherClass(){ System.out.println("FatherClass Create"); } } 子类: public class ChildClass extends FatherClass{ public ChildClass(){ System.out.println("ChildClass Create"); } public static viod main(String[] args){ FatherClass fc = new FatherClass(); ChildClass cc = new ChildClass(); } } 输出结果: C:/>java test.ChildClass FatherClass Create FatherClass Create ChildClass Create 内部类的实现方式? public class OuterClass{ private class InterClass{ public InterClass(){ System.out.println("InterClass Create"); } } public OuterClass(){ InterClass ic = new InterClass(); System.out.println("OuterClass Create"); 第 页 共 52 页 } public static void main(String[] args){ OuterClass oc = new OuterClass(); } } 输出结果: C:/>java test/OuterClass InterClass Create OuterClass Create ------------------------------------------------------------------------------------------------------------------- public class OuterClass{ private double d1 = 1.0; //insert code here } You need to insert an inner class declaration at line 3.Which two inner class declarations are valid?(Choose two.) A. class InnerOne { public static double methoda(){ return d1; } } B. public class InnerOne{ static double methoda(){ return d1; } } C. private class InnerOne{ double methoda(){ return d1; } } D. static class InnerOne{ protected double methoda(){ return d1; } } E. abstract class InnerOne{ public abstract double methoda(); } 说明如下: 动态内部类可以有静态成员,而非静态内部类则不能有静态成员。故A、B错;静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;return d1出错。故 D错;非静态内部类的非静态成员可以访问外部类的非静态变量。故 C 正确。答案为C、E。 198、float型float f = 3.4是否正确? 不正确。精度不准确,应该用强制类型转换,所示:float f = (float)3.4。 199、介绍JAVA中的Cllention FrameWork(包括如何写自己的数据结构)? Collention List LinkedList ArrayList Vector Stack Set Map Hashtable HashMap WeakHashMap Collection 是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。 Map提供key到value的映射。 200、Java的通讯编程,编程题(或回答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示? Server端程序: import java.net.*; import java.io.*; public class Server{ private ServerSocket ss; private Socket socket; private BufferedReader in; private PrintWiter out; public Server(){ try{ ss = new ServerSocket(10000); while(true){ socket = ss.accept(); String RemoteIP = socket.getInetAddress().getHostAddress(); String RemotePort = ":"+socket.getInetAddress().getHostAddress(); System.out.println("A client come in IP:"+RemoteIP+RemotePort); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = in.readLine(); } System.out.println("Clientsend is:"+line); 第 页 共 52 页 out = new printWriter(socket.getOutputStream(),true); out.println("Your Message Received!"); out.close(); in.close(); socket.close(); }catch(IOException e){ out.println("wrong"); } } public static void main(String[] args){ new Server(); } } Client端程序: import java.io.*; import java.net.*; public class Client{ Socket socket; BufferedReader in; PrintWriter out; public Clinent(){ try{ System.out.println("Try to Connect to 127.0.0.1:10000"); socket = new Socket("127.0.0.1",10000); System.out.println("The Server Connected!"); System.out.println("Please enter some Character:"); BufferedReader line = new BufferedReader(new inputStreaemReader(System.in)); out =new PrintWriter(socket.getOutputStream(),true); out.println(line.readLine()); in = new BufferedReader(new inputStreaemReader(socket.getInputStream())); System.out.println(in.readLine()); out.close(); in.close(); socket.close(); }catch(IOException e){ out.println("Wrong"); } } public static void main(Srting[] args){ new Client(); } } 201、用JAVA实现一种排序,JAVA类实现序列化的方法(二种)?如在COLLECTION框架中,实现比较要实现什么样的接口? 用插入法进行排序代码如下: import java.util.*; class InsertSort{ ArrayList al; public InsertSort(int num,int mod){ al = new ArryList(num); Random rand = new Random(); System.out.println("The ArryList Sort Before:"); for (int i=0;i它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="include.htm"%>。 205、两种跳转方式分别是什么?有什么区别? 有两种,分别为: 前者页面不会转向include所指的页面,只是显示改页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数,后者完全转向新页面,不会再回来。相当于goto语句。 206、说一说Servlet的生命周期? servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 207、JAVA SERVLET API 中forward()与redirect()的区别? 前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到转跳后的地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样有也有助于隐藏实际的链接。在有些情况下,比如,需要调转到一个其他服务器上的资源,则必须使用sendRedirect()方法。 第 页 共 52 页 208、Servlet的基本构架 public class ServletName extends HttpServlet{ public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException { //... } public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException { //... } } 209、写Jdbc连Oracle的程序,并实现数据查询。 import java.sql.*; public class jdbc{ String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String theUser="admin"; String thepw="manager"; Connection c=null; Statement conn; ResultSet rs=null; public jdbc(){ try{ Class.forName("oracle.jdbc.driver.OracleDriver").newInstnce(); c=DriverManager.getConnection(dbUrl,theUser,thepw); conn=c.createStatement(); }catch(Exception e){ e.printStackTrace(); } } public boolean executeUpdate(String sql){ try{ conn.executeUpdate(sql); return true; }catch(SQLException e){ e.printStackTrace(); return false; } } public ResultSet executeQuery(String sql){ rs=null; try{ rs=conn.executeQuery(sql); }catch(SQLException e){ e.printStackTrace(); } reutrn rs; } public void close(){ try{ conn.close(); c.close(); }catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args){ ResultSet rs; jdbc conn=new jdbc(); rs=conn.executeQuery("select * from test"); try{ while(rs.next()){ System.out.println(rs.getString("id")); System.out.println(rs.getString("name")); } }catch(Exception e){ e.printStackTrace(); } } } 210、Class.formName的作用?为什么? 调用该访问返回一个以字符串指定类名的对象。 211、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 <% int i=1; int numPages=14; String pages=request.getParameter("page"); int currentPage=1; currentPage=(psges==null)?(1):{Integer.parseInt(pages)} sql="select count(*) from tables"; ResultSet rs=DBLink.executeQuery(sql); while(rs.next()) i=rs.getInt(1); int intpsgeCount=1; intpsgeCount=(i%numpages==0)?(i/numpages):(i/numpages+1); int nextpage,uppage; nextpage=currentpage+1; if(nextpage>=intpageCount) nextpage=intpageCount; 第 页 共 52 页 uppage=currentpage-1; if(uppage<=1) uppage=1; rs.close(); sql="select * from tables"; rs=DBLink.executeQuery(sql); i=0; while((i //输出内容,输出翻页连接 合计:<%=currentpage%>/<%=intpageCount%>第一页上一页 <% for(int j=1;j<=intpageCount;j++) { if(currentpage!=j) { %> [<%=j%>] <% }else{ out.println(j); } } %> 下一页最后页 212、你在项目中用到了XML技术的哪些方面?如何实现的? 用到了数据存储,信息配置两方面。在做数据交换平台时将不能数据源的数据组装成XML文件,然后将XML文件压缩打包加密后通过网络传送给接收者,接收解密与解压缩后再同XML文件中还原相关信息进行处理。在做软件配置时,利用XML可以很方便的进行,软件的各种配置参数都存储在XML文件中。 213、用JDOM解析XML文件时如何解决中文问题?如何解析? import java.io.*; public class DOMTest{ private String inFile="c:\\people.xml"; private String outFile="c:\\people.xml"; public static void main(String[] age){ new DOMTest(); } public DOMTest(){ try{ javax.xml.parsers.DocumentBuilder builder = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder(); org.w3c.dom.Document doc=builder.newDocument(); org.w3c.dom.Element root=doc.createElement("老师"); org.w3c.dom.Element wang=doc.createElement("王"); org.w3c.dom.Element liu=doc.createElement("刘"); wang.appendChild(doc.createTextNode("我是王老师")); root.appendChild(wang); doc.appendChild(root); javax.xml.transform.Transformer transformer = javax.xml.transform.TransformerFactory.newInstance().newTransformer(); transformer.setOutputproperty(javax.xml.transformer.OutputKeys.ENCODING,"gb3212"); transformer.setOutputproperty(javax.xml.transformer.OutputKeys.INDENT,"yes"); transformer.transform(new javax.xml.transform.dom.DOMSource(doc), new javax.xml.transform.stream.StreamResult(outFile)); }catch(Exception e){ System.out.println(e.getMessage()); } } } 214、编程用JAVA解析XML的方式 用SAX方式解析XML,XML文件如下: 王小明 信息学院 男,1955年生,博士,95年调入海南大学 第 页 共 52 页 事件调回类SAXHandler.java: import java.util.Hashtable; import org.xml.sax.*; public class SAXHandler extends HandlerBase{ private Hashtable table=new Hashtable(); private String currentElement=null; private String currentValue=null; public Hashtable getTable() { return table; } public void setTable(Hashtable table) { this.table = table; } public void startElement(String tag,AttributeList attrs) throws SAXException{ currentElement=tag; } public void characters(char[] ch,int start,int length) throws SAXException{ currentValue=new String(ch,start,length); } public void endElement(String name) throws SAXException{ if(currentElement.equals(name)) table.put(currentElement, currentValue); } } JSP内容显示源码SaxXml.jsp: <%@ page errorPage=“ErrorPage.jsp” contentType=“text/html;charset=GB2312” %> <%@ page import=“java.io.*, java.util.Hashtable, org.w3c.dom.*, org.xml.sax.*”%> <%@ page import=“javax.xml.parsers.SAXParserFactory, javax.xml.parsers.SAXParser, SAXHandler” %> <% File file=new File(“c://people.xml”); FileReader reader=new FileReader(file); Parser parser; SAXParserFactory spf= SAXParserFactory.newInstance(); SAXParser sp=spf newSAXParser(); SAXHandler handler=new SAXHandler(); sp.parse(new InputSource(reader),handler); Hashtable hashTable= handler.getTable(); out.println(“” +“” out.println(“” +“” out.println(“” +“” out.println(“” +“” out.println(“”); %> 215、EJB2.0有哪些内容?分别在什么场合?EJB2.0和EJB1.1的区别? 规范内容包括BEAN提供者,应用程序装配者,EJB容器,EJB配置工具,EJB服务提供者,系统管理员。这里面,EJB容器是EJB之所以能够运行的核心,EJB容器管理着EJB的的创建,撤消,激活,去活,与数据库的连接等等重要的核心工作。 EJB1.1有会话Bean和实体Bean;EJB2.0比EJB1.1多了一个消息驱动Bean。 216、EJB的基本架构 Remote Interface接口的代码: package Beans; import javax.ejb.EJBObject; 第 页 共 52 页 import java.rmi.RemoteException; public interface Add extends EJBObject{ //some method declare } Home Interface接口的代码: package Beans; import javax.ejb.EJBHome ; import javax.ejb.EJBException ; import java.rmi.RemoteException; public interface AddHome extends EJBHome{ //some method declare } EJB类的代码: package Beans; import javax.ejb. SessionBean import javax.ejb.SessionContext import java.rmi.RemoteException; public interface AddBean extends EJBHome{ //some method declare } 217、如何校验数字型 var re=/^\d{1,8}$|\..\d{1,2}$/; var str=document.form1.all(i).value; var r=str.match(re); if(r==null){ sign=-4; break; }else{ document.form1.all(i).value=parseFloat(str); } 第 页 共 52 页

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档

教师信息表”); out.println(“
姓名
”+(String) hashTable.get(new String(“name”))+ “
学院
”+(String) hashTable. get(new String(“college”))+ “
电话
”+(String) hashTable. get(new String(“telephone”))+ “
备注
”+(String) hashTable. get(new String(“notes”))+ “