版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java面试题面向对象的特征有那些?三大特征就是(继承、封装、多态性)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分的注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以冲现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。封装:封装就是把过程和数据包围起来,对数据的访问只能通过已定义的界面,面向对象计数始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。多态性:是指允许不同的类的对象对同一消息做出响应。多态性包括参数化多态性和包含多态性。多态性语音具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名的问题。String是基本的数据类型吗?Java的基本数据类型包括byte、int、char、long、float、double和short。java.lang.String类是final类型的,因此不能继承和修改这个类,为了提高效率节省空间,我们应该使用StringBuffer类。基本数据类型及转换char16-bitUnicode0Unicode216-1Characterbyte8-bit-128+127Byteshort16-bit-215+215-1Shortint32-bit-231+321-1Integerlong64-bit-263+263-1Longfloat32-bitIEEE754IEEE754Floatdouble64-bitIEEE754IEEE754DoubleString和StringBuffer,StringBuild的区别。String和StringBuffer,它们可以存储和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串,而这个StringBuffer类提供的字符串可以进行修改,可以使用这个StringBuffer来动态构造字符数据。StringBuild是jdk1.5后用来替换StringBuffer的一个类,大多数时候可以替换StringBuffer。和StringBuffer的区别在于StringBuild是一个单线程使用的类,不执行线程,同步所以比StringBuffer速度快,效率高,是非线程安全的。说出ArrayList,Vector,LinkedList的存储性能和特性ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后即可,所以插入速度较快。HashMap和HashTable的区别。HashMap是HashTable的轻量级实现(非线程安全的实现),它们走完成了Map接口。HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于HashTable。HashMap允许将null作为一个entry的key或者value,HashTable不允许。HashMap把HashTable的contains方法去掉了,改成containsKey和containsVaule。因为contains方法容易让人误会。HashTable继承自Dictionary类,而HashMap是java1.2引进的Mapinterface的一个实现。HashTable的方法是Synchronize的,而HashMap的不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。final,finally,finalize的区别final-修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用过程中不被改变。被声明为final变量必须在声明时给定初值,而在以后的引用中只能读取,不能修改。被声明为final的方法也是只能使用,不能重载。finally-在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。finalize-方法名。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。Overlord和Override的区别。Overlorded的方法是否可以改变返回值的类型?方法重写overriding和重载overlording是Java多态性的不同表现。重写overriding是父类与子类之间多态性的一种表现:如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写了。如子类的对象使用这个方法时,将调用子类中定义的,对它而言,父类中的方法如同被屏蔽了。重载overlording是一个类中多态性的一种表现:如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,这样称为方法的重载。Overlorded是可以改变返回值的类型的。abstractclass和interface有什么区别?抽象类:抽象类是特殊的类,只是不能被实例化;除此之外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明在抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。接口:接口是应用类型的,类似于类,更和抽象类有所相似,以至于很多人对抽象类和接口的区别比较模糊,接口除了可以包含方法外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但是只能继承一个类(包括抽象类)。抽象类与接口的相似之处不能实例化;包含未实现的方法声明;派生类必须实现未实现的方法,抽象类是抽象方法,接口的所有成员。抽象类与接口的区别接口可以多重继承,抽象类不可以;接口定义方法,不给实现,抽象类可以实现部分方法;接口中基本数据类型的数据成员,都默认为static和final的,抽象类则不是;如果事先知道某种东西会成为基础类,那么第一选择就是把它变成一个接口;只有在必须使用方法定义或者成员变量的时候,才考虑抽象类。shorts1=1;s1=s1+1;有什么错?shorts1=1;s1+=1;有什么错?shorts1=1;s1=s1+1;(s1+1是int类型的,需要进行强制转换)shorts1=1;s1+=1;(可以正确运行)Math.round(11.5)等于多少?Math.round(-11.5)等于多少?Math.round(11.5)=12;Math.round(-11.5)=-11;Round方法返回与参数最近的长整数,参数加1/2后求其float。Strings=newString(“xyz”);创建了几个Stringobject?Java有没有goto?创建了两个对象,一个是“syz”,一个是指向“syz”的引用对象s。goto是Java中的保留字,现在没有在java中使用。启动一个线程是用run()还是start()?启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以有JVM调度并执行。这并不意味着线程就好立即运行,run()方法可以产生必须退出的标志来停止一个线程。JVM是什么?JVM是Java虚拟机,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行,使用JVM就是为了支持与操作系统无关,实现跨平台。JVM的原理:JVM是Java的核心和基础,在java编译器和OS平台之间的虚拟处理器,它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。JVM执行程序的过程加载.class文件;管理并分配内存;c)执行垃圾收集;d)JRE(java运行时环境)由JVM构造的java程序的运行环境,也是java程序的 运行环境,但是它同时一个操作系统的一个应用程序一个进程,因此它也有它 自己的生命周期,也有自己的代码和数据空间。JVM在整个jdk中处于最底层, 负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环 境,因此也就是虚拟计算机。操作系统装入JVM是通过jdk中的Java.exe来完 成,通过下面4步来完成JVM环境:(1、创建JVM装载环境和配置;2、装载` JVM.dll;3、初始化JVM.dll并挂界到jnienv(jni调用接口)实例;4、调用 jnienv实例装载并处理class类)。JVM的声明周期JVM实例对应了一个独立运行的java程序,它是进程级别a)启动:启动一个java程序时,一个JVM实例就产生了,任何一个拥有publicstaticvoidmain(String[]args)函数的class都可以作为JVM实例运行的起点。b)运行:main()作为该程序初始线程的起点,任何其他线程都由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以表明自己创建的线程是守护线程。c)消亡:当程序中的所有非守护线程都终止时;JVM才退出,若安全管理器允许,程序也可以使用Runtime类或者使用System.exit();来退出。JVM执行引擎实例则对应了属于用户运行程序的线程它是线程级别的。应用服务器都有哪些?BEAWebLogicServer、IBMWebSphereApplicationServer、Oracle9iApplicationServer、jBoss、Tomcat。Tomcat下部署项目在Tomcat中部署Javaweb应用程序有两种方式:静态部署和动态部署。静态部署:静态部署指的是我们在服务器启动之前部署我们的程序,只有在启动服务器之后,我们的web应用程序才能访问。动态部署:动态部署是指可以在启动服务器之后部署web应用程序,而不用重新启动服务器。heap和stack有什么区别?栈是一种线性集合,栈按照后进先出的方式进行处理第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。第四,面向对象方式的程序与以前结构化的程序在执行上没有任何区别。但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思考。当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中,而对象的行为(方法),就是运行逻辑,放在栈中。我们编写对象的时候,其实即编写了数据结构,也编写了处理数据的逻辑。forward和redirect的区别?forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪来的,所以它的地址栏中还是原来的地址。redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?使用iterator()方法来区分重复与否。equals()是判断两个set是否相等。equals()和==方法决定引用值是否指向同一对象,equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。说出数据连接池的工作机制是什么?J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数据由配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。Java中的异常处理机制的简单原理和应用当Java程序违反了Java的语义规则时,Java虚拟机就会将发生的错误表示为一个异常。违反语义规则包括两种情况。一种是Java类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;方法null的对象时会引发NullPointerException。另一种情况就是Java允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。sleep()和wait()有什么区别?sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后,本线程才进入对象锁定池准备获得对象锁进入运行状态。sleep()方法是使线程停止一段时间的方法。在sleep时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级;(b)正在运行的线程因为其它原因而阻塞。wait()是线程交互时,如果线程对一个同步对象x发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。java中实现多线程的方法及其方法的作用interrupt():中断线程。join():等待该线程终止。join(longmillis):等待该线程终止的时间最长为milli毫秒。run():如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,该方法不执行任何操作并返回。setPriority(intnewPriority):更改线程的优先级。start():使该线程开始执行,Java虚拟机调用该线程的run方法。sleep(longmillis):在指定的毫秒数内让当前执行的线程休眠。yield():暂停当前正在执行的线程对象,并执行其他线程。多线程有几种实现方法?同步有几种实现方法?两种实现方法,分别是继承Thread类与实现Runnable接口。同步有两种实现方法,分别是synchronized,wait与notify。线程的基本概念、线程的基本状态以及状态之间的关系线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。Java中的线程有四种状态:运行、就绪、挂起、结束。 新状态(就绪):线程已创建但尚未执行(start()尚未被调用)。 可执行状态(运行):线程可以执行,虽然不一定正在执行。CPU时间随时可能被分配给该线程,从而使得它执行。 死亡状态(结束):正常情况下run()返回使得线程死亡。调用stop()或destroy()亦有同样的效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。 阻塞状态(挂起):线程不会被分配CPU时间,无法执行。多线程的并发,単例创建线程进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。Java标准库提供了进程和线程相关的API,进程主要包括表示进程的java.lang.Process类和创建进程的java.lang.ProcessBuilder类;表示线程是java.lang.Thread类。如何实现多线程1、实现多线程有两种方法:Thread类继承和Runnable接口实现。 a)继承Thread类的步骤: 1)定义类继承Thread;2)复写Thread类中的run方法;将自定义代码存储在run方法,让线程运行。3)调用线程的start方法。 b)实现Runnable接口的步骤: 1)定义类实现Runnable接口; 2)覆盖Runnable接口中的run方法。将线程要运行的代码放在该run方法中。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.servlet.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息。config:表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。page:表示从该页面产生的一个servlet实例。JSP和Servlet有那些相同点和不同点,他们之间的联系是什么?JSP是servlet技术的扩展,本质上是servlet的简易方式,更强调应用的外表表达。JSP编译后是”类servlet”。Servlet和JSP最主要的不同的在于,servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,servlet主要用于控制逻辑。Servlet的生命周期?Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用destroy方法。XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?XML定义有两种方式:dtd和schema;本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的)解析XML文档的方式:DOM,SAX,STAX等。DOM:处理大型文件时其性能下降的非常厉害。这个问题是有DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合XML的随机访问。SAX:(SimpleAPIforXML)不同于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问。STAX:StreamingAPIforXML流模型中的拉模型分析方式。提供基于指针和基于迭代器两种方式的支持,jdk1.6新特性【和推式解析相比的优点】①在拉式解析中,事件是由解析应用产生,因此拉式解析中向客户端提供的是解析规则,而不是解析器。②同推式解析相比,拉式解析的代码更简单,而且不用那么多库。③拉式解析客户端能够一次读取多个XML文件。④拉式解析允许你过滤XML文件和跳过解析事件。【简介】STAXAPI的实现是使用了Javaweb服务开发(JWSDP)1.6,并结合了sunJava流式XML分析器(SJSXP)-它位于javax.xml.stream包中。XMLStreamReader接口用于分析一个XML文档,而XMLStreamWriter接口用于生成一个XML文档。XMLLEventReader负责使用一个对象事件迭代子分析XML时间-这与XMLStreamReader所使用的光标机制形成对照。XML的数据导入数据库中:可以使用XML的解析方式解析XML数据成object,再插入数据库中。J2ee常用的设计模式?说明工程模式。简洁说明简单工厂和抽象的区别。Java中的23中设计模式:Factory(工厂模式),Builder(建造模式),FactoryMethod(工厂方式模式),Protory(原始模型模式),Singletom(单例模式),Façade(门面模式),Adapter(适配器模式),Bridge(桥梁模式),Composite(合成模式),Decorator(装饰模式),Flyweight(享元模式),Proxy(代理模式),Command(命令模式),Interpreter(解释器模式),Visitor(访问者模式),Iterator(迭代子模式),Mediator(调停者模式),Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),TemplateMethod(模板方法模式),ChainOfResponsibleity(责任链模式)。工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。简单工厂:一个具体工厂通过条件语句创建多个产品,产品的创建逻辑集中与一个工厂类。客户端通过传不同的参数给工厂,实现创建不同产品的目的增加新产品时,需要修改工厂类、增加产品类,不符合OCP(开闭原则)原则工厂方法。抽象工厂:一个具体工厂创建一个产品族,一个产品族是不同系列产品的组合,产品的创建的逻辑分别在每个具体工厂类中。所有的具体工厂继承自同一个抽象工厂。客户端创建不同产品族的工厂,产品族的工厂创建具体的产品对客户端是不可见的。增加新的产品族时,需要增加具体工厂类,符合OCP原则。排序都有哪几种方法?请举例。用Java实现一个快速排序。排序的方法有:插入排序(直接插入排序、希尔排序);交换排序(冒泡排序、快速排序);选择排序(直接选择排序、堆排序);归并排序;分配排序(箱排序、基数排序)冒泡排序:#include
<stdio.h>
void
swap(int
*a,
int
*b);int
main(){
int
array[10]
=
{15,
225,
34,
42,
52,
6,
7856,
865,
954,
10};
int
i,
j;
for(i=0;i<10;i++;){
//每一次由底至上地上升
for(j
=
9;
j
>
i;
j--){
if(array[j]<array[j-1]){
swap(&array[j],&array[j-1]);
}
}
}
for
(i=0;i<10;i++){
printf("%d\n",array[i]);
}
return
0;
}
void
swap(int
*a,
int
*b)
{
int
temp;
temp
=
*a;
*a
=
*b;
*b
=
temp;
}
快速排序的伪代码//使用快速排序方法对a[0:n-1]排序从a[0:n-1]中选择一个元素作为middle,该元素为支点把余下的元素分割为两段left和right,使得left中的元素都小于等于支点,而right中的元素都大于等于支点;递归地使用快速排序方法对left进行排序;递归地使用快速排序方法对right进行排序;所得结果为left+middle+right。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语句。Webservice的运行机制是什么?在项目中是怎么使用的?客户端应用程序查找web服务的信息或类型描述。这些信息是一个XML文件,称为web服务描述(WSDL)语言。然后,客户端按要求使用简单对象访问协议(SOAP)将所需参数发送至服务器,服务器在将相应的结果返回给客户端。这里我们将发布webservice的机器称为服务端,而将调用webservice的机器称为客户端。首先服务端将发布web服务。 客户端调用步骤: a.加入web应用,将刚才发布的web服务加入,这时生成了上述web服务在本地的一个道理,我们假设为WebProxy。 b.客户端调用之前首先实例化一个该代理的对象,然后调用发布的方法。 c.客户端将调用信息包括方法名和参数加入到soap消息中通过http传送给webservice服务端。 d.服务端从soap消息中获得调用信息,然后执行方法,将返回结果加入到soap消息中,然后通过http传回。 e.客户端代理得到这个soap消息后解析出结果返回给调用客户端方法。项目中用到了哪些测试方法?进行简单的描述。单元测试:用于测试软件中的各个组件。它是属于白盒测试的。用的最多的是使用Junit工具来进行单元测试。类只需继承TestCase类即可。集成测试:把几个相关的单元集成在一起,通过检查集成单元或模块以发行缺陷的过程就称为集成测试。我们通常在项目中是将每个人的模块整合到一起进行统一测试。系统测试:是一系列的测试,其主要目的是在模拟环境中完整、准确的运行软件系统。我们通常的处理方法是: a.负载测试:使系统处理超过其能力的任务来测试系统的过程。 b.压力测试:也叫做强度测试,获取系统正确运行的极限。 c.性能测试:其目的不是为了发现错误或缺陷,而是消除瓶颈。 d.可用性测试:这个主要是体现在给用户的体验上。用户验收测试:开发阶段之后的测试阶段,确保开发的软件是完整且没有缺陷的。项目中如何规范编码?制定一份编码规范文档:类名以大写开头、有意义的单词的组成,组合单词的每一个单词都要大写。接口以I开头,实现类在类名后加Impl如:接口为IUserDAO,实现类为UserDAOImpl。系统中涉及的常量字符串,不能采用硬编码,需要properties文件中读取。编码需要多加注释。Jsp页面命名以小写字母开头、有意义的单词的组成,组合单词除第一个单词首字母小写,其他单词的首字母大写,其余小写。包名全部小写。数据库中表字段:同5。 如何考虑一个项目的安全性?从哪些方面去体现?项目的安全性并不是指一个系统的功能,而是属性。 要考虑的方面: 防止有人恶意破坏,如:sql注入。编码、权限的严密控制,也能很好的控制项目的安全性。如页面尽量少用客户端验证,而使用服务器验证,减少有人修改客户端代码而破坏项目的安全性。硬件设备等的支持,如:防火墙能够防止有人攻击Ip,从端口访问服务器。平台稳定性如何,如:考虑Linux、Window平台下项目是否能够很好的运行。js的命名规范、注释有哪几种?java的命名规范JS的命名规范:变量名必须以字母或下划线开头。变量名可以包含数字、从A到Z的大写字母和从a到z的小写字母,由于JavaScript区分大小写,所以说,变量myVar、myVAR和myvar是三个不同的变量。 注释:1.<!—注释--> 2.//注释。Java的命名规范: 标识符的命名规则:必须以字母、下划线“_”或“$”符号开头。首字母后面可以跟任意数量的字母、数字、下划线或“$”符号。标识符可以包含数字,但是不能以数字开头。另外,除下划线和“$”符号外,不能包含任何特殊字符。不能使用java语言的关键字。Java中的变量名区分大小写。 类名命名规范:不能为java中的关键字。不能包含任何嵌入的空格或点号“.”以及除下划线、“$”字符之外的特殊字符。不能以数字开头。一般以大写字母开头,且为有意义的单词组合。 方法命名:不能为java中的关键字。不能包含任何嵌入的空格或点号“.”以及除下划线、“$”字符之外的特殊字符。不能以数字开头。一般以小写字母开头,有意义的单词组合。 SVN命令行下常用的几个命令将文件checkout到本地目录svncheckoutpath(path是服务器的目录)例如:svncheckoutsvn:///pro/domain简写:svnco往版本库中添加新的文件svnaddfile例如:svnaddtest.php(添加test.php)svnadd*.php(添加当前目录下所有的php文件)将改动的文件提交到版本库svncommit–m“LogMessage”[-N][--no-unlock]PATH(如果选择了保持锁,就使用—no-unlock开关)。例如:svncommit–m“addtestfileformytest”test.php,简写:svnci加锁/解锁svnlock–m“LockMessage”[--force]PATH 例如:svnlock–m“locktestfile”test.php svnunlockPATH。更新到某个版本svnupdate–rmpath例如:svnupdate如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。 svnupdate–r200test.php(将版本库中的文件test.php还原到版本200);svnupdatetest.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svnresolved,最后再提交commit);简写:svnup。查看文件或者目录状态svnstatuspath(目录下的文件和子目录的状态,正常状态不显示)svnstatus–vpath(显示文件和子目录状态) 第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。简写:svnst。 删除文件 svndeletepath–m“deletetestfle” 例如:svndeletesvn:///pro/domain/test.php–m“deletetestfile”或者直接svndeletetest.php然后再svnci–m’deletetestfile’ 简写:svn(del,remove,rm) 查看文件 svnlogpath 例如:svnlogtest.php显示这个文件的所有修改记录,及其版本号的变化。查看文件详细信息 svninfopath 例如:svninfotest.php比较差异 svndiffpath(将修改的文件与基础版本比较) 例如:svndifftest.php svndiff–rm:npath(对版本m和版本n比较差异) 例如:svndiff–r200:201test.php 简写:svndi 将两个版本之间的差异合并到当前文件 svnmerge–rm:npath 例如:svnmerge–r200:205test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下) svn帮助svnhelpsvnhelpci版本库下的文件和目录列表 svnlistpath 显示path目录下的所有属于版本库的文件和目录,简写:svnls 创建纳入版本控制下的目录 svnmkdir:创建纳入版本控制下的新目录。 用法:1、mkdirPATH...2、mkdirURL... 恢复本地修改 svnrevert:恢复原始未改变的工作副本文件(恢复大部分的本地修改)。 用法:revertPATH...代码库URL变更 svnswitch(sw):更新工作副本至不同的URL。 用法:1、switchURL[PATH]2、switch–relocateFROMTO[PATH...]解决冲突 svnresolved:移除工作副本的目录或文件的“冲突”状态 用法:resolvedPATH... 注意:本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让PATH可以再次提交。输出指定文件或URL的内容 svncat目标[@版本]...如果指定了版本,将从指定的版本开始查找。svncat–rPREVfilename>filename 安装配置安装SVN#yuminstallsubversion测试是否安装成功#svnserve--version如果显示了版本信息则表示安装成功创建仓库#svnadmincreate/home/svn/repo给svn设置密码修改配置文件/home/svn/repo/conf/svnserve.conf去掉#[general]前面的#号匿名访问的权限,可以是read,write,none,默认为readanon-access=none认证用户的权限,可以是read,write,none,默认为writeauth-access=write密码数据库的路径#password-db=passwd去掉前面的#修改配置文件passwd#vim/home/svn/repo/conf/passwd=前面是用户名,后面是密码[users]name=password启动SVN服务器对于单个代码仓库#svnserve–d–r/home/svn–listen–host00svn默认端口是3690,在防火墙上开发这个端口。/sbin/iptables–AINPUT–IethO–ptcp–dport3690–jACCEPT/sbin/serviceiptablessave把/var/www/html/目录导入到svn的repo目录下svnimport/var/www/html/file:///home/svn/repo-m”rest”Java为什么可以跨平台?因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”—字节码。然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由JVM来把字节码再“翻译”成所对应的硬件平台能够执行的代码。因此对于Java编程者来说,不需要考虑硬件平台是什么。所以Java可以跨平台。而C/C++不可以跨平台的原因就是编译后的代码在特定的硬件上可以直接执行,换个硬件平台这些代码就不能被执行了。不过正是因为可以直接执行,所以C/C++程序的执行效率要比Java程序高。Java中的类,集合,对象所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说实现世界中每一个实体都是一个对象,它是一种具体的概念。类是具备某些共同特征的实体的集合,它是一种抽象的概念,用程序设计的语言来说,类是一种抽象的数据类型,它是对所具有相同特征实体的抽象。Map的用法Java中的map其实就是以键值对形式的存放数据的容器,其常用的实现类主要是 hashmap,例如:Mapmap=newHashMap(); 插入元素:map.put(“key”,obj); 移除元素:map.remove(“key”); 清空:map.clear();Java中的反射机制JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。 JAVA中常用到的集合框架都有哪些?下面是详细: Collection├List│├LinkedList│├ArrayList│└Vector│└Stack└SetMap├Hashtable├HashMap└WeakHashMapJAVA中最常用的集合类是List、Set和Map List特点:元素有放入顺序,元素可重复。 Map特点:元素按键值对存储,无放入顺序。 Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)List和Ma。List的具体实现包括ArrayList和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List适用于按数值索引访问元素的情形。Map提供了一个更通用的元素存储方法。Map集合类用于存储元素对(称作“键”和“值”)其中每个键映射到一个值。 编程题:用最有效率的方法算出2乘以8等于几?两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话对不对?什么时候会使用hashCode?2<<3,因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等于几的最效率的方法是2<<3。两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,这句话是不对的,它们有相同的hashcode,hashCode是用hashTable的时候为了检索才用的。说出一些常用的类,包,接口,请个举5个常用的类:BufferedReader、BufferedWriter、FileReader、FileWirter、String、Integer。常用的包:java.lang、java.awt、java.io、java.util、java.sql。常用的接口:Remote、List、Map、Document、NodeList。Java中取两个集合的并集、交集和差集?并集:也叫合集,即把两个集合的所有元素加在一起。publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub List<String>list1=newArrayList<String>(); list1.add("A"); list1.add("B"); List<String>list2=newArrayList<String>(); list2.add("C"); list2.add("B"); //2个集合的并集 list1.addAll(list2); System.out.println("并集:"+list1); }运行结果并集:[A,B,C,B]交集:计算两个集合的共有元素,即你有我也有。publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub List<String>list1=newArrayList<String>(); list1.add("A"); list1.add("B"); List<String>list2=newArrayList<String>(); list2.add("C"); list2.add("B"); //2个集合的交集 list1.retainAll(list2); System.out.println("交集:"+list1); }运行结果:交集:[B]差集:由所有属于A但是不属于B的元素组成的集合,叫做A与B的差集,即我有而你没有的元素。publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub List<String>list1=newArrayList<String>(); list1.add("A"); list1.add("B"); List<String>list2=newArrayList<String>(); list2.add("C"); list2.add("B"); //2个集合的差集 list1.removeAll(list2); System.out.println("差集:"+list1); }运行结果:差集:[A]Java中有几种类型的流?jdk为每种类型的流提供了一些抽象类以供继承,请说出它们分别是哪些类?主要分为字节流,字符流。字节流继承于InputStream,OutputStream。字符流继承于InputStreamReader,OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。什么是java序列化,如何实现java实例化?序列化就是一种用来处理对象流的机制,所谓对象也就是将对象的内容进行流花。为了解决在对对象流进行读写操作时所引发的问题。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implementsSerializable只是为了标注对象是可被序列化的;然后使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为objd的对象写出(即保存其状态),要恢复的话则用输入流。请对以下在J2EE中常用的名词进行解释(或简单描述)web容器:给处于其中的应用程序组件(jsp,servlet)提供一个环境,使jsp,servlet直接跟容器中的环境变量接口交互,不必关注其他系统问题。主要有web服务器来实现。例如:tomcat,weblogic,websphere等。该容器提供的接口严格遵守J2EE规范中的webapplication标准。我们把遵守以上标准的web服务器就叫做J2EE中的web容器。EJB容器:Enterprisejavabean容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。JNDI:(JavaNaming&DirectoryInterface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其他各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。JMS:(JavaMessageService)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。JTA:(JavaTransactionAPI)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。JAF:(JavaActionFrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。RMI/IIOP:(RemoteMethodInvocation/internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个层析,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。BS与CS的联系与区别。C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或SQLServer。客户端需要安装专用的客户端软件。B/S是Brower/Server的缩写,客户机上只要安装一个浏览器,服务器安装Oracle、Sybase、Informix或SQLServer等数据库。在这种结构下,用户界面完全通往WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务端实现。浏览器通过WebServer同数据库进行交互。struts1.2和struts2.0的区别?如何控制两种框架中的单例模式?struts1.2和struts2.0的对比Action类:struts1.2要求Action类继承一个基类。struts2.0的Action要求继承ActionSupport基类。线程模式:struts1.2的Action是单例模式的并且必须是线程安全的,因为仅有一个Action的实例来处理所有的请求。单例策略限制了struts1.2的Action能做的事情,并且开发时特别小心。Action资源必须是线程安全的或同步的。struts2.0的Action为每一个请求产生一个实例,因此没有线程安全问题。Servlet依赖:struts1.2的Action依赖于ServletAPI,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execute方法。struts2.0的Action不依赖于容器,运行Action脱离容器单独测试。如果需要,struts2.0的Action仍然可以访问初始的Request和Response。但是,其他的元素减少或者消除了直接访问HttpServletRequest和HttpServletResponse的必要性。可测性:测试struts1.2的Action的一个主要问题是execute方法暴露了ServletAPI(这使得测试要依赖于容器)。需要第三方扩展strutsTestCase提供了一套struts1.2的模拟对象来进行测试。struts2.0的Action可以通过初始化、设置属性、调用方法来测试。Struts2在项目中是怎么用的?struts2是如何配置的?struts2的标签都用过哪些?怎么使用:web.xml中配置StrutsPrepareAndExecuteFilter过滤器,在src下添加struts.xml配置文件。然后在struts.xml文件内配置需要的action。如何配置:使用action节点惊醒action的配置,将name值设置为对应的拦截路径,class值设置为拦截后需要创建对象的全路径名。如果使用了spring的话,将class的值设置为spring配置文件中对于bean的id名称就可以了。最后配置对应调用的方法名与返回后的结果集。标签:<s:property/>、<s:if>、<s:form>、<s:select>、<s:iterator>。Struts工作机制?为什么要使用struts?Struts的工作流程: 1、request请求会先通过一系列过滤器,配置 StrutsPrepareAndExecuteFilter过滤HttpServletReques请求;过滤器根据访问的路径来决定是否调用,若符合,则调用ActionMapper;ActionMapper调用ActionProxy,通过配置文件,找到相应的Action类;Action类实例化一个ActionInvocation的实例,该实例涉及到一系列的拦截器;一旦方法运行完毕,ActionInvocation根据返回值去配置文件查找要求访问的路径,通常可以是jsp页面和另一个Action。为什么要用Struts: JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,struts便应运而生。基于struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件。 说下Struts的设计模式MVC模式:将控制层、模型层、视图层分开(配合详细的MVC流程,自由发挥)Treadlocal模式:针对同一个Servlet实例代理模式Struts的应用(如struts架构)Struts是采用servlet技术,开发Web应用程序的开放源码的framework。采用Struts能开放出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有如下的主要功能: 1、包含一个controllerservlet,能将用户的请求发送到相应的Action对象。2、JSP自由tag库,并且在controllerservlet中提供关联支持,帮助开发员创建交互式表单应用。 3、提供了一系列实用对象:XML处理、通过JavareflectionAPIs自动处理JavaBeans属性、国际化的提供和消息。 Struts的validate框架是如何验证的?在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。Hibernate工作原理及为什么要用?原理: 1、读取并解析配置文件 2、读取并解析映射信息,创建SessionFactory 3、打开Session 4、创建事务Transcation 5、持久化操作 6、提交事务 7、关闭Session 8、关闭SessionFactory为什么要用: 1、对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。2、Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。 3、Hibernate映射很灵活性。它支持各种关系数据库,从一对一到多对多的各种复杂关系。Hibernate与jdbc的联系1、hibernate是jdbc的轻量级封装,包括jdbc与数据库的连接,增删改查等功能。2、hibernate用面向对象的思想,通过配置文件把pojo类的字段和数据库的字段关联起来。3、其实hibernate=封装的jdbc+XML文件。Hibernate与spring的联系1、spring实现了程序的全局性管理,包括对hibernate的管理:2、hibernate中的一些对象可以给spring来管理,让spring容器来创建hibernate中一些对象实例化。例如:SessionFactory,HibernateTemplate等。3、hibernate本来是对数据库的一些操作,放在DAO层,而spring给业务层的方法定义了事务,业务层调用DAO层的方法,很好的将hibernate的操作也加入到事务中来了。什么是Hibernate的并发机制?怎么去处理并发问题?Hibernate并发机制: 1、hibernate的session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元,它通常只使用一次,然后就丢弃。如果一个session实例运行共享的话,那些支持并发运行的,例如Httprequest,sessionbeans将会导致出现资源争用。2、并发可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。处理并发问题:将session绑定到ThreadLocal,每个线程使用的只是session的副本,不会影响到session;设置事务隔离级别: Serializable:串行化。隔离级别最高 RepeatableRead:可重复读。 ReadCommitted:已提交数据读。 ReadUncommitted:未提交数据读,隔离级别最差。设置锁,乐观锁和悲观锁: 乐观锁:使用版本号或时间戳来检测更新丢失,在class的的映射中设置optimistic-lock=”all”可以在没有版本或者时间戳属性映射的情况下实现版本检查,此时hibernate将比较一行记录的每个字段的状态。 行级悲观锁:hibernate总是使用数据库的锁定机制,从不在内存中锁定对象,只要为JDBC连接指定一下隔离级别,然后让数据库去搞定一切就够了。类LockMode定义了hibernate所需的不同的锁定级别:LockMode.UPGRADE_NOWAIT,LockMode.UPGRADE,LockMode.READ。说说Hibernate的缓存机制内部缓存存在hibernate中又叫一级缓存,属于应用事务级缓存二级缓存: a)应用及缓存 b)分布式缓存 条件:数据不好被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据。 c)第三方缓存的实现:使用第三方缓存插件。Hibernate的查询方式Hibernate特有的语句Hql:属性查询、参数查询、命名参数查询、关联查询、分页查询、统计函数 Criteria查询Sql查询Hibernate的三种状态之间如何转换当对象由瞬间状态(Transient)—save()时,就变成了持久化状态。当我们在session里存储对象的时候,实际是在session的map里存了一份,也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(persistent)。Session—Close()了,它的缓存也都关闭了,整个session也就失效了,这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。当游离状态(Detached)update()时,又变为了持久状态(Persistent)。当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient),此时,数据库中没有与之对应的记录。Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many。如何优化hibernate?1、使用双向一对多关联,不使用单向一对多2、灵活使用单向一对多关联3、不用一对一,用多对一取代4、配置对象缓存,不使用集合缓存5、一对多集合使用Bag,多对多集合使用Set6、继承类使用显示多态7、表字段要少,表关联不要怕多,有二级缓存撑腰比较truncate和delete命令?相同点:truncate和delete都可以讲数据实体删掉;不同点:a、truncate的操作并不记录到rollback日志,所以操作数据较快,但同时这个数据不能恢复;b、delete操作不能腾出表空间的空间;c、truncate不能对视图等进行删除;d、truncate是数据定义语言(DDL),而delete是数据操纵语言(DML)。垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?对于GC(GarbageCollection)来说,当程序员创建对象时,GC就开始监控对这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是“不可达的”。当GC确定一些对象为“不可达”时,GC就有责任回收这些内存空间。垃圾回收器不可以马上回收内存。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。项目中为什么使用SSH1、使用Struts是因为struts是基于MVC模式的,很好的将非应用程序进行了分层,使开发者更关注与业务逻辑的实现;第二,struts有着丰富的taglib,如能灵活运用,则能大大提高开发效率。2、使用Hibernate:因为hibernate为Java应用提供了一个易用的、高效率的对象关系映射框架。Hibernate是个轻量级的持久性框架,功能丰富。3、使用Spring:因为spring基于IoC(InversionofControl,反向控制)和AOP构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;采用IoC使得可以很容易的实现bean的装配,而且能够在类与类之间解耦合,提供了简洁的AOP并根据实现事务管理(TranscationManagment)等。SpringMVC工作机制为什么要用?工作机制: 1、springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作。2、DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller。3、DispatcherServlet请求提交到目标Controller。4、Controller进行业务逻辑处理后,会返回一个ModelAndView。5、Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象。6、视图对象负责渲染返回给客户端。 为什么要用spring?1、spring既是一个AOP框架,也是一个IOC容器。Spring最好的地方是它有助于替换对象。有了spring,只要用JavaBean属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换不同的接口实现类。2、spring有两大特性:IOC和AOP IOC:正如单词倒置所表明的,IOC就像反过来的JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straightconstruction),把对象的创建和维护交由容器管理,从而使类与类之间的依赖关系发生反转,实现解耦合。 AOP:让开发人员可以创建非行为性的关注
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 亲子沟通策略优化手册
- 儿童健身教练运动安全指导方案
- 企业注册信息更新通知函(6篇范文)
- 合作合同签订会议通知8篇
- 航空制造厂航空设备安全操作手册
- 教育机构学生考勤管理系统智能化升级指南
- 关于调整服务费用告知(4篇范文)
- 2026年度财务预算执行情况报告通知函6篇
- 2026中国虚拟现实教育应用市场渗透率及增长空间分析报告
- 2026智能零售市场发展分析及前景趋势与投资策略分析报告
- JJF 2463-2026烟气含湿量测量仪校准规范
- 2026年专业技术人员继续教育公需科目-智慧城市历年参考题库含答案解析
- 2026年县直机关干部公开遴选笔试试卷(附答案)
- 高中高一年级信息技术“变量与程序设计综合应用-设计购买纪念品的最佳方案”教学设计
- 26新六年级上册道德与法治【知识点总结】
- 石材护理技术规范SOP
- CSCO结直肠癌诊疗指南(2026版)
- 《新能源专业导论》新能源相关专业全套教学课件
- 教科版小学科学二年级上册和下册【全册】教学课件上下共两册
- 人力资源业务开展制度
- 中华传统文化课程思政教学案例
评论
0/150
提交评论