java—面试题简答题答案及详解(后50道)

51. 一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他用户。备注:用户表:tb,角色字段为role,主键为id。请写出sql语句。

select count(*) as num,tb.id 

    from  tb,(select role from tb where id=xxx) as t1

       where t1.role and tb.id != t1.id group by tb.id 

    having  num = select count(role) from tb where id=xxx;

 

52.概述MVC体系结构

模型:------Model

代表应用程序状态和业务逻辑。

视图:------View

提供可交互的客户界面,想客户显示模型数据。

控制器:-----Controller

根据客户的请求来操纵模型,并把结果经由视图展现给客户。

 

 

53.JSP如何获取HEML FORM中的数据?用什么方法将数据输出到标准设备中

   配置器

在表单中,action动作和method合起来表示把数据交给mujsp.jsp页面去处理,
jsp页面呢,用
<% request.getParmerter("data");%>获取html页面传递过来的数据,

 

54.面向对象编程有很多重要的特性并简要描述

计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程。面向对象编程就是按现实业务一样的方式将程序代码按一个个对象进行组织和编写,让计算机系统能够识别和理解用对象方式组织和编写的程序代码,这样就可以把现实生活中的业务对象映射到计算机系统中。

面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征。

1封装:

封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。

例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪个对象呢?由于画圆需要使用到圆心和半径,圆心和半径显然是圆的属性,如果将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径这两个属性,人以后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不应该分配在人这个对象上,这就是面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。一个更便于理解的例子就是,司机将火车刹住了,刹车的动作是分配给司机,还是分配给火车,显然,应该分配给火车,因为司机自身是不可能有那么大的力气将一个火车给停下来的,只有火车自己才能完成这一动作,火车需要调用内部的离合器和刹车片等多个器件协作才能完成刹车这个动作,司机刹车的过程只是给火车发了一个消息,通知火车要执行刹车动作而已。

 

抽象:

抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person类,如下:

class Person{

String name;

int age;

}

人本来是很复杂的事物,有很多方面,但因为当前系统只需要了解人的姓名和年龄,所以上面定义的类中只包含姓名和年龄这两个属性,这就是一种抽像,使用抽象可以避免考虑一些与目标无关的细节。我对抽象的理解就是不要用显微镜去看一个事物的所有方面,这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统需要什么,就只考虑什么。

 

继承:

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。

 

多态:

多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。例如,下面代码中的UserDao是一个接口,它定义引用变量userDao指向的实例对象由daofactory.getDao()在执行的时候返回,有时候指向的是UserJdbcDao这个实现,有时候指向的是UserHibernateDao这个实现,这样,不用修改源代码,就可以改变userDao指向的具体类实现,从而导致userDao.insertUser()方法调用的具体代码也随之改变,即有时候调用的是UserJdbcDaoinsertUser方法,有时候调用的是UserHibernateDaoinsertUser方法:

UserDao userDao = daofactory.getDao();  

userDao.insertUser(user);

 

比喻:人吃饭,你看到的是左手,还是右手

55.java中的方法覆盖Overriding)和方法重载(Overloading)是什么意思?

Overload是重载的意思,Override是覆盖的意思,也就是重写。
重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。
至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。 

 

56.Java语言支持的8中基本数据类型是?什么是值传递和引用传递

Int ,short, long ,float ,double ,byte,char,boolean

值传递传递的是变量的值,引用传递传递的是对象的地址

 

57. Java集合类框架的基本接口有哪些?

1.Collection:代表一组对象,每一个对象都是它的子元素。
2、Set:不包含重复元素的Collection。
3、List:有顺序的collection,并且可以包含重复元素。
4、Map:可以把键(key)映射到值(value)的对象,键不能重复。

 

58.进程和线程的区别是什么创建线程有几种不同的方式概括的解释下线程的几种可用状态

进程与线程的区别

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体, CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序 健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

 

Java中创建线程主要有三种方式:

一、继承Thread类创建线程类

1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

2)创建Thread子类的实例,即创建了线程对象。

3)调用线程对象的start()方法来启动该线程。

二、通过Runnable接口创建线程类

