




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基础知识:Jsp指令:page、include。Include指令用来在该指令处插入一个文件(静态文件),这与c语言中的#include相似,它只是把文件代码与本文件组合起来形成一个大的程序文件。Jsp动作指令:Include动作指令用来在jsp页面中动态包含一个文件,这样包含页面程序与被包含页面的程序是彼此独立的。Jsp的include动作指令可包含一个动态文件也可包含一个静态文件。Forward指令用来重定向网页。Param 用来向需要包含的动态页面或要转向的动态页面传递参数。Plugin 用来在jsp中加载java applet小程序。useBean用来在jsp中创建并使用一个javabean。实际工程中常用javabean做组件开发,而在jsp中只需要声明并使用这个组件,这样可以较大限度的实现静态内容和动态内容的分离。setProperty用来设置Bean中属性的值,getProperty用来获得bean的属性并将其转换为字符串。Jsp的内置对象:request,response,session,application,out,config,pageContext。Request 对象可以获取客户端提交的数据,如表单中的数据、网页地址后带的参数等。Response 接收客户端输入的数据。Session 用来保存在服务器与一个客户端之间需要保留的数据,当客户端关闭网站的所有网页时,session变量会自动清除。Application 一旦创建(在服务器开始提供服务时,即第一次被访问时application对象就会被创建),就会一直保持到服务器关闭服务为止。所以application对象可用来提供一些全局的数据和对象。Out实际上是使用PrintWriter类来向客户端浏览器输出数据。Config是ServletConfig类的一个对象,是jsp配置处理程序的句柄,在jsp页面范围内有效。pageContext用来管理属于jsp中特殊可见部分中已命名对象的访问。Servlet技术是用java编写的运行在web服务器中的程序,因此它可以调用服务器端的类,也可以被调用,它本身也就是一个类。Javascript是运行在客户端浏览器的脚本程序,javaapplet是运行在客户端的java小程序;而servlet是运行在服务器端的程序。Servlet由web服务器引擎负责编译执行,当客户端浏览器访问servlet时,服务器将启动一个线程来响应,而并非cgi技术的进程。因此相对cgi方式占用的系统资源比较少,运行效率高。Servlet的生命周期:(1)servlet的初始化。Servlet实际上是一个类,当第一次被客户端请求时,web服务器引擎首先要生成这个servlet类的对象,并加载这个对象,通过这个对象的init()方法完成一些初始化的工作。(2)生成servlet类的对象调用service()方法来响应请求。Servlet类的对象自第一次被生成后将常驻内存直至web服务器被关闭,当再次被请求时将直接从内存中取出对象来响应请求。当web服务器被关闭时,将调用servlet类的对象的destroy()方法来消除此对象。数据库连接池:数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个,释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数。当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。事务:是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。事务特性:ACDI原子性(Atomicity),一致性(Consistence),隔离性(Isolation)和持续性(Durability)。存储过程:对数据库操作比直接调用sql语句具有更高的性能和效率。存储过程是存储在数据库管理系统服务器上的若干条经过预编译的sql语句。存储过程存储在数据库服务器上,由数据库管理系统管理控制,由服务器直接执行。一是因为存储过程是预编译的,因此相比执行sql语句的方法节约了sql语句的预编译时间;二是可以减少网络传输数据量,这是由于它在驻留服务器上,不必等待记录通过网络传递过来就可以进行处理。连接数据库:%Connection con; Statement sql; ResultSet rs;String manager=chStr.chStr(request.getParameter(manager);/此处必须进行编码转换,否则输入中文用户名时将出现乱码 try Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); catch(ClassNotFoundException e) out.print(类找不到!); try con=DriverManager.getConnection(jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=testDatabase,sa,6599996); sql=con.createStatement(); rs=conn.executeQuery(select * from tb_manager where manager=+manager+); if(rs.next()String PWD=request.getParameter(PWD);if(PWD.equals(rs.getString(PWD)session.setAttribute(manager,manager);response.sendRedirect(index.jsp);elsewindow.location.href=./index.jsp;); con.close(); Vector和ArrayList区别 Vector和ArrayList Vector和ArrayList在使用上非常相似,都可用来表示一组数量可变的对象应用的集合,并且可以随机地访问其中的元素。 Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。Hashtable和HashMap区别Hashtable和HashMap它们的性能方面的比较类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。ArrayList和LinkedList区别对于处理一列数据项,Java提供了两个类ArrayList和LinkedList,ArrayList的内部实现是基于内部数组Object,所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。 从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能 而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!CollectionListLinkedListArrayListVectorStackSetMapHashtableHashMapWeakHashMapCollection接口Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接继承自Collection的类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:Iteratorit=collection.iterator();/获得一个迭代子while(it.hasNext()Objectobj=it.next();/得到下一个元素由Collection接口派生的两个接口是List和Set。List接口List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。LinkedList类LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:Listlist=Collections.synchronizedList(newLinkedList(.);ArrayList类ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。和LinkedList一样,ArrayList也是非同步的(unsynchronized)。Vector类Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。Stack类Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。Set接口Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。请注意:必须小心操作可变对象(MutableObject)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。Map接口请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。Hashtable类Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。Hashtable通过initialcapacity和loadfactor两个参数调整性能。通常缺省的loadfactor0.75较好地实现了时间和空间的均衡。增大loadfactor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:Hashtablenumbers=newHashtable();numbers.put(“one”,newInteger(1);numbers.put(“two”,newInteger(2);numbers.put(“three”,newInteger(3);要取出一个数,比如2,用相应的key:Integern=(Integer)numbers.get(“two”);System.out.println(“two=”+n);由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。Hashtable是同步的。HashMap类HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即nullvalue和nullkey。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者loadfactor过低。WeakHashMap类WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。总结如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。一般Singleton模式通常有几种种形式:第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。java 代码1. publicclassSingleton 2. privateSingleton() 3. 4. /在自己内部定义自己一个实例,是不是很奇怪? 5. /注意这是private只供内部调用 6. privatestaticSingletoninstance=newSingleton(); 7. /这里提供了一个供外部访问本class的静态方法,可以直接访问 8. publicstaticSingletongetInstance() 9. returninstance; 10. 11. 第二种形式: java 代码1. publicclassSingleton 2. privatestaticSingletoninstance=null; 3. publicstaticsynchronizedSingletongetInstance() 4. /这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 5. /使用时生成实例,提高了效率! 6. if(instance=null) 7. instancenewSingleton(); 8. returninstance; 9. 10. 其他形式:定义一个类,它的构造函数为private的,所有方法为static的。一般认为第一种形式要更加安全些.throws是用来声明一个方法可能抛出的所有异常信息throw则是指抛出的一个具体的异常类型。abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstractclass和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。 理解抽象类 abstractclass和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstractclass翻译而来,它表示的是一个抽象体,而abstractclass为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢? 在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。 在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-ClosedPrinciple),抽象类是其中的关键所在。 从语法定义层面看abstractclass和interface 在语法层面,Java语言对于abstractclass和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。 使用abstractclass的方式定义Demo抽象类的方式如下: abstractclassDemo abstractvoidmethod1(); abstractvoidmethod2(); 使用interface的方式定义Demo抽象类的方式如下: interfaceDemo voidmethod1(); voidmethod2(); 在abstractclass方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是staticfinal的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstractclass。 从编程的角度来看,abstractclass和interface都可以用来实现designbycontract的思想。但是在具体的使用上面还是有一些区别的。 首先,abstractclass在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。 其次,在abstractclass的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。 在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过abstractclass或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstractclass来实现的,那么可能就只需要修改定义在abstractclass中的默认行为就可以了。 同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了onerule,oneplace原则,造成代码重复,同样不利于以后的维护。因此,在abstractclass和interface间进行选择时要非常的小心。 从设计理念层面看abstractclass和interface 上面主要从语法定义和编程的角度论述了abstractclass和interface的区别,这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面:abstractclass和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。 前面已经提到过,abstarctclass在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在isa关系,即父类和派生类在概念本质上应该是相同的(参考文献3中有关于isa关系的大篇幅深入的论述,有兴趣的读者可以参考)。对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。 考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstractclass或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示: 使用abstractclass方式定义Door: abstractclassDoor abstractvoidopen(); abstractvoidclose(); 使用interface方式定义Door: interfaceDoor voidopen(); voidclose(); 其他具体的Door类型可以extends使用abstractclass方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstractclass和interface没有大的区别。 如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中,主要是为了展示abstractclass和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)?下面将罗列出可能的解决方案,并从设计理念层面对这些不同的方案进行分析。 解决方案一: 简单的在Door的定义中增加一个alarm方法,如下: abstractclassDoor abstractvoidopen(); abstractvoidclose(); abstractvoidalarm(); 或者 interfaceDoor voidopen(); voidclose(); voidalarm(); 那么具有报警功能的AlarmDoor的定义方式如下: classAlarmDoorextendsDoor voidopen() voidclose() voidalarm() 或者 classAlarmDoorimplements
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年春季内蒙古包头市中心医院引进高层次和紧缺急需人才招聘29人考前自测高频考点模拟试题及答案详解(新)
- 2025广东广州市中级人民法院招聘劳动合同制审判辅助人员46人考前自测高频考点模拟试题附答案详解(模拟题)
- 2025河南省水利第一工程局集团有限公司招聘49人考前自测高频考点模拟试题及答案详解(夺冠系列)
- 2025湖南矿产集团子公司招聘16人考前自测高频考点模拟试题及参考答案详解1套
- 2025贵州罗甸县第一医共体沫阳分院招聘合同制专业技术人员模拟试卷及一套答案详解
- 2025广东省恩平市引进各类人才(卫生健康系统医共体高层次人才和急需紧缺人才专场)30人考前自测高频考点模拟试题及答案详解(各地真题)
- 2025年济宁嘉祥县事业单位公开招聘工作人员(教育类)(68人)考前自测高频考点模拟试题及答案详解参考
- 2025内蒙古鄂尔多斯生态环境职业学院人才引进38人考前自测高频考点模拟试题及答案详解(名师系列)
- 2025年菏泽市市直机关幼儿园公开招聘教师(10人)模拟试卷及答案详解(名校卷)
- 2025海南琼海市招商局招聘编外人员1人(1号)模拟试卷及一套完整答案详解
- 2025年初级药师资格考试试题(附答案)
- 2025国企竞聘上岗与干部竞聘上岗笔试题及答案
- 人工智能与建筑产业体系智能化升级研究报告
- 学习通《大学生就业指导》章节测试含答案
- GB/T 4025-2010人机界面标志标识的基本和安全规则指示器和操作器件的编码规则
- 水池(水箱)清洗记录
- 大学学生转学(转入)申请表
- 角膜 角膜炎课件
- DL∕T 5440-2020 重覆冰架空输电线路设计技术规程
- 《发展汉语(第二版)初级读写Ⅱ》全套教案
- 孔明灯(Lantern)3.4使用指南课件
评论
0/150
提交评论