1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

2)创建 Runnable实现类的实例,并依此实例作为Threadtarget来创建Thread对象,该Thread对象才是真正的线程对象。

3)调用线程对象的start()方法来启动该线程。

三、通过CallableFuture创建线程

1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象该FutureTask对象封装了该Callable对象的call()方法的返回值。

3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

线程在执行过程中,可以处于下面几种状态:

1、就绪(Runnable):线程准备运行,不一定立马就能开始执行。

2、运行中(Running):进程正在执行线程的代码。

3、等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

4、睡眠中(Sleeping):线程被强制睡眠。

5I/O阻塞(BlockedonI/O):等待I/O操作完成。

6、同步阻塞(BlockedonSynchronization):等待获取锁。

7、死亡(Dead):线程完成了执行。

59.分析题假设现有一个新功能用户点击一个按钮后就会自动发送一封邮件到用户的邮箱现在用户反映没有收到邮件你怎么去发现并解决问题

 

1.检查是否联网;用户邮箱是否设置了该邮箱地址不接收;用户邮箱是否已满;该功能是否有发送邮件功能
2.检查该邮箱地址是否合法是否正确
3.双方服务器是否可以收发邮件
4.给不同类型邮箱用户的-发送邮件,收到A,并未收到B
5.给同一类型邮箱用户的发送邮件,收到C,并未收到D
6.其他测试邮箱给该用户邮箱发送邮件,收到E,未收到F
判断结果:ACE==》该用户邮箱收不到邮件
B==>不可以给其他类型邮箱发送邮件
ACF==>该用户邮箱无收邮件的功能
ADE==>不可以给同类型发
ADF==>该用户同类型邮箱不接收邮件 

 

60.<action name=Slpzdyclass=com.cnnct.smsl.SlpzdyActionmethod={1}>

<result>index.ftl</result>

</action>

请依次解释上述struts配置中,各元素属性意义

Name class method result

Nameaction的名称可以任意,但是必须唯一,classaction的类名称 {}是通配符

result元素主要定义视图的跳转和返回的行为及类型

 

61.试分析基本数据类型和引用数据类型的基本特点

   概念上:基本数据类型变量名指向具体的数值

           引用数据类型变量名指向存数据对象的内存地址,即变量名指向hash值。

   内存构建上:基本数据类型变量在声明之后java就会立刻分配给他内存空间

               引用数据类型以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。

   使用上:基本数据类型使用时需要赋具体值,判断时使用“==”号

           引用数据类型使用时可以赋null,判断时使用equals方法

 

62.请简单说明什么是“依赖注入”

依赖注入就是Spring设计思想中重要的一部分,它是指IocDI,是一个重要的面向对象编程的法则来削减计算机程序的耦合问题.控制反转还有一个名字叫做依赖注入(Dependency Injection.简称DI.

DI(Dependentcy Injection)——IOC的另一种表达方式:即组件以一些预先定义好的方式(例如:setter方法)接受来自如容器的资源注入,相对于IOC而言,这种表述更加直接。

 

63.Abstract class  interface有什么区别

1.抽象类可以有构造方法,接口中不能有构造方法。

2.抽象类中可以有普通成员变量,接口中没有普通成员变量

3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然

eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

5. 抽象类中可以包含静态方法,接口中不能包含静态方法

6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

7. 一个类可以实现多个接口,但只能继承一个抽象类。

应用方面:

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码

64.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类时候可继承实体类?是否可以继续继承String类?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

String类是final类故不可以继承。

 

65.Sleep()和wait()有什么区别?

   .功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩。还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.

   .sleepThread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行。waitObject的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者

 

66.什么是BS架构什么是CS架构

CSClient/Server):客户端----服务器结构。C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。因为客户端要负责绝大多数的业务逻辑和UI展示,又称为胖客户端。它充分利用两端硬件,将任务分配到Client Server两端,降低了系统的通讯开销。C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。

C/S 架构是一种典型的两层架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。

BSBrowser/Server):浏览器----服务器结构,是目前应用系统的发展方向。BS是伴随着Internet技术的兴起,对C/S架构的改进,为了区别于传统的C/S 模式,特意称为B/S模式。在这种结构下,通过W3浏览器来进入工作界面,极少部分事务逻辑在前端(Browser)实现,主要事务逻辑在服务器端(Server)实现,形成三层(3-tier)结构。这样使得客户端电脑负荷大大简化(因此被称为瘦客户端),减轻了系统维护、升级的支出成本,降低了用户的总体成本(TCO)。

BS的主要特点是分布性强、维护方便、开发简单且共享性强、总体拥有成本低。但数据安全性问题、对服务器要求过高、数据传输速度慢、软件的个性化特点明显降低,难以实现传统模式下的特殊功能要求。它是瘦客户端,对大量的数据输入以及报表的应答等都需要通过浏览器与服务器进行交互,通信开销大,而且对于实现复杂的应用构造有较大的困难。

67.你接触过哪些框架

 

首先力推struts2框架,这是最经典的框架(可以说没有“之一”)。可以帮你快速搭建出一个MVC模型出来。(注:struts1已经很少用了,且问题也很多,强烈推荐使用struts2).

2.Spring框架,这是排行第二的框架(我个人排得,非权威),这个框架出彩的地方就在于它的“依赖注入”和“控制反转”。简单的说,就是在程序运行的时候才将参数注入到容器里。

3.持久层框架选HibernateIbatisHibernate自动化能力强,开发大型应用可以节约开发时间,ibatis小巧简洁,灵活。

4.Jquery是继prototype之后又一个优秀的Javacript框架,封装了很多javascript方法,是开发jsp用的框架,目前很流行

一般开发,都是使用Struts2+Spring+Hibernate(ibatis)整合,前端用jquery或者其他类似框架。对于简单的系统,有时用Spring MVC一个框架即可。

 

68.Hibernate中你使用过哪些关联映射配置?

一主键单向关联

 一对多外键单向关联

 一对对一外键单向关联

 一对一多连接表单向关联

 多对一外键单向关联

 多对一连接表单向关联

 多对多单向关联

双向关联

 一对一外键双向关联

 一对一主键双向关联

 一对一连接表双向关联

 一对多外键双向关联

 一对多连接表双向关联

 多对多双向关联

69.请简述你对AOP的理解?

AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。

70.谈一谈SpringMVC的工作原理

1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.

 

2DipatcherServlet接收到这个请求之后将根据请求的信息(包括URLHttp方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。

 

3-4DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给HandlerHandler将具体的处理进行封装),再由具体的HandlerAdapterHandler进行具体的调用。

 

5Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet

 

6Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View

 

7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

71. Springmvc的常用注解

 

@Controller

@Component
@RequestMapping
@Resource和@Autowired

@PathVariable

@ResponseBody

@RestController

72.StringStringBufferStringBuilder的区别是什么?String为什么是不可变的

String是字符串常量,是不可变的对象

StringBuilderStringBuffer都继承自AbstractStringBuilder类。这两种对象都是可变的

StringBuilder (没同步锁,不安全,所以最快)

StringBuffer(有同步锁,安全)

String(不可变性,安全)

单线程下操作字符串缓冲区,选择StringBuilder最快;

多线程下操作字符串缓冲区,选择StringBuffer最好;

如果是少量数据,用String就够了;

valueoffsetcount这三个变量都是private的,并且没有提供setValuesetOffsetsetCount等公共方法来修改这些值,所以在String类的外部无法修改String。也就是说一旦初始化就不能修改, 并且在String类的外部不能访问这三个成员。此外,valueoffsetcount这三个变量都是final的, 也就是说在String类内部,一旦这三个值初始化了, 也不能被改变。所以可以认为String对象是不可变的了。

 

73.GET,POST区别

.表单:GET与POST方法的区别

  1. get是从服务器上获取数据,post是向服务器传送数据。

  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

  3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

  4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

  5. get安全性非常低,post安全性较高。

 

.HTTP请求:GET与POST方法的区别

HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解);

FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;

GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

 

74.反射讲一讲主要概念都在哪需要反射机制反射的性能如何优化

反射就是知道了类,通过方法获得这个类里面的方法、属性等等信息。

反射的作用:在运行的时判定任意一个对象所属的类;运行时,构造任意一个类的对象;运行时,判定一个类所属的成员变量和方法;在运行时调用任意的一个方法;生成动态代理;

75.Spring的理解项目中都用什么怎么用的IOCAOP的理解以及实现原理

Springmvc 采用MVC分层模式,用注释注入

springIOC容器能够帮我们自动new对象,对象交给spring管之后我们不用自己手动去new对象了,也就是控制权的转让。

spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。

我们一般都不直接用BeanFactory,而是用它的实现类 ApplicationContext ,这个类会自动解析我们配置的applicationContext.xml

AOP:面向切面编程。(Aspect-Oriented Programming

AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。

 

76.线程同步,并发操作怎么控制

1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。

2、互斥量:为协调共同对一个共享资源的单独访问而设计的。

3、信号量:为控制一个具有有限数量用户资源而设计。

4、 :用来通知线程有一些事件已发生,从而启动后继任务的开始。

77.ClassforName作用

返回与给定的字符串名称相关联类或接口的Class对象。

78.进程和线程的区别是什么

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体, CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序 健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

79.创建线程有几种不同的方式你喜欢哪一种为什么

①继承Thread类(真正意义上的线程类),是Runnable接口的实现。

②实现Runnable接口,并重写里面的run方法。

③使用Executor框架创建线程池。Executor框架是juc里提供的线程池的实现。

调用线程的start():启动此线程;调用相应的run()方法

继承于Thread类的线程类,可以直接调用start方法启动线程(使用static也可以实现资源共享).一个线程(对象)只能够执行一次start(),而且不能通过Thread实现类对象的run()去启动一个线程。

实现Runnable接口的类需要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。

线程的使用的话,注意锁和同步的使用。(多线程访问共享资源容易出现线程安全问题)

80.Java集合类框架的基本接口有哪些

1.Collection:代表一组对象,每一个对象都是它的子元素。

2Set:不包含重复元素的Collection

3List:有顺序的collection,并且可以包含重复元素。

4Map:可以把键(key)映射到值(value)的对象

81.数据连接池的工作机制是什么?

连接池的实现是以空间换时间。

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

82.Java中的流分类都有哪些

流的分类

按照流向划分:输入流,输出流

按照处理数据单元划分:字节流(字节输入流,字节输出流),字符流(字符输入流,字符输出流)

字节流:以字节为数据单位来处理的流(Byte8位)

字符流:以字符为数据单位来处理的流(Char16位)

流的基类:

按照处理数据单元划分:字节流(字节输入流InputStream基类,字节输出流OutputStream基类),字符流(字符输入流Reader基类,字符输出流Writer基类)

 * 输入流:以InputStream(字节输入流)和Reader(字符输入流)为基类

 * 输出流:以OutputStream(字节输入流)和Writer(字符输出流)为基类

 

字节流类

抽象父类: InputStream,OutputStream

实现类包括如下几种:

BufferedInputStream 缓冲流-过虑流
BufferedOutputStream
ByteArrayInputStream 字节数组流-节点流
ByteArrayOutputStream
DataInputStream 处理JAVA标准数据流-过虑流
DataOutputStream
FileInputStream 处理文件IO流-节点流
FileOutputStream
FilterInputStream 实现过虑流-字节过虑流父类
FilterOutputStream
PipedInputStream 管道流
PipedOutputStream
PrintStream 包含print() 和 println()
RandomAccessFile 支持随机文件

字符流

抽象父类:Reader, Writer

实现类:
Java中流的分类都有哪些?

BufferedReader
BufferedWriter
PrintWriter
CharArrayReader
CharArrayWriter
FileReader
FileWriter
FilterReader
FilterWriter
InputStreamReader
OutputStreamWriter
PipedReader
PipedWriter
StringReader
StringWriter

83. 面向对象的特征

继承封装多态

84.浏览器和Servlet通信使用的是什么协议

http协议

 HTTP全称是HyperText Transfer Protocal,即:超文本传输协议,从1990年开始就在WWW上广泛应用,是现今在WWW上应用最多的协议,    Http是应用层协议,当你上网浏览网页的时候,浏览器和Web服务器之间就会通过HTTPInternet上进行数据的发送和接收。Http是一个基于请求/响应模式的、无状态的协议。即我们通常所说的Request/Response

85.Java网络编程

TCP/IP协议的四层模型,从底层到高层分别是:网络接口层、网络层、传输层、应用层。IP属于网络层,TCP/UDP属于传输层。IP定位对方的主机名,端口号对应接受数据的应用程序。

UDP:将数据及源和目的封装成数据包,不需要建立连接;每个数据包的大小限制在64k内;因无连接,是不可靠协议;速度快。

TCP:建立连接,形成传输数据的通道;在连接中进行大量数据传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率稍低。

Socket:网络之间的通信其实就是Socket之间的通信,Socket之间通过IO进行传输。

DatagramSocketUDP使用的Socket接口,是本地的接口;发送、接受的单位为DatagramPacket。注意:这里DatagramPacket里面有get/setPort的操作,其中set为设置此包的目的端口号,而get有两种情况,一种是未发送的时候得到刚才set的端口号,一种是在接收端得到发送端的Socket的端口号(发送端DatagramePacket的设置的端口号)。所以getPortPacket的得到Port的方法,而getLocalPortSocket得到Port的方法。

86.Thread类中的start()和run()方法有什么区别?

1start

start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

2run

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.

87. Spring由哪几个模块组成

Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。 

 

88.Jsp常用的动作

       <jsp:useBean>:定义jsp页面使用一个JavaBean实例;

       <jsp:setProperty>:设置一个JavaBean中的属性值;

       <jsp:getProperty>:JavaBean中获取一个属性值;

       <jsp:include>:JSP页面包含一个外在文件;

       <jsp:forward>:把到达的请求转发另一个页面进行处理;

       <jsp:param>:用于传递参数值;

       <jsp:plugin>:用于指定在客户浏览器中插入插件的属性;

       <jsp:params>:用于向HTML页面的插件传递参数值;

       <jsp:fallback>:指定如何处理客户端不支持插件运行的情况;

89. Java中的volatile关键字的作用?

volatile 关键字作用是,使系统中所有线程对该关键字修饰的变量共享可见,可以禁止线程的工作内存对volatile修饰的变量进行缓存。

90.线程之间如何进行通信

当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。Object类中wait()notify()notifyAll()方法可以用于线程间通信关于资源的锁的状态。

wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。

notify()方法应该是被拥有对象的锁的线程所调用。

notify()方法会唤醒一个等待当前对象的锁的线程。

wait()notify()方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。

91.为什么wait(),notify(),notifyAll()等方法是放在Object类中的而不是放在Thread类中的?

1wait()notify()notifyAll()方法是本地方法,并且为final方法,无法被重写。

2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)

3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;

Thread类中的sleep方法使当前线程暂停执行一段时间,从而让其他线程有机会继续执行,但它并不释放对象锁);

notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。

同样地,调用某个对象的notify()方法,当前线程也必须拥有这个对象的monitor,因此调用notify()方法必须在同步块或者同步方法中进行(synchronized块或者synchronized方法)。

nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,这一点与notify()方法是不同的。

92.简要阐述java BI0NI0的原理和区别,如果可以的话选择其中一种简单实现客户端啊、服务端程序

通信模式BIO,即阻塞IO,同步调用,性能低:

Acceptor接受客户端请求后,不再独立启动线程来处理,而是将客户请求交给线程池来处理,

从而减少线程的创建数量,提高线程利用率,增加服务器的处理能力;

异步IONIO模型

93.解释同步和异步,阻塞和非阻塞的区别:并从以下四种IO模型中任选一种阐述其原理。同步阻塞IO、同步非阻塞IOIO多路复用、异步IO的原理。

同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。阻塞是使用同步机制的结果,非阻塞则是使用异步机制的结果。

同步阻塞IO:网络通信中对于多客户端的连入,服务器端总是与客户端数量一致的线程去处理每个客户端任务,即,客户端与线程数1:1,并且进行读写操作室阻塞的,当有你成千上完的客户端进行连接,就导致服务器不断的建立新的线程,最后导致低通资源不足,后面的客户端不能连接服务器,并且连接入的客户端并不是总是在于服务器进行交互,很可能就只是占用着资源而已。

 

94.请结合自身实际工作情况说出三点与java代码性能优化有关的案例

http://www.importnew.com/16181.html

避免使用正则表达式

正则表达式给人的印象是快捷简便。但是在 N.O.P.E 分支中使用正则表达式将是最糟糕的决定。如果万不得已非要在计算密集型代码中使用正则表达式的话,至少要将 Pattern 缓存下来,避免反复编译Pattern。不要使用iterator()方法这条建议不适用于一般的场合,仅适用于在 N.O.P.E 分支深处的场景。尽管如此也应该有所了解。Java 5格式的循环写法非常的方便,以至于我们可以忘记内部的循环方法

使用原始类型和栈

上面介绍了来自 jOOQ的例子中使用了大量的泛型,导致的结果是使用了 byteshortint long 的包装类。但至少泛型在Java 10或者Valhalla项目中被专门化之前,不应该成为代码的限制。

性能优化:

1、使用StringBuilder

2、、避免使用正则表达式

3、不要使用iterator()方法

4、不要调用高开销方法

5、使用原始类型和栈

6、、避免递归

7、使用entrySet()

8、使用EnumSetEnumMap

9、优化自定义hasCode()方法和equals()方法

10、考虑使用set而并非单个元素

95. 如何优化网页加载速度

 

1.合并Js文件和CSS

 

JS代码和CSS样式分别合并到一个共享的文件,这样不仅能简化代码,而且在执行JS文件的时候,如果JS文件比较多,就需要进行多次“Get”请求,延长加载速度,将JS文件合并在一起后,自然就减少了Get请求次数,提高了加载速度。

 

2、Sprites图片技术

 

Spriting是一种网页图片应用处理方式,它是将一个页面涉及到的所有零星图片都包含到一张大图中去,然后利用CSS技术展现出来。这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢慢显示出来了,可以减少了整个网页的图片大小,并且利用CSSSprites能很好地减少网页的http请求,从而大大的提高页面的性能。CSSSprites在国内很多人叫css精灵,很早就有了,在很多大型网站都有用到,特别是一些所有页面都存在的图标用得比较多,很好的提升加载速度。

 

3、压缩文本和图片

 

压缩技术如gzip可以有效减少页面加载的时间。包括HTML,XML,JSON(JavaScript对象符号),JavaScript和CSS等,压缩率都可以在大小70%左右。文本压缩用得比较多,一般直接在空间开启就行,而图片的压缩就比较随意,很多都是直接上传,其实还有很大的压缩空间。

 

4、延迟显示可见区域外的内容

 

为了确保用户可以更快地看见可见区域的网页可以延迟加载或展现可见区域外的内容,为了避免页面变形,可以使用占位符标签制定正确的高度和宽度。比如WP的jQueryImage LazyLoad插件就可以在用户停留在第一屏的时候,不加载任何第一屏以下的图片信息,只有当用户把鼠标往下滚动的时候,这些图片才开始加载。这样很明显提升可见区域的加载速度,提高用户体验。

 

5、确保功能图片优先加载

 

网站主要考虑可用性的重要性,一个功能按钮要提前加载出来,用户进入下载页,一个只需要8s时间的下载花了5s在等待、寻找下载按钮图片,谁能忍受?

 

6、重新布置Call-to-Action按钮

 

其实这个和上面一条是差不多的,都是从用户体验速度着手,跳过了网页的整体加载速度。速度没变,只是让一些行为按钮提前,Call-to-Action按钮一般习惯设计在页面底部,这样的习惯对于用户来说并不总是好的,购买用户需要等到最下面加载出来才能点击下一步操作。可以调整CTA按钮的位置或使用滑动的图片按钮。很多大型购物网站的加入购物车就是这种类型。

 

7、图片格式优化

 

不恰当的图像格式是一种极为常见的减慢加载速度的罪魁祸首。正确的图片格式可以让图片缩小数倍,如果保存为最佳格式。可以节省大量带宽,减少处理时间时间,大大加快页面加载速度,这是一种很常见的做法。

 

8、使用 Progressive JPEGs

 

ProgressiveJPEGs图片是JPEG格式的一个特殊变种,名为“高级JPEG”。在创建高级JPEG文件时,数据是这样安排的:在装入图像时,开始只显示一个模糊的图像,随着数据的装入,图像逐步变得清晰。它相当于交织的GIF格式的图片。高级JPEG主要是考虑到使用调制解调器的慢速网络而设计的,快速网络的使用者通常不会体会到它和正常JPEG格式图片的区别。对于网速比较慢的用户,这无疑有很好的体验。

 

9、精简代码

 

这个可以说是最直接的一个方法,也是用得比较多的,对网页代码进行瘦身,删除不必要的沉冗代码,比如不必要的空格、换行符、注释等,包括JS代码中的无用代码也需要清除。其中对于注释代码的清除可能有些人存在误区,甚至有的在里面堆砌关键词。

 

10、延迟加载和执行非必要脚本

 

网页中有很多脚本是在页面完全加载完前都不需要执行的,可以延迟加载和执行非必要脚本。这些脚本可以在onload事件之后执行,避免对网页上重要内容的呈现造成影响。这些脚本可能是你自己网页的甲苯,往往更多的是一些第三方脚本,这样的有很多,比如评论、广告、智能推荐、百度云图、分享等等,这些完全可以等主体内容加载完后再执行。

 

11、使用AJAX

 

AJAX即“Asynchronous Javascript +XML“,是指一种创建交互式网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用AJAX)如果需要更新内容,必须重载整个网页面。

 

12、自动化的页面性能优化

 

自动化的页面性能优化也就是借助工具了,网站提速工具有很多.

 

96.简述jsp获取requestsession对象的方式,至少二种

1.GetAtrribute方法:现在servlet中使用setAtrribute方法获取到该对象,再在JSP中用GetAtrribute方法得到该对象

2.El表达式获取

 

97.Struts2中,#@$的用法

.#”主要有三种用途:  1. 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext()2.于过滤和投影(projecting)集合;3.用来构造Map

二.%符号的用途是在标志的属性为字符串类型时,转换为计算OGNL表达式的值。

三.$符号的用途是在Struts 2框架的配置文件中引用OGNL表达式。

 

98.描述一下javaHashtableHashMap的区别,你还用过哪些集合类,各自有什么有点和缺点

HashMapHashtable的区别

 

HashMapHashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

 

HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)

HashMap是非synchronized,而Hashtablesynchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

另一个区别是HashMap的迭代器(Iterator)fail-fast迭代器,而Hashtableenumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是EnumerationIterator的区别。

由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable

HashMap不能保证随着时间的推移Map中的元素次序是不变的。

Collection接口存储一组不唯一,无序对象

List接口存储一组不唯一,有序(插入顺序)的对象

Set接口存储一组唯一,无序的对象

Map接口存储一组键值对象,提供key(键)到value(值)的映射

Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection子接口ListSet
  所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个 Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection
  如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
  由Collection接口派生的两个接口是ListSet

List接口
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
  除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
  实现List接口的常用类有LinkedListArrayListVectorStack

Set接口
Set是一种不包含重复的元素的Collection,即任意的两个元素e1e2都有e1.equals(e2)=falseSet最多有一个null元素。
  很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
  请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。

Map接口
  请注意,Map没有继承Collection接口,Map提供keyvalue的映射。一个Map中不能包含相同的key,每个key只能映射一个 valueMap接口提供3种集合的视图,Map的内容可以被当作一组key集合一组value集合,或者一组key-value映射

99.解释以下修饰符:public,protected,private,finalstatic分别用于class,variable。Function时的含义

  public(公共访问权限):这是一个宽松的访问控制级别,如果一个成员(包括成员变量、方法和构造器等)或者一个外部类使用public访问控制符修饰,那么这个成员或外部类就可以被所有类(注:在该类外部,若是类成员,则需要类调用成员或外部类;若是非static的类,则应先实例化后,对象对其调用)访问,不管访问类和被访问类是否处于同一个包中,是否具有父子继承关系。

 

    private(当前类访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问。很显然,这个访问控制符用于修饰成员变量最合适,使用它来修饰成员变量就可以把成员变量隐藏在该类内部。

 

    protected(子类访问权限):如果一个成员(包括成员变量、方法和构造器等)使用protected访问控制符修饰,那么这个成员既可以被同一个包中的其他类访问,也可以被不同包中的子类访问。在通常情况下,如果使用protected来修饰一个方法,通常是希望其子类来重写这个方法。

 

    default(包访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)或者一个外部类不使用任何访问控制符修饰,就称它是包访问权限,default访问控制的成员或外部类可以被相同包下的其他类访问。

 

final:可用于修饰类、变量和方法,用于表示它修饰的类、方法和变量不可改变。

 static:它的真正作用就是区分成员变量、方法、内部类、初始化块这四种成员到底属于类本身还是属于实例。在类中定义的成员,static相当于一个标志,有static修饰的成员属于类本身,没有static修饰的成员属于该类的实例。

    静态初始化块:如果定义初始化块时使用了static修饰符,则这个初始化块变成了静态初始化块,也被称为类初始化块。类初始化块是类相关的,系统将在初始化阶段执行静态初始化块,而不是创建对象时才执行。因此静态初始化块比普通初始化块先执行。

100.J2EE是什么,核心是什么

J2EE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持。

核心:

一、JDBC(Java Database Connectivity)

      JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDBC对数据库的访问也具有平台无关性。

二、JNDI(Java Name and Directory Interface)

JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNSLDAP,本地文件系统,或应用服务器中的对象。

 

三、EJB(Enterprise JavaBean)

 

J2EE技术之所以赢得媒体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑,由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务,例如目录服务、事务管理、安全性、资源缓冲池以及容错性。但这里值得注意的是,EJB并不是实现J2EE的唯一途径。正是由于J2EE的开放性,使得有的厂商能够以一种和EJB平行的方式来达到同样的目的。

四、RMI(Remote Method Invoke)

  调用远程对象上的方法。它使用了序列化方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更底层的协议。

五、Java IDL/CORBA

  在Java IDL的支持下,开发人员可以将JavaCORBA集成在一起。他们可以创建Java对象并使之可在CORBA ORB中展开,或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径,通过它Java可以被用于将你的新的应用和旧的系统相集成。

六、JSP(Java Server Pages)

JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。

七、Java Servlet

Servlet是一种小型的Java程序,它扩展了Web服务器的功能。作为一种服务器端的应用,当被请求时开始执行,这和CGI Perl脚本很相似。Servlet提供的功能大多与JSP类似,不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码,而servlets全部由Java写成并且生成HTML

八、XML(Extensible Markup Language)

XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。

XML的发展和Java是相互独立的,但是,它和Java具有的相同目标正是平台独立性。通过将JavaXML的组合,您可以得到一个完美的具有平台独立性的解决方案。

九、JMS(Java Message Service)

 

JMS是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域,又支持发布/订阅(publish/subscribe)类型的域,并且提供对下列类型的支持:经认可的消息传递,事务型消息的传递,一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与旧的后台系统相集成。

十、JTA(Java Transaction Architecture)

JTA定义了一种标准的API,应用系统由此可以访问各种事务监控。

十一、JTS(Java Transaction Service)

JTSCORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范,并且在较底层实现OMG OTS specificationJava映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。

十二、JavaMail

JavaMail是用于存取邮件服务器的API,它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器,也支持IMAP服务器。

十三、JAF(JavaBeans Activation Framework)

JavaMail利用JAF来处理MIME编码的邮件附件。MIME的字节流可以被转换成Java对象,或者转换自Java对象。大多数应用都可以不需要直接使用JAF

 

 

猜你喜欢

转载自blog.csdn.net/lpdfight/article/details/78198787
今日推荐