第一篇:java期末考试知识点总结(范文模版)
java知识点总结
应同学要求,特意写了一个知识点总结,因比较匆忙,可能归纳不是很准确,重点是面向对象的部分。
java有三个版本:JAVA SE 标准版JAVA ME移动版JAVA EE企业版 java常用命令:java, javac, appletview java程序文件名:.java,.class java的两类程序:applet, application;特点,区别,这两类程序如何运行 java的主方法,主类,共有类;其特征
java的数据类型,注意与C++的不同,如字符型,引用型,初值 java与C++的不同之处,期中已总结 java标记符的命名规则
1)标识符有大小写字母、下划线、数字和$符号组成。
2)开头可以是大小写字母,下划线,和$符号(不能用数字开头)3)标识符长度没有限制
4)标识符不能使关键字和保留字 面向对象的四大特征 抽象、封装、继承、多态
封装,类、对象,类与对象的关系,创建对象,对象实例变量
构造函数,默认构造函数,派生类的构造函数,构造函数的作用,初始化的顺序,构造方法的重载 构造函数:创建对象的同时将调用这个对象的构造函数完成对象的初始化工作。把若干个赋初值语句组合成一个方法在创建对象时一次性同时执行,这个方法就是构造函数。是与类同名的方法,创建对象的语句用new算符开辟了新建对象的内存空间之后,将调用构造函数初始化这个新建对象。构造函数是类的特殊方法: 构造函数的方法名与类名相同。构造函数没有返回类型。
构造函数的主要作用是完成对类对象的初始化工作。构造函数一般不能由编程人员显式地直接调用。
在创建一个类的新对象的同时,系统会自动调用该类的构造函数为新对象初始化。类的修饰符:public类 VS 默认;abstract类;final类;1)类的访问控制符只有一个:public,即公共的。公共类表明它可以被所有其他类访问和引用。
若一个类没有访问控制符,说明它有默认访问控制特性,规定该类智能被同一个包中的类访问引用(包访问控制)。2)abstract类:用abstract修饰符修饰的类被称为抽象类,抽象类是没有具体对象的概念类,抽象类是它所有子类的公共属性集合,用抽象类可以充分利用这些公共属性来提高开发和维护效率。
3)final类:被final修饰符修饰限定的,说明这个类不能再有子类。所以abstract与final不能同时修饰一个类。域和方法的定义
1)域:定义一个类时,需要定义一组称之为“域”或“属性”的变量,保存类或对象的数据。可以是java任意的数据类型,其中包括简单类型、类、接口、数组等。一个类中域名应该是唯一的。
2)方法是类的动态属性,标志了类所具有的功能和操作。方法由方法头和方法体组成: 修饰符1 修饰符2 „返回值类型方法名(形式参数列表)throw(异常列表){ 方法体个语句; } static域和方法,特点,本质,与普通域和方法区别,初始化问题
1)静态域:用static修饰符修饰的域是仅属于类的静态域。特点是:它们是类的域,不属于任何一个类的具体对象。保存在类的内部区域的公共存储单元,任何一个类的对象访问它都是相同的数值,任何一个类的对象去修改它,都是在对同一个内存单元操作。2)静态方法:用static修饰的方法,是属于整个类的方法;(1)调用静态方法时,应该使用类名做前缀,而不是使用某个具体对象名。非静态方法属于某个对象的方法,在这个对象创建时,对象的方法在内存中拥有自己专用代码段;而静态方法属于整个类,它在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有。
由于static方法是属于整个类的方法,所以它不能操纵和处理属于某个对象的成员变量,而只能处理属于整个类的成员变量,static方法只能处理static域。final关键字,final类,final域,final方法
1)final类:一个类如果被final修饰符修饰限定,说明这个类不再能有子类
2)final域:final是用来修饰修饰常量的修饰符,一个类的域如果被声明为final,那么它的值在程序的整个执行过程中都不能改变。用final修饰符说明常量是注意:1.需要说明常量的数据类型;2.需要同时指出敞亮的具体取值;3.因为所有类对象的常量成员,其数值固定一致,为了节省空间,常量通常声明为static.3)final方法:不能被当前类的子类重新定义的方法。被private限定为私有方法,以及final类中的方法,都是默认为最终方法。访问控制符
是一组想定类、属性、方法是否可以被程序中的其他部分访问和调用的修饰符,其他部分指这个程序中这个类之外的类。1)类的访问控制:
类的访问控制符只有一个Public,公共的。一个类被声明为公共类,表明它可以被所有的其他类访问和引用,程序其他部分可以创建这个类的对象,访问这个类内部可见的成员变量和调用它的可见方法。
如果类没有访问控制符public说明它是默认访问控制,规定该类只能被同一个包中的类访问和引用,不可被其他包中的类使用(包访问)。2)类成员的访问控制:
Public:公共。一个方法或者域被声明为公共的,表明它可以被所有的类访问。
默认访问控制符:类的定义中,域和方法没有指定访问控制符,则域和方法具有包访问性,即可以被同一个包中的所有类(的方法)访问。Protected:保护访问控制符,类中限定为protected的成员可以被这个类本身、它的子类(包括同一个包和不同包中的子类)以及同一个包中的其他类来访问。Private:私有访问控制符,被private修饰的域和方法只能被同一个类中的成员方法所访问,而不能被任何其他类(包括该类的子类)访问。它们也被称之为私有域和方法。类的继承,继承的特性可给面向对象编程带来哪些好处?什么是单继承,什么是多重继承? 继承:是存在于面向对象程序中的两个类之间的一种关系,当一个类获取另一个类的所有非私有的数据和操作的定义作为自己的一部分或全部成分时,就称两个类之间是继承关系。继承能够使程序结构清晰,降低编码和维护工作量。可以提高程序抽象程度,使之更接近人的思维方式,同时也可以提高程序开发效率,降低维护工作量。单继承:只任何一个类都只有一个单一的父类; 多重继承:只一个类可以有一个以上的父类,它的静态的数据属性和操作从所有这些父类中继承。Java处于安全性可靠性考虑,仅支持单继承。域的继承与隐藏
在子类中重新定义一个与从父类哪里继承来的域变量完全相同的变量,导致子类中有两个同名变量,一般情况,子类的方法所操作的是子类自己定义的变量,而从父类继承的变量为不可见,即被子类同名变量隐藏,成为域的隐藏。方法的继承与覆盖,与方法重载有什么不同?
子类可以重新定义与父类同名的方法,实现对父类方法的覆盖(overload),与域的隐藏不同在于:子类隐藏父类的域只是使之不可见,父类同名域在子类对象中仍然占有自己的独立内存空间;子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不复存在。注意:子类重新定义父类已有方法时,应保持与父类完全相同的方法头声明,即应与父类具有完全相同的方法名,返回值和参数列表。
重载(override)是在一个类中定义同名方法的情况。由于重载发生在同一个类里,不能再用类名来区分不同的方法,所以一般采用不同形式参数列表,包括形式参数个数、类型和顺序不同来区分重载方法。super
this super调用父类构造函数:严格来说子类并不继承父类构造函数。但子类构造函数与父类构造函数存在一定关系并遵循以下原则:
如果子类自己没有定义任何构造函数,那么创建子类对象时将调用父类无参数构造函数。如果子类自己定义了构造函数,则在创建子类对象时,系统将首先隐含执行父类无参数的构造函数,然后再执行子类自己的构造函数。
如果在子类自己定义的构造函数中,利用super关键字显式地调用父类的构造函数,系统将不再隐含调用父类的无参数的构造函数。super的显式调用语句必须是子类构造函数的第一个可执行语句。(P126有例子)
this:一个类的不同构造函数之间可以互相调用。一个构造函数需要另一个构造函数时,应使用关键字this,同时这个调用语句应该是整个构造函数的第一个可执行语句。当使用this并给他一个参数列表时,this显式调用参数匹配的另一个构造方法。(P125例子)。多态:重载,覆盖,对象引用多态(兼容性原则)
多态,指一个程序中同名的不同方法共存的情况。突出Java语言的继承性。面向对象程序中多态可以表现在:1)子类对父类方法的覆盖;2)一个类中方法的重载;3)将子类对象作为父类的对象实现多态。父类与子类对象的转换
子类继承了父类所有的非私有的成员(属性和方法),父类成员也就是子类成员。我们可以通过父类变量让一个子类对象做父类对象可做的全部事情(P115).如果父类变量指向的实际是一个子类对象,即早先曾将子类对象的引用赋值给这个父类变量,那么可以用强制类型转换将这个父类变量引用转换为子类对象的引用,也就是将作为父类对象看待的子类对象转变为作子类对象看待。Employee emp = new Manager(…)Manager mgr;mgr =(Manager)emp;最后结果相当于:
Manager mgr = new Manager(…)
包,package
import, 简单知道作用和使用 接口,会定义,有何特点?作用,会实现,会使用
接口是用来实现类间多重继承功能的结构。Java中接口在语法上有些相似与类,它定义了若干个抽象方法和常量,形成一个属性集合,属性集合通常对应了某一组功能,主要是可以帮助实现类似于类的多重继承功能。声明接口:
[public] interface 接口名 [extends 父接口名列表] { //接口体
// 常量域声明
[public] [static] [final] 域类型域名 = 常量值;
//抽象方法声明
[public] [abstract][native] 返回值方法名(参数列表)[throw 异常列表]; } 实现接口:
在类的声明部分,用implements关键字声明该类将要实现那些接口。如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,即为所有方法定义方法体,方法头部分应该与接口中的定义完全一致。如果实现接口类是abstract类,它可以不实现该接口的所有的方法。一个类在实现某接口的抽象方法时,必须使用完全相同的方法头。
接口的抽象方法的访问限制符都已指定为public,所以类实现方法时候,必须显式地使用pubic修饰符。
4-1什么是抽象?什么是过程抽象?什么是数据抽象?面向对象软件开发如何实现?
抽象:即去除掉被研究对象中与主旨无关的次要部分,或暂时不考虑的部分,而仅抽取与研究工作有关的性质的内容加以考察。
过程抽象:将整个系统的功能划分为若干部分,强调功能完成的过程及步骤。数据抽象:把系统中需要处理的数据和数据上的操作结合在一起,根据功能性质和作用等因素抽象成为不同的抽象数据类型。
面向对象软件开发采用数据抽象的方法构建程序的类,对象及方法。4-2什么是封装?面向对象程序如何实现封装? 封装是指利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部,系统的其他部分只有通过包裹在数据外面的被授权操作,才能够与这个抽象数据类型交流和交互。
抽象数据类型用“类”这个面向对象工具可理解和操纵的结构来代表的,每个类封装了相关数据和操作。
4-3使用抽象和封装有哪些好处? 抽象可以帮助人们明确工作重点,理清问题的脉络。封装特性使抽象数据类型的可重用性大为提高,利于构建,开发大型标准化的应用软件系统,大幅提高生产效率,缩短开发周期和降低各种费用。
4-4Java程序中使用的类分为哪两种?什么事系统定义的类?什么事用户自定义类?
1)系统定义的类及用户自定义类2)Java类库是一组由开发人员或软件供应商编写的Java程序模块,每一个模块通常对应一种特定的基本功能和任务可以直接利用这些类库无需从头编写。3)用户自己根据需要定义的类。
4-6 使用已经存在的类(包括类库中系统类和用户类)有哪三种主要方法?如何在程序中引入已经存在的类?
第一、继承系统类或继承已经定义好的类。第二、创建已经定义好的类的对象。第三、直接使用类。2)利用import语句引入它所用的类所在的包。4-15 什么事静态初始化器?它有什么特点?与构造函数有什么不同?
静态初始化器:由static引导的一对大括号括起的语句组,作用与类的构造函数相似,都完成初始化工作。与构造函数的不同:
构造函数是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化。
构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器是在它所属的类加载入内存时由系统调用执行。
不同于构造函数,静态初始化器不是方法,没有方法名、返回值、和参数列表。4-16 最终域和易失域各有有何特点?如何定义?
(1)最终域:一个类的域如果被声明为final,那么它的值在程序的整个执行过程中是不能变的。final修饰常量时注意:1)说明常量的数据类型2)需要同时指出常量的具体值。3)所有类对象的常量成员,其数值固定一致,为了节省空间,常量通常声明为static.例:static final String phoneNum =”123”。
(2)易失域:一个域被volatile修饰符修饰,说明这个域可能同时被几个线程控制修改,即这个域不仅被当前程序掌握,运行过程中可能存在其他未知程序,操作来影响和改变域的取值。
4-17 如何定义方法?在面向对象程序设计中方法由什么作用? 方法名后面的小括号()是方法的标志。程序用方法名调用方法。定义方法的目的:是定义具有相对独立和常用功能的模块,使程序结构清晰也利于模块在不同场合重复利用。
4-18 什么事抽象方法?它有何特点?如何定义、如何使用?
由abstract 修饰符修饰的抽象方法是一种仅有方法头,没有具体方法体和操作实现的方法。例如:abstract void performDial();
注意:所有抽象方法,都必须存在抽象类中,一个非抽象类中出现抽象方法时非法的。一个抽象类的子类若不是抽象类,它必须为父类中所有的抽象方法写方法体,不过抽象类不一定只能拥有抽象方法,它也可以包括非抽象方法。
4-22修饰符是否可以混用?混合使用应该注意什么问题?
修饰符可以混合使用。例如:public abstract final 三者之间并非互斥。Public abstract class „ Abstract不能与final 并列修饰一个类。
Abstract 不能与private、static、final、native修饰同一个方法。Abstract 类不能有private域和方法。Abstract方法必须在abstract类中。Abstract方法不能处理非static属性。
5-2 子类的域和方法数目一定大于等于父类的域和方法数目,说法是否正确? 不正确,子类并不能继承父类的私有域和私有方法。5-7构造函数是否可以被重载?试举例。
可以被重载。构造函数的重载指同一个类中存在若干个具有不同参数列表的构造函数 例:D200_Card(){} / /无形式参数,无任何操作的构造函数
D200_Card(long cn){ cardNumber = cn;} //一个参数的构造函数
D200_Card(long cn,int pw;){ cardNumber = cn;password = pw;} //两个参数的构造函数 简答题new1 1 什么是静态变量?什么是静态方法?各自有何特点?
被static修饰的变量叫静态变量,被static修饰的访问静态方法。静态变量最主要特点是它们是类的域(变量),不属于任何一个类的具体对象,它不保存在对象空间,而是保存在类的内存区域的公共存储单元,任何类的对象访问它时,取到的都是相同的数值,修改它时,都是对同一个内存单元进行操作。静态方法是属于整个类的的类方法,不是属于某个具体对象的方法。Java中对变量和成员方法的访问控制主要有哪四种?有何区别?
a)Private:私有访问属性,被private修饰的变量或方法只能被同一个类的成员方法访问,而不能被任何其他类访问。Private访问控制符提供最高的成员保护级别,使它们不为其他类所见,体现了类的封闭和信息隐藏。b)默认访问控制符:如果在类的定义中,域和方法前没有指定访问控制符,则具有包访问性,即被同一包的所有类所访问,称之为“包友元”成员。c)Protected保护访问控制符:被portected修饰的成员可以被类本身、它的子类、以及同一个包中所有类访问。d)Public公共访问控制符:成员可以被所有类访问。填空:
1.创建类的对象时,使用运算符__new______给对象分配内存空间。2.若有定义:float[] b={1.1f, 3.5f, 6.8f};,则b.length()的值是_3____ 3.在子类中使用关键字__super_____做前缀可调用被子类覆盖的父类中的方法
4.Java语言中, 通常把可能发生异常的方法调用语句放到try块中,并用紧跟其后的_catch____块来捕获和处理异常
5.程序中实现多线程的方法有两种:继承_Thead____类和实现Runnable接口 6.面向对象的三大特征是()()()封装性、继承性、多态性
第二篇:java知识点总结(定稿)
目录
目录................................................................................................................................................1 基础篇............................................................................................................................................4
一、JDK常用的包................................................................................................................4
二、Get和Post的区别.......................................................................................................4
三、Java多态的具体体现...................................................................................................4
四、StringBuffer StringBuilder String 区别.......................................................................5
五、Hashtable与HashMap的区别....................................................................................5六、九大隐式对象...............................................................................................................5
七、Forword(请求转发)与Redirect(重定向).....................................................................6
八、JQurey总结....................................................................................................................6
九、XML和Json的特点....................................................................................................6
十、request.getSession()、reqeust.getSession(false)和
request.getSession(true)7
十一、Page和PageContext的区别....................................................................................7
十二、Ajax总结..................................................................................................................7
十三、JSP9大隐视对象中四个作用域的大小与作用范围................................................7
十四、List,Set,Collection,Collections..................................................................................8
十五、java的基本数据类型...............................................................................................8
十六、冒泡排序...................................................................................................................8 十七、二分查找法.................................................................................................................9
十八、时间类型转换.............................................................................................................9
十九、阶乘.......................................................................................................................10
二十、UE和UI的区别....................................................................................................10 二
十一、osi七层模型.......................................................................................................10 二
十二、线程和进程的区别.............................................................................................11 二
十三、jvm的内存结构.................................................................................................11 二
十四、内存泄露和内存溢出.........................................................................................11 二
十五、单例.....................................................................................................................11 二
十六、解析xml文件的几种技术.................................................................................13 二
十七、项目的生命周期.................................................................................................14
1
二十八、OSCache的判断.................................................................................................14 二
十九、经常访问的技术网站.........................................................................................15 三
十、项目团队中交流的工具.........................................................................................15 三
十一、平时浏览的书籍.................................................................................................15 三
十二、java Exception体系结构....................................................................................15 三
十三、session和cookie的区别....................................................................................16 三
十四、字节流与字符流的区别.....................................................................................16 三
十五、final,finally,finalize 三者区别...........................................................................17 三
十六、Io流的层次结构................................................................................................17 三
十七、JAVA:..................................................................................................................18 三
十八、JavaSE JavaEE JavaME区别........................................................................18 三
十九、JDK JRE JVM的区别:.............................................................................19 四
十、报错的状态码:.....................................................................................................20 四
十一、协议以及默认的端口号.....................................................................................20 四
十二、抽象类与接口的区别.........................................................................................20 四
十三、修饰符的作用.....................................................................................................20 框架篇........................................................................................................................................21
一、Struts1的运行原理..................................................................................................23
二、Struts2的运行原理..................................................................................................23
三、struts2的体系结构...................................................................................................23
四、Spring MVC运行原理.............................................................................................24
五、Struts1.x与Struts2.x的区别...................................................................................25
六、Spring MVC、struts1和struts2区别......................................................................25
七、Struts2中result中的type类型...............................................................................25
八、Struts2标签..............................................................................................................26
九、SSI整合....................................................................................................................26
十、SSH整合..................................................................................................................26
十、Spring MVC整合.....................................................................................................27
十一、Hibernate 中get 和 load的区别.........................................................................28
十二、Hibernate、Ibatis、Jdbc三者的区别..................................................................28
十三、Hibernate的运行原理..........................................................................................28
十四、Hibernate五大核心(类/接口)简述.................................................................28
十五、Hibernate与JDBC的区别..................................................................................29
十六、Hibernate中的两大配置文件................................................................................29
十七、Hibernate事务处理..............................................................................................29
十八、Hibernate的三种状态以及状态的转换..............................................................29
十九、分页步骤...............................................................................................................30
二十、hibernate缓存概述.................................................................................................30 二
十一、Ssh的概述:.....................................................................................................30 二
十二、防止表单重复提交.............................................................................................31 二
十三、JSP标签:........................................................................................................31 二
十四、过滤器.................................................................................................................32 二
十五、拦截器的理解.....................................................................................................32 二
十六、Spring融入框架................................................................................................33
2
数据库篇.....................................................................................................................................33
一、JDBC连接数据库步骤(以MYSQL为例).............................................................33
二、数据库连接池...........................................................................................................34
三、mysql的数据库导入导出........................................................................................35
四、jdbc分段批量提交的时候出现异常怎么处理?.....................................................35
五、jdbc批量处理数据...................................................................................................35
六、Oracle分页...............................................................................................................36
七、Oracle的基本数据类型...........................................................................................36
八、id、rowid、rownum的区别....................................................................................37
九、主键和唯一索引的区别?.......................................................................................37
十、Preparedstatement和statement的区别...................................................................37
十一、数据库三范式.......................................................................................................38
十二、视图概述...............................................................................................................38
十三、存储过程概述.......................................................................................................38
十四、索引概述...............................................................................................................39
十五、必背的sql语句....................................................................................................41 业务场景篇.................................................................................................................................44
一、Spring的概述...........................................................................................................44
二、事务概述...................................................................................................................45
三、权限概述...................................................................................................................46
四、OSCache业务场景...................................................................................................46
五、线程概述...................................................................................................................47
六、Ajax请求Session超时问题....................................................................................47 七:java线程池概述.........................................................................................................48
八、OSCache概述...........................................................................................................49
九、OSCache+autocomplete+单例业务场景..................................................................49
十、缓存概述...................................................................................................................50
十一、实现页面静态化业务场景...................................................................................50
十二、servlet线程安全描述...........................................................................................51
十三、(jbpm4)工作流引擎描述:.....................................................................................51
十四、JPBM业务场景....................................................................................................52
十五、Ant描述................................................................................................................52
十六、FreeMarker描述...................................................................................................53
十七、webService描述...................................................................................................53
十八、oracle索引概述....................................................................................................55
十九、oracle存储过程....................................................................................................56
二十、Junit 业务场景.......................................................................................................56 二
十一、Apache+Tomcat 实现负载均衡及seesion复制...............................................56 二
十二、Ant业务场景......................................................................................................57 二
十三、maven业务场景.................................................................................................57 二
十四、Servlet的概述:................................................................................................58 优化篇........................................................................................................................................64
一、代码优化...................................................................................................................64
二、业务优化...................................................................................................................64
3
三、sql优化.....................................................................................................................65
四、防sql注入................................................................................................................68
基础篇
一、JDK常用的包
java.lang: 这个是系统的基础类,比如String、Math、Integer、System和Thread,提供常用功能。
java.io: 这里面是所有输入输出有关的类,比如文件操作等
java.net: 这里面是与网络有关的类,比如URL,URLConnection等。java.util : 这个是系统辅助类,特别是集合类Collection,List,Map等。java.sql: 这个是数据库操作的类,Connection, Statememt,ResultSet等
二、Get和Post的区别
1.get是从服务器上获取数据,post是向服务器传送数据,2.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
3.get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
4.在进行文件上传时只能使用post而不能是get。
三、Java多态的具体体现
面向对象编程有四个特征:抽象,封装,继承,多态。
多态有四种体现形式:
1.接口和接口的继承。2.类和类的继承。3.重载。4.重写。
其中重载和重写为核心。
重载:重载发生在同一个类中,在该类中如果存在多个同名方 法,但是方法的参数类型和个数不一样,那么说明该方法被重 载了。
重写:重写发生在子类继承父类的关系中,父类中的方法被子 类继承,方法名,返回值类型,参数完全一样,但是方法体不 一样,那么说明父类中的该方法被子类重写了。
4
四、StringBuffer StringBuilder String 区别
String
字符串常量
不可变
使用字符串拼接时是不同的2个空间
StringBuffer 字符串变量
可变
线程安全
字符串拼接直接在字符串后追加 StringBuilder 字符串变量
可变
非线程安全
字符串拼接直接在字符串后追加
1.StringBuilder执行效率高于StringBuffer高于String.2.String是一个常量,是不可变的,所以对于每一次+=赋值都会创建一个新的对象,StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append方
法,在原来的基础上进行追加,所以性能比String要高,又因为StringBuffer 是
线程安全的而StringBuilder是线程非安全的,所以StringBuilder的效率高于
StringBuffer.3.对于大数据量的字符串的拼接,采用StringBuffer,StringBuilder.五、Hashtable与HashMap的区别
HashMap不是线程安全的,HashTable是线程安全。
HashMap允许空(null)的键和值(key),HashTable则不允许。
HashMap性能优于Hashtable。
Map 1.Map是一个以键值对存储的接口。Map下有两个具体的实现,分别是HashMap和HashTable.2.HashMap是线程非安全的,HashTable是线程安全的,所以HashMap的效率高于HashTable.3.HashMap允许键或值为空,而HashTable不允许键或值为空.六、九大隐式对象
输入/输出对象:
request
response
out 作用域通信对象: session application pageContext Servlet 对象:
page
config 错误对象:
exception
5
七、Forword(请求转发)与Redirect(重定向)
1、从数据共享上
Forword是一个请求的延续,可以共享request的数据
Redirect开启一个新的请求,不可以共享request的数据
2、从地址栏
Forword转发地址栏不发生变化
Redirect转发地址栏发生变化
八、JQurey总结
jquery是一个轻量级的js框架,具有跨浏览器的特性,兼容性好,并且封装了很多工具,方便使用。
常用的有: 选择器,dom操作,ajax(ajax不能跨域),特效,工具类
九、XML和Json的特点
Xml特点:
1、有且只有一个根节点;
2、数据传输的载体
3、所有的标签都需要自定义
4、是纯文本文件
Json(JavaScript Object Notation)特点:
json分为两种格式:
json对象(就是在{}中存储键值对,键和值之间用冒号分隔,键 值 对之间用逗号分隔);
json数组(就是[]中存储多个json对象,json对象之间用逗号分隔)(两者间可以进行相互嵌套)数据传输的载体之一
区别:
传输同样格式的数据,xml需要使用更多的字符进行描述,流行的是基于json的数据传输。
xml的层次结构比json更清晰。
共同点:
xml和json都是数据传输的载体,并且具有跨平台跨语言的特性。
6
十、request.getSession()、reqeust.getSession(false)和
request.getSession(true)
getSession()/getSession(true):当session存在时返回该session,否则新建一个
session并返回该对象
getSession(false):当session存在时返回该session,否则返回null
十一、Page和PageContext的区别
Page是servlet对象;使用this关键字,它的作用范围是在同一页面。PageContext是作用域通信对象;通常使用setAttribute()和getAttribute()来设置和获取存放对象的值。
十二、Ajax总结
AJAX 全称: 异步JavaScript及 XML(Asynchronous JavaScript And XML)Ajax的核心是JavaScript对象XmlHttpRequest(XHR)。
Ajax的优点:
提高用户体验度(UE)
提高应用程序的性能
进行局部刷新
AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术。
2.通过 AJAX,我们的 JavaScript 可使用JavaScript的XMLHttpRequest对象来直接与服务器进行通信。通过这个对象,我们的 JavaScript 可在不重载页面的情况与Web服务器交换数据,即可局部刷新。
3.AJAX 在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面,减轻服务器的负担,提升站点的性能。
AJAX 可使因特网应用程序更小、更快,更友好,用户体验(UE)好。5.Ajax是基于标准化并被广泛支持的技术,并且不需要插件和下载小程序
十三、JSP9大隐视对象中四个作用域的大小与作用范围
四个作用域从大到小:appliaction>session>request>page application:全局作用范围,整个应用程序共享.生命周期为:应用程序启动到停止。
7
session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记
住这个会话状态。
request:请求作用域,就是客户端的一次请求。
page:一个JSP页面。
以上作用范围使越来越小,request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页(include,forward)。
十四、List,Set,Collection,Collections
1.List和Set都是接口,他们都继承于接口Collection,List是一个有序的可重复的集合,而Set的无序的不可重复的集合。Collection是集合的顶层接口,Collections是一个封装了众多关于集合操作的静态方法的工具类,因为构造方法是私有的,所以不能实例化。
2.List接口实现类有ArrayList,LinkedList,Vector。ArrayList和Vector是基于数组实现的,所以查询的时候速度快,而在进行增加和删除的时候速度较慢LinkedList是基于链式存储结构,所以在进行查询的时候速度较慢但在进行增加和删除的时候速度较快。又因为Vector是线程安全的,所以他和ArrayList相比而言,查询效率要低。
十五、java的基本数据类型
数据类型 大小 byte(字节)1(8位)shot(短整型)2(16位)int(整型)4(32位)long(长整型)8(32位)float(浮点型)4(32位)double(双精度)8(64位)char(字符型)2(16位)boolean(布尔型)1位 附加:
String是基本数据类型吗?(String不是基本数据类型)String的长度是多少,有限制?(长度受内存大小的影响)
十六、冒泡排序
public class Sort { public static void sort(){
8
} Scanner input = new Scanner(System.in);int sort[] = new int[10];int temp;System.out.println(“请输入10个排序的数据:”);for(int i = 0;i < sort.length;i++){
sort[i] = input.nextInt();} for(int i = 0;i < sort.lengthi1)* num;
} } public static void main(String[] args){
System.out.println(multiply(10));} }
二十、UE和UI的区别
UE 是用户体验度
UI 界面原型(用户界面)(相当于买房时用的模型)
设计UI的作用:
1、帮助程序员工作(界面已由美工设计完成)
2、提前让用户对项目有个宏观的了解,知道效果是什么样子。
二十一、osi七层模型
第一层:物理层
第二层:数据链路层
第三层:网络层
第四层:传输层
第五层:会话层 第六层:表示层 第七层:应用层
10
二十二、线程和进程的区别
1.线程(Thread)与进程(Process)
进程定义的是应用程序与应用程序之间的边界,通常来说一个进程就代表一个与之对应的应用程序。不同的进程之间不能共享代码和数据空间,而同一进程的不同线程可以共享代码和数据空间。
2.一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。3.实现线程的两种方式:继承Thread类,实现Runable接口
二十三、jvm的内存结构
java虚拟机的内存结构分为堆(heap)和栈(stack),堆里面存放是对象实例也就是new出来的对象。栈里面存放的是基本数据类型以及引用数据类型的地址。
对于所谓的常量是存储在方法区的常量池里面。
二十四、内存泄露和内存溢出
内存泄露(memory leak),是指应用程序在申请内存后,无法释放已经申请的内存空间.一次内存泄露危害可以忽略,但如果任其发展最终会导致内存溢出(out of memory).如读取文件后流要进行及时的关闭以及对数据库连接的释放。
内存溢出(out of memory)是指应用程序在申请内存时,没有足够的内存空间供其使用。
如我们在项目中对于大批量数据的导入,采用分段批量提交的方式。
二十五、单例
单例就是该类只能返回一个实例。单例所具备的特点: 1.私有化的构造函数 2.私有的静态的全局变量 3.公有的静态的方法
单例分为懒汉式、饿汉式和双层锁式
11
饿汉式: public class Singleton1 {
private Singleton1(){};
private static Singleton1 single = new Singleton1();
public static Singleton1 getInstance(){
return single;
} }
懒汉式:
public class Singleton2 {
private Singleton2(){}
private static Singleton2 single=null;
public tatic Singleton2 getInstance(){
if(single == null){
single = new Singleton2();
}
return single;
} } 线程安全:
public class Singleton3 {
private Singleton3(){}
private static Singleton3 single;
public static Singleton3 getInstance(){
if(null == single){
synchronized(single){
if(null == single){
single = new Singleton3();
}
}
}
return single;
} }
参考:
通过双重判断来保证单列设计模式在多线程中的安全性,并且它在性能方面提高了很多。
12
synchronized在方法上加锁(同步锁)
synchronized在代码块内部加锁(同步代码块)
synchronized(同步锁)
使用synchronized如何解决线程安全的问题? 1.synchronized在方法上加锁 2.synchronized在代码块内部加锁
1.懒汉
2.饿汉
3.双重判断
二十六、解析xml文件的几种技术
1、解析xml的几种技术
1.dom4j
2.sax
3.jaxb
4.jdom
5.dom 1.dom4j
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。
2.sax
SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。
13
3.jaxb
JAXB(Java Architecture for XML Binding)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
2、dom4j 与 sax 之间的对比:【注:必须掌握!】
dom4j不适合大文件的解析,因为它是一下子将文件加载到内存中,所以有可能出现内存溢出,sax是基于事件来对xml进行解析的,所以他可以解析大文件的xml
也正是因为如此,所以dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性
所以sax经常是用来解析大型xml文件,而要对xml文件进行一些灵活(crud)操作就用dom4j
二十七、项目的生命周期
1.需求分析
2.概要设计
3.详细设计(用例图,流程图,类图)4.数据库设计(powerdesigner)5.代码开发(编写)
6.单元测试(junit 白盒测试)(开发人员)svn版本管理工具(提交,更新代码,文档)7.集成测试(黑盒测试,loadrunner(编写测试脚本)(高级测试))
8.上线试运行(用户自己体验)
9.压力测试(loadrunner)
10.正式上线
11.维护
二十八、OSCache的判断
Object obj = CacheManager.getInstance().getObj(“oaBrandList”);//从缓存中取数据 if(null == obj){
obj = brandDao.getBrandList();
//如果为空再从数据库获取数据
//获取之后放入缓存中
14
CacheManager.getInstance().putObj(“oaBrandList”, obj);}
return(List
二十九、经常访问的技术网站
1.csdn(详细步骤的描述)2.iteye(详细步骤的描述)3.oschina(开源中国获取java开源方面的信息技术)
4.java开源大全 下载完毕,并且已经解析为DOM 树了,但很有可能图片还没有加载完毕,所以例如图片的高度和宽度这样的属性此时不一定有效。要解决这个问题,可以使用Jquery 中另一个关于页面加载的方法---load()方法。Load()方法会在元素的onload 事件中绑定一个处理函数。如果处理函数绑定给window 对象,则会在所有内容(包括窗口、框架、对象和图像等)加载完毕后触发,如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发。Jquery 代码如下: $(window).load(function(){ // 编写代码 });等价于JavaScript 中的以下代码 Window.onload = function(){ // 编写代码 } 四
十五、switch默认接受的几种数据类型
Short, int, byte, char
21
四
十六、request 跟session的区别
1.他们的生命周期不同,request对应的是一次请求,session对应的是一次会话
2.request占用资源比较少,相对来说缺乏持续性, 而session资源消耗比较大,所以通常使用request来保存信息
四
十七、找到解决svn冲突方法
对于svn冲突,可以采用手工处理将冲突的部分进行整合,之后备份最新整合后的文件,采用覆盖更新的方式处理完 冲突之后,再把最新整合后的文件进行提交。
四
十八、反射的描述
通过字符串可以动态创建java对象,并且可以动态访问方法,属性等。
我们在项目中的时候封装过数据库jdbc的持久层,其中就利用反射这项
技术来达到通用
和灵活的目的。
22
框架篇
一、Struts1的运行原理
在启动时通过前端总控制器ActionServlet加载struts-config.xml并进行解析,当用户在jsp页面发送请求被struts1的核心控制器ActionServlet接收,ActionServlet在用户请求时将请求参数放到对应的ActionForm对象中的成员变量中,然后ActionServlet则会根据struts-config.xml中的映射关系找到相应的Action中的方法,将对应的ActionForm一并传给这个Action中的方法里,然后执行相应的业务逻辑操作,最后就根据ActionMapping的findforward方法返回一个ActionForward,之后在struts-config.xml中找到与之对应的forward标签,根据它的配置路径找到对应的jsp页面。
二、Struts2的运行原理
1、tomcat 启动的时候会加载 web.xml、核心控制器 FilterDispatcher 会加载并解析 struts.xml
2、客户端会发送一个请求到 action、FilterDispatcher 会根据后缀名进行拦截
3、FilterDispatcher根据 struts.xml 的配置文件信息 找到 某个action 对应的某个类里的指定方法
4、执行相关的业务逻辑最后返回 一个String
5、
三、struts2的体系结构
1、客户端向Servlet容器(例如Tomcat)发送一个请求;
2、这个请求经过一系列的过滤器(Filter);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是jsp或者FreeMarker的模版。(体系结构图见下一页)
23
四、Spring MVC运行原理
整个处理过程从一个HTTP请求开始:
1.Tomcat在启动时加载解析web.xml,找到spring mvc的前端总控制器DispatcherServlet,并且通过DispatcherServlet来加载相关的配置文件信息。
2.DispatcherServlet接收到客户端请求,找到对应HandlerMapping,根据映射规则,找到对应的处理器(Handler)。
3.调用相应处理器中的处理方法,处理该请求后,会返回一个ModelAndView。
4.DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将要显示的数据传给对应的视图,最后显示给用户。
24
五、Struts1.x与Struts2.x的区别
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,struts1严重依赖于servletAPI, 属于侵入性框架,struts2不严重依赖于servletAPI,属于非侵入型框架。线程模型方面:
Struts1的Action是单实例的, 一个Action的实例处理所有的请求。
Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象), 没有线程安全方面的问题 封装请求参数:
Struts1中强制使用ActionForm对象封装请求的参数。
Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。struts1的前端总控制器(核心总控制器)为ActionServlet, struts2的前端总控制器(核心总控制器)为FilterDispather
六、Spring MVC、struts1和struts2区别
1.spring mvc 单例 非线程安全
struts1单例 非线程安全
struts2线程安全对每个请求都产生一个实例 2.spring mvc的入口是servlet,而struts2是filter
spring 的前端总控制器为 DispatcherServlet
struts2 的前端总控制器为 FilterDispatcher
struts1 的前端总控制器为 actionServlet 3.参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。springmvc 用方法来接受参数
4.spring mvc是基于方法的设计,而sturts是基于类
七、Struts2中result中的type类型
1.dispatcher:它是默认的,用来转向页面,通常处理JSP 2.redirect:将用户重定向到一个已配置好的URL 3.redirectAction:将用户重定向到一个已定义好的action 4.chain:将action和另外一个action链接起来 5.freemarker:呈现Freemarker模板
6.httpheader:返回一个已配置好的HTTP头信息响应
7.stream:向浏览器发送InputSream对象对下载的内容和图片非常有用 8.velocity:呈现Velocity模板
25
9.xslt :该XML可以通过XSL模板进行转换
10.plaintext:显示原始文件内容,例如文件源代码
八、Struts2标签
首先需要引用 <%@taglib prefix=“s” uri=“/struts-tags”%> 1.
3.
个页面中
4.
5.
6.
7.
8.
9.
最常用的是:
判断
循环
输出
九、SSI整合
1、Action继承于Actionsupport
2、引入struts-spring-plugin.jar包,从而完成struts和spring的整合
3、在struts2的action中注入service,保证service的名字和配置文件中的一致,并生成get,set方法
4、Dao层继承于SqlMapClientDaoSupport
5、在dao层的配置文件中注入sqlMapClient
十、SSH整合
1.首先在web.xml中通过ContextLoaderListener来融入spring,并加载spring的相关配置文件
2.同样配置sturts2的前端总控制器filterDispatcher来过滤相关的 请求并且加载struts.xml
26
3.action继承ActionSupport,然后通过引入struts-spring-plugin.jar 包并且根据配置文件中service的id生成get,set方法来注入service层。
4.dao层继承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory.5.通过spring中的配置文件加载hibernate.cfg.xml文件从而融入hibernate.在ssh框架中是怎么整合spring? 首先在web.xml中通过ContextLoaderListener来融入spring,并加载spring的相关配置文件
在ssh框架中是怎么整合hibernate? 通过spring中的配置文件加载hibernate.cfg.xml文件从而融入hibernate dao层继承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory
在ssh框架中是怎么整合struts2? 配置sturts2的前端总控制器filterDispatcher来过滤相关的 请求并且加载struts.xml
十、Spring MVC整合
1.首先,要在web.xml里面配置SpringMVC的核心控制器,DispatcherServlet,对指定的后缀请求进行拦截。
2.Controller层要加 @Controller注解,表明该类是MVC的控制层。
3.创建Service接口,给接口加上注解 @Component或者 @Service 表明这是Service业务处理层
4.在Controller层声明Service变量(属性),给变量(属性)加上 @Autowired注解,通过自动绑定机制将Service注入到Controller。(注:@Autowired默认是ByType,如果想根据属性名注入,那么就再加上注解 @Resource(name=“属性名”))5.在Controller层的方法上加上注解 @RequestMapping(“requestAddress”)表明该方法的请求地址
6.Dao层要加上注解 @Repository 表明这是数据库持久层 7.同样将dao实例注入到service层中。
8.配置视图解析器 “InternalResourceViewResolver”,对处理后的跳转进行统一配置。
27
十一、Hibernate 中get 和 load的区别
加载方式:
load为延迟加载(返回的是一个只有id属性的代理,只有使用该对象属性时,才
发出sql语句);
get为立即加载(执行时,会立即向数据库发出sql语句)返回结果:
load检索不到记录时,会抛ObjectNotFoundException异常
get检索不到记录时,会返回null
十二、Hibernate、Ibatis、Jdbc三者的区别
Hibernate属于全自动,Ibatis属于半自动,Jdbc属于手动,从开发效率上讲hibernate较高,ibatis居中,jdbc较低,从执行效率上讲hibernate较低,ibatis居中,jdbc较高,因为jdbc是手工写sql语句,程序员对sql的控制能力更大,可以根据业务需要进行优化,而ibatis虽然也可以对sql进行优化,但是他里面将resultset封装为实体的过程中采用了反射机制所以一定程度上影响了性能,而hibernate因为高度封装所以开发效率相对较高,但正因为这个原因,所以程序员在对sql语句的控制和优化方面相对比较弱,而且在将resultset封装成实体的过程中也采用了反射机制,所以在性能方面较低
十三、Hibernate的运行原理
首先通过configuration去加载hibernate.cfg.xml这个配置文件,根据 配置文件的信息去创建sessionFactory,sessionFactory是线程安全的,是一个session工厂,用来创建session,session是线程不安全的,相当于
jdbc的connection,最后通过session去进行数据库的各种操作,在进行操作 的时候通过transaction进行事务的控制。
十四、Hibernate五大核心(类/接口)简述
1.Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。(加载 hibernate.cfg.xml)并创建一个SessionFactory对象。2.SessionFactory接口
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建 Session对象。SessionFactory是线程安全的。3.Session接口
Session(会话)接口是Hibernate应用使用的主要接口。Session接口负责执行被持久化对象的CRUD操作(增删改查)。Session对象是非线程安全的。Session 相当于jdbc的connection 4.Query与Criteria接口
总之Query和Criteria接口负责执行各种数据库查询。5.Transaction接口
28
Transaction(事务)负责操作相关的事务。
十五、Hibernate与JDBC的区别
1、hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象(即hibernate操作的是对象),而jdbc则是直接操作数据库.2、Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合
3、Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。
4、如果正确的使用JDBC技术,它的执行效率一定比hibernate要好,因为hibernate是基于jdbc的技术.5、JDBC使用的是SQL语句,Hibernate使用的是HQL语句,但是HQL语句最终还会隐式转换成SQL语句执行。
十六、Hibernate中的两大配置文件
*.hbm.xml:主键生成策略,映射关系,一对多,一对一的关系。
Hibernate.cfg.xml:方言(用哪个数据库),数据库连接信息,包含*.hbm.xml内容,映射 文件,也可以配事务。
十七、Hibernate事务处理
开启事务 session.beginTransaction();执行相关的操作,如果成功则session.getTransaction().commit();执行操作失败则 session.getTransaction.rollback();
十八、Hibernate的三种状态以及状态的转换
Transient(临时)
new 一个初始化对象后,并没有在数据库里保存数据,处于临时状态; Persistent(持久化)
当执行save()方法,调用session.close()方法之前,内存中的对象与数据库有
对应关系处于持久化状态;
Detached(托管/游离)
当执行session.close()之后,处于托管状态; 状态的转换
处于托管状态下,调用update()方法后,转换为持久化状态;
在持久化状态下,执行delete()方法后,转换为临时状态;
在未初始化对象之前,调用get(),load(),find(),iterate()之后,直接进入持久化
状态。
29
十九、分页步骤
①前台封装一个显示分页的组件 ②查询总条数
③后台封装分页工具类,计算开始位置、结束位置、总页数 ④后台写支持分页的sql语句
⑤前台包含分页组件,实现分页效果
注意: 查询总条数的where和查询列表信息的where条件要保证一致。
二十、hibernate缓存概述
hibernate分为一级缓存即session缓存也叫事务级别的缓存以及
二级缓存sessionFactory即应用级别的缓存,还有查询缓存即三级缓存.一级缓存的生命周期和session的生命周期保持一致,hibernate默认就启用了一级缓存,不能将其关闭,可以通过session.clear()和session.evict(object)来管理一级缓存。其中get,load,iterate都会使用一级缓存,一级缓存缓存的是对象。
二级缓存的生命周期和sessionFactory的生命周期保持一致,可以跨session,被多个session共享,hibernate3默认开启二级缓存,也可以手动开启并指定缓存插件如ehcache,oscache 等。二级缓存也只能缓存对象。
三级缓存也叫查询缓存,查询缓存是针对普通属性结果集的缓存, 对实体对象的结果集只缓存id。对query.list()起作用,query.iterate不起作用,也就是query.iterate不使用查询缓存
二十一、Ssh的概述:
ssh是web开发中常见的一种框架 s-struts s-spring h-hibernate 其中struts在框架中充当控制器,实现MVC,主要用来处理用户的请求,和跳转页面。使项目结构清晰,开发者只需要关注业务逻辑的实现即可。
spring在ssh充当粘合剂,粘合struts-sping-hibernate,主要用来进行事物的控制,hibernate-充当数据库持久层,主要用它来与数据库交互,提高开发效率,减轻程序员sql控制要求,而且hibernate通过反射机制,有灵活的映射性,还支持各种关系,一对一,一对多,多对多。
在进行ssh整合的时候,我们应该注意: 1.Action继承于ActionSupport 引入struts-spring-plugin.jar包,从而完成struts和spring的整合
在struts2的action中注入service,保证service的名字和配置文件中的一致,并生成get,set方法
30
Dao层继承于hibernateDaoSupport 在dao层的配置文件中注入sessionFactory
二十二、防止表单重复提交
针对于重复提交的整体解决方案: 1.用redirect来解决重复提交的问题 2.点击一次之后,按钮失效 3.通过loading 4.自定义重复提交过滤器 5.解决struts2重复提交
可以结合s:token标签来解决重复提交问题
利用token的原理:
1.在前端的jsp页面中加入s:token标签,在访问该页面时就会生成 隐藏域,该隐藏域中包含一个随机生成的字符串,并把该字符串
存入session中
2.在struts2的配置文件中加入token拦截器后,当正常访问action 的时候,会从session中取出该字符串,然后和页面隐藏域中提交 字符串做对比,如果一致则正常执行并删除session中存储的字符串。
二十三、JSP标签:
1.JSP include动作
jsp:include 动作
以“
2.JSP指令:<%@ include%><%@
%>
以“<%@ ” 开始,以“%> ” 结束。比如:
<%@ include file = “ Filename” %> 3.JSP输出表达式:<%= %><%=Java表达式 %>
输出变量的值,后边不能加<%=;%> 4.JSP Scriptlet【脚本】:<%;%> <% Java 代码 %>
例子:
<% Calendar now = Calendar.getInstance();%> 5.JSP声明:<%!%> <%!函数或者方法 %>
例子:
<%!String getHello(String name){ return “Hi,” + name + “!”;}
%> 6.迭代标签:
Jstl中的核心标签(core)7.JSP注释:
<%--这也是注释,但客户端不能查看到--%> 8.el表达式:${} 9.jsp:include动作是在运行时动态包含。
@include指令是在编译时包含。
它们两个都只能包含本项目的相关文件,不能包含其他项目的。
如果要包含其他项目的文件可以使用c:import 二
十四、过滤器
filter的概述: filter是一个过滤器,用来在请求前和响应后进行数据的处理。
filter的生命周期是: 实例化--->初始化(init)-->进行过滤(doFilter)--->销毁(destroy)-->释放资源
一个Filter必须实现javax.servlet.Filter接口
在项目中我们通常通过filter进行编码转换,进行安全验证,进行重复提交的判断。
了解(不需要主动说)filter 相当于 拦截器 相当于Spring AOP servlet+jsp+javabean+jdbc+filter encode utf-8
二十五、拦截器的理解
什么是拦截器:
拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用
正如上面 Struts2的Reference中讲述的,Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或者之后执行拦截器的代码。在项目中,我们经常用来拦截通过非正常程序而进行的访问
32
Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。
其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timer、params等。如果在
标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:
...
拦截器是Struts2框架的核心,它主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等工作
在struts-default.xml中有一个默认的引用,在默认情况下(也就是
同时可以减轻代码冗余,提高重用率。
如果要求用户密码、权限等的验证,就可以用自定义的拦截器进行密码验证和权限限制。对符合的登入者才跳转到正确页面。
二十六、Spring融入框架
我们通过在web.xml中配置ContextLoaderListener这个监听器也加载 spring的配置文件,从而融入到项目框架中。
二十七、项目的部署方式
1、如果项目单独部署到tomcat中的时候,应该看tomcat中的server.xml;
2、如果和eclipse结合使用进行项目部署的时候,应该看eclipse里面的server.xml.数据库篇
一、JDBC连接数据库步骤(以MYSQL为例)
1、加载JDBC驱动程序:
通过Class类的forName方法实现,并将驱动地址放进去
成功加载后,会将Driver类的实例注册到DriverManager类中。
33
2、提供JDBC连接的URL、创建数据库的连接
•要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
•使用DriverManager的getConnectin()方法传入指定的欲连接的数据库的路径、数 据库的用户名和密码。
Connection con=DriverManager.getConnection(url , username , password);&&&:“jdbc:mysql://localhost/test?user=root&password=123&useUnicode=true&characterEncoding=utf-8”;
3、创建一个Statement
•要执行SQL语句,必须获得java.sql.Statement实例
•执行静态SQL语句。通常通过Statement实例实现。
•执行动态SQL语句。通常通过PreparedStatement实例实现。
String sql = “”;
Statement st = con.createStatement();
PreparedStatement pst = con.prepareStatement(sql);
4、执行SQL语句
Statement接口提供了executeQuery、executeUpdate、execute三种方法
executeQuery:执行select语句,返回ResultSet结果集
ResultSet rst = pst.executeQuery();
• executeUpdate:执行insert、update、delete语句
pst.executeUpdate();
5、关闭JDBC对象
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源。
二、数据库连接池
数据库连接池的优点运行原理: 在我们不使用数据库连接池的时候,每次访问数据库都需要创建连接,使用完成之后需要释放关闭连接,而这样是很耗费资源的。当我们使用 数据库连接池的时候,在tomcat启动的时候就创建了指定数量的连接,之后当我们程序使用的时候就直接从连接池里面取,而不需要创建,同理,当我们使用完的时候也不需要关闭连接,而是将连接返回到连接池中,供 其他请求继续使用。
DBCP:比较稳定。C3P0: 性能比较高。
34
三、mysql的数据库导入导出
配置:
首先找到mysql的安装目录,进入bin目录下复制路径 将mysql的bin目录粘贴在计算机环境变量的path中 授权:
登录mysql 将某张表的某个权限赋给某个用户
grant [select,insert,update,delete,create,drop] on [databaseName].[tableName]
to [userName]@[userIP] identified by [„连接口令‟]
grant select,insert,update,delete,create,drop on oa_ssh.user to root@[IP] identified by 'root';将所有库的所有权限赋给某个用户
grant all privileges on *.* to [userName]@[userIp] identified by [„连接口令‟] grant all privileges on *.* to root@[IP] identified by „root';将所有库的所有权限赋给所有用户
grant all privileges on *.* to root@'%' identified by „root‟;
导出本地数据库:
mysqldump-u 用户名-p 数据库名 > 磁盘:导出的文件名(加后缀)
远程导出数据库:
mysqldump-h IP-u 用户名-p 数据库名称 >导出的文件名(加后缀)
远程导出数据表:
mysqldump-u root-p-d--add-drop-table 数据库名称 > 导出文件
名(加后缀)
导入数据:
mysql-u root-p登录成功后 ==》 source 磁盘:导入的文件名(加后缀)
四、jdbc分段批量提交的时候出现异常怎么处理?
通过Map来解决性能问题。首先在分段批量提交的时候,我们不采用事务,这样就保证了合法的数据就自动提交,不合法的数据就自己自动进行回滚,为了避免不合法数据影响后续合法数据的提交,采用定义业务规则字典表,实现对数据的验证,将不合法的数据记录下来,供用户进行后续处理,而合法的数据就全部提交。
五、jdbc批量处理数据
批量处理数据:(代码优化:提高程序执行性能)
35
降低了java程序代码(客户端)和数据库之间的 网络通信的次数。
在jdbc中进行批量插入的核心API为 addBatch,executeBatch
大数据量的插入问题:(jdbc,hibernate,ibatis)
1.每次只插入一条和数据库交互多次(很耗时间)
2.批量插入和数据库只交互一次(内存溢出)
3.分段批量插入(推荐)
jdbc批量处理数据是通过PreparedStatement对象的 addbatch(), executebatch()clearbatch()进行和数据库的交互。通常我们使用分段批量处理的方式 这样可以提高程序的性能,防止内存溢出。
1.每个sql语句都和数据库交互一次(非批量操作)2.只和数据库交互一次(批量操作)(内存溢出)当数据达到一定额度的时候就和数据库进行交互,分多次进行(分段批量操作)
(500或者1000)pst.addBatch();if(i > 0 && i%1000 == 0){
pst.executeBatch();
pst.clearBatch();}
六、Oracle分页
select * from(select * from(select s.*,rownum rn from student s)where rn<=5)where rn>0
七、Oracle的基本数据类型
Oracle的基本数据类型(常用):
1、字符型
Char 固定长度字符串
占2000个字节 Varchar2 可变长度字符串 占4000个字节
Nvarchar2 占2000个字符(最多能存2000个字母/中文)
2、大对象型(lob)
Blob :二进制数据 最大长度4G Blob 用于存一些图片,视频,文件。
36
比如:当我们在进行文件上传时,我们一般把上传的文件存在硬盘上,可以不占用 数据库,下载时,如果项目迁移时,文件也要跟着迁移。因此我们可以把用blob把它存在数据库中。但这样也增加了数据库的负担。
Clob :字符数据 最大长度4G,可以存大字符串
varchar2和nvarchar2都具有一定的局限性,它们长度有限,但数据库中无论用varchar2或nvarchar2类型,还是用clob,在java端都使用String接收。
3、数值型
Integer 整数类型,小的整数。Float 浮点数类型。Real 实数类型。
Number(p,s)包含小数位的数值类型。P表示精度,s表示小数后的位数。
Eg: number(10,2)表示小数点之前可有8位数字,小数点后有2位。
4、日期类型
Date 日期(日-月-年)DD-MM-YY(HH-MI-SS)Timestamp 跟date比 它可以精确到微秒。精确范围0~9 默认为6.八、id、rowid、rownum的区别
rowid物理位置的唯一标识。
而id是逻辑上的唯一标识,所以rowid查找速度要快于id,是目前最快的定位一条记录的方式
rowid和rownum都是”伪数列“ 所谓“伪数列”也就是默认隐藏的一个数列。rownum用于标记结果集中结果顺序的一个字段,它的特点是按顺序标记,而且是连续的,换句话说就是只有有rownum=1的记录,才可能有rownum=2的记录。rownum关键字只能和<或者<=直接关联 如果是>或者=则需要给他起个别名
九、主键和唯一索引的区别?
在创建主键的同时会生成对应的唯一索引,主键在保证数据唯一性的同时不允许为
空,而唯一可以有一个为空数据项,一个表中只能有一个主键,但是一个主键可以
有多个字段,一个表中可以有多个唯一索引。
十、Preparedstatement和statement的区别
用Prepared statement进行开发。Prepared statement是预编译的,而statement不是,在每次执行sql语句的增删改时,如果是一条数据两者没差距,但如果数据量大于1,那么每次执行sql语句statement都要重新编译一次,而Prepared statement不用,Prepared statement的运行效率大于statement;从代码的可维护性和可读性来说,虽然
37
用Prepared statement来代替statement会使代码多出几行,但这样的代码无论从可读性还是可维护性来说,都比直接使用statement的代码高很多档次;最重要的一点,从安全角度来说,使用Prepared statement可以大大提高程序的安全性,因为Prepared statement是用„?‟传参,可以防止sql注入,具有安全性,而statement用的是„+‟字符串拼接,安全性较低。
十一、数据库三范式
第一范式:数据库表中的所有字段值都是不可分解的原子值。
第二范式:需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部
分相关(主要针对联合主键而言)
第三范式:需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关
十二、视图概述
视图可以视为“虚拟表”或“存储的查询”
创建视图所依据的表称为“基表”
视图的优点:
提供了另外一种级别的表安全性:隐藏了一些关键的字段
简化的用户的SQL命令
隔离基表结构的改变
十三、存储过程概述
存储过程(Stored Procedure)
可以包含逻辑判断的sql语句集合。
是经过预编译,存在于数据库中。
通过调用指定存储过程的名字(可有参,可无参)来执行。优点:
简化了复杂的业务逻辑,根据需要可重复使用
屏蔽了底层细节,不暴露表信息即可完成操作
降低网络的通信量,多条语句可以封装成一个存储过程来执行
设置访问权限来提高安全性
提高执行效率,因为它是预编译以及存储在数据库中 缺点:
可移植性差,相同的存储过程并不能跨多个数据库进行操作
大量使用存储过程后,首先会使服务器压力增大,而且维护难度逐渐增加
存储过程的语法:
--下面是在oracle数据库下最基本的语法
38
--仅创建一个名为testProcedure 的无参的存储过程--IS也可以是AS--如果已经存在名为 testProcedure 的存储过程,下面的语法会出现 名称已被使用的错误
--解决办法:
--第一句可以写成 create or replace procedure testProcedure--这样会替换原有的存储过程
--NULL表示任何可以正确执行的sql 语句,但至少一句
create procedure testProcedure IS BEGIN
NULL
END;
存储过程的参数的分类: IN OUT INOUT
注意:
存储过程之间可相互调用
存储过程一般修改后,立即生效。
十四、索引概述
1、索引的概念
索引就是为了提高数据的检索速度。
数据库的索引类似于书籍的索引。
在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。
在数据库中,索引也允许数据库程序迅速地找到表中的数据,2、索引的优点
39 而不必扫描整个数据库.1.创建唯一性索引,保证数据库表中每一行数据的唯一性
2.大大加快数据的检索速度,这也是创建索引的最主要的原因
3.减少磁盘IO(向字典一样可以直接定位)
3、索引的缺点
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
2.索引需要占用额外的物理空间
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
4、索引的分类
1.普通索引和唯一性索引
普通索引:CREATE INDEX mycolumn_index ON mytable(myclumn)
唯一性索引:保证在索引列中的全部数据是唯一的
CREATE unique INDEX mycolumn_index ON mytable(myclumn)
2.单个索引和复合索引
单个索引:对单个字段建立索引
复合索引:又叫组合索引,在索引建立语句中同时包含多个字段名,最多16个字段
CREATE INDEX name_index ON userInfo(firstname,lastname)
3.顺序索引,散列索引,位图索引
40
十五、必背的sql语句
1:oracle 分页
select * from(select t.*, rownum rn from(select * from menu order by id desc)t where
rownum < 10)where rn >=5
2: mysql 分页
select * from music where id limit 5,5
3:oracle中如何快速将一张表的数据复制到另外一张表中(另外一张表不存在,另外一张
表存在,但数据为空)
1、.不存在另一张表时:
create table 新表
as select * from 将要复制的表
2、存在另一张表时:
insert into 新表名
select 字段
from 将要复制的表名
4:音乐专辑
查询出special
Select s.id , min(s.sname),count(m.mid)from special s inner
join ms m on s.id=m.id group by s.id
5:快速删除一张表(不可事物回滚,也就是没有日志记录)
TRUNCATE from 表名
6:inner join
select 查找信息 from 表名 1 inner join 表名2 on 表名1.列名 = 表名2.列名
7:left join
左外连接
select 查找信息 from 表名1 left join 表名2 on 表名1.列名 = 表名2.列名
8:right join
右外连接
select 查找信息 from 表名1 right join 表名2 on 表名1.列名 = 表名2.列名
41
9:oracle中查询遍历树形结构(start with)
select * from extmenu
start with pid=1 connect by prior id = pid
快速删除父节点以及父节点下的所有节点: Delete from extmenu where id in(elect * from extmenu
start with pid=1 connect by prior id = pid)
10:查询出来60-70,80-90,95-100学生的信息
select * from stu where chengji between 60 and 70 or between 80 and 90 or between 95 and 100 select * from stu where chengji > 60 and chengji < 70 or chengji > 80 and chengji < 90 or chengji > 95 and chengji < 100
11:用exists替换in------进行联表查询
select * from dept where exists(select * from emp where emp.deptno=dept.deptno);或
select * from dept d inner join emp e on d.deptno = e.deptno(只查询出两表共同拥有的字段数据)
12:删除表中的重复数据:
delete from xin a where a.rowid!=(select max(b.rowid)from xin b
where a.name = b.name);13:row_number(),rank()over,dense_rank()over 按工资排序
select sal,row_number()over(order by sal desc)rank1,rank()over(order by sal desc)rank,dense_rank()over(order by sal desc)drank
from emp
14:select * from(select emp.* from(dense_rank()over(partition by departNo order by sal desc)rk from emp)Where rk=4
42
十六、ibatis批量
this.getSqlMapClientTemplate().execute(new SqlMapClientCallback(){ public Object doInSqlMapClient(SqlMapExecutor executor)
throws SQLException {
executor.startBatch();
for(int i = 0, n = list.size();i < n;i++){
executor.insert(”productAttach.insertProductAttach“,list.get(i));
}
executor.executeBatch();
return null;} });
ibatis,jdbc,hibernate的分段的实现: 都应该在组装list的时候进行拆分(如:action层加入)if(list.size()% 1000 == 0){ productAttachService.addBatch(list);list.clear();}
if(list.size()> 0)productAttachService.addBatch(list);
43
业务场景篇
一、Spring的概述
Spring 是完全面向接口的设计,降低程序耦合性,主要是事务控制并创建bean实例对象。在ssh整合时,充当黏合剂的作用。
IOC(Inversion of Control)控制反转/依赖注入,又称DI(Dependency Injection)(依赖注入)
IOC的作用:产生对象实例,所以它是基于工厂设计模式的
Spring IOC的注入
通过属性进行注入,通过构造函数进行注入,注入对象数组
注入List集合 注入Map集合注入Properties类型
Spring IOC 自动绑定模式:
可以设置autowire按以下方式进行绑定
按byType只要类型一致会自动寻找,按byName自动按属性名称进行自动查找匹配.AOP 面向方面(切面)编程
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面(切面)编程。
注:OOP(Object-Oriented Programming)面向对象编程
AOP 主要应用于日志记录,性能统计,安全控制,事务处理(项目中使用的)等方面。
Spring中实现AOP技术:
在Spring中可以通过代理模式来实现AOP
代理模式分为
静态代理:一个接口,分别有一个真实实现和一个代理实现。
动态代理:通过代理类的代理,接口和实现类之间可以不直接发生联系,而
可以在运行期(Runtime)实现动态关联。
动态代理有两种实现方式,可以通过jdk的动态代理实现也可以通过cglib
来实现而AOP默认是通过jdk的动态代理来实现的。jdk的动态代理必须要有
接口的支持,而cglib不需要,它是基于类的。
Spring AOP事务的描述:
在spring-common.xml里通过
如:对add* ,delete*,update*等开头的方法进行事务拦截。我们需 44
要配置事务的传播(propagation=”REQUIRED“)特性,通常把增,删,改以外的操作需要配置成只读事务(read-only=”true“).只读事务可以提高性能。之后引入tx:advice,在tx:advice引用 transactionManager(事务管理),在事务管理里再引入sessionFactory,sessionFactory注入 dataSource,最后通过
Spring实现ioc控制反转描述:
原来需要我们自己进行bean的创建以及注入,而现在交给 spring容器去完成bean的创建以及注入。
所谓的“控制反转”就是 对象控制权的转移,从程序代码本身转移到了外部容器。
官方解释: 控制反转即IoC(Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。
所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。
二、事务概述
在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句。当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。
事务的ACID属性
1.原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏)
3.隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰.4.持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的.在JDBC中,45
事务默认是自动提交的,每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚
为了让多个 SQL 语句作为一个事务执行:
(1)执行语句前调用 Connection 对象的 setAutoCommit(false);
以取消自动提交事务
(2)在所有的 SQL 语句都成功执行后,调用 commit();方法提交事务(3)在出现异常时,调用 rollback();方法回滚事务。
三、权限概述
权限涉及到5张表:
用户表,角色表,权限表(菜单表),用户角色关联表,角色权限关联表
当用户登录时,根据用户名和密码到用户表验证信息是否合法,如果合法 则获取用户信息,之后根据用户id再到用户角色关联表中得到相关连的角色
id集合,之后根据角色id再到角色权限关联表中获取该角色所拥有的权限id集合,然后再根据权限id集合到权限表(菜单表)中获取具体的菜单,展现给当前 登录用户,从而达到不同用用户看到不同的菜单权限。
我们通过ZTree来给角色赋权并且通过ZTree来展示菜单,以及通过ZTree来管 理菜单即增加和编辑菜单。
我们做的权限控制到url级别,为了防止用户不登录直接输入url访问的这个弊端,通过拦截器进行拦截验证。
四、OSCache业务场景
在我以前的项目中,我们考虑了系统性能问题,这个时候我们采用了Oscache缓存,刚开始把这个功能交给了项目组中的另外一个同事来做的,但是他做完的时候他发现缓存中明明已经缓存了数据,但是在取得时候发现没有数据,我们项目经理让我去帮忙看看这个问题,我阅读完他的代码之后,我发现了他每次缓存的时候都是调用一个新的缓存对象的方法,结果出现了明明已经走了缓存的方法而取不到数据的问题,通过我多年的工作经验,我就想到了应该用单例模式去封装一个单例工具类来调用oscache。但是,在后来的测试过程中,发现当并发访问的时候也会出现上述的问题,这个时候我直接采取的DCL(双重判定锁)单例模式封装了工具类,既解决了线程安全问题,相对的性能问题也考虑到了,这个问题才得到了完善的解决。
46
五、线程概述
线程的状态以及状态之间的相互转换:
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
实现线程的两种方式:
是继承Thread类或实现Runnable接口,但不管怎样,当new了这个对象后,线程就已经进入了初始状态 wait和sleep的区别:
线程访问:
锁池状态,之后等待锁释放,然后访问代码
wait
等待队列(释放资源)--->调用notify或者notifyall之后锁池状态--->(等待锁释放)--->可运行状态--->运行状态---->访问代码
sleep,join
不释放资源-->结束后直接进入可运行状态--->运行状态---->访问代码
一个java控制台程序,默认运行两个线程,一个主线程,一个垃圾回收线程。线程与进程的区别:
1.线程(Thread)与进程(Process)进程定义的是应用程序与应用程序之间的边界,通常来说一个进程就代表一个与之对应
的应用程序。不同的进程之间不能共享代码和数据空间,而同一进程的不同线程可以共
享代码和数据空间。
2.一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。
六、Ajax请求Session超时问题
我在做项目时有时会遇到session超时问题,如果session超时,平常请求没有什么问题,通过拦截器可以正确跳到登陆页面,可是你如果用ajax请求的话这就出现问题了,因为ajax是异步的,局部刷新,所以登陆界面不会再全页面中显示,他只会显示到页面的一部分当中。所以根据我这几年的经验找到了我认为比较好的一种方法。因为那我用的框架是和struts2集成的,所以就在拦截器中进行设置:
47
首先判断session是否为空就是判断session是否超时,如果超时就取出请求的head头信息request.getHeader(”x-requested-with“),如果不为空就和XMLHttpRequest(Ajax标识)进行比较(request.getHeader(”x-requested-with“).equalsIgnoreCase(”XMLHttpRequest“)))如果相等说明此请求是ajax请求。
如果是ajax请求就可以用response.setHeader(”键“,”值“)来设置一个标识来告诉用户这是ajax请求并且session超时时发出的,这样我就可以在回调函数中取出自己设置的那个唯一标识:XMLHttpRequest.getResponseHeader(”“);如果取出的值是和自己在后台中设置的值一样的话,就证明session已经超时,这样就可以设置window.location.replace(”登陆界面"),来跳转到登陆界面了。
这样做虽然解决了问题,但是,会在每个回调函数中写入那些代码,这样的话代码就会显得特别零散,所以就想能不能定义一个全局的设置所以就找到了jqery的ajaxSetUp方法,通过ajaxSetUp对jqery的ajax进行全局的判断(ajaxSetUp就相当于ajax的拦截器),通过设置ajaxSetUp里的complete,它就相当于回调函数,这样那就弥补了上一方法的不足。我做项目时还用到$(document).ajaxStart(),这是ajax请求时的事件;$(document).ajaxSuccess(),这是AJAX请求成功后的事件。我一般用他们来显示遮罩层和隐藏遮罩层用的加遮罩层是为了不让用户重复提交,更提高了用户体验度,让用户知道已经提交了。
七:java线程池概述
java线程池的工作原理和数据库连接池的差不多,因为每次重新创建线程 都是很耗资源的操作,所以我们可以建立一个线程池,这样当需要用到线程 进行某些操作时,就可以直接去线程池里面找到空闲的线程,这样就可以直接 使用,而不用等到用到的时候再去创建,用完之后可以把该线程重新放入线程池 供其他请求使用从而提高应用程序的性能。
线程池的核心流程: 1.构建一个 ThreadPoolExecutor 并指定默认要创建的线程的数量 2.通过 threadPool.execute()去添加一个个要执行的线程即实现了Runable接口的java类
3.在实现了Runable接口的java类的run方法中写入具体的业务代码 线程池的业务场景:
我在工作的时候,当时一个同事给我提了一个需求,目前有大量的图片 需要处理生产缩略图并进行加水印,因为按照普通的处理方法一个个的 进行处理太慢了,问我有没有好的解决方案,这个时候我就想到了java中 的线程池,我构建了一个线程数为5个线程池,然后采用分段批量提取的
方式每500条为一组数据进行图片信息的提取,然后再把这些通过Threadpool的 execute方法交给线程池中的线程进行处理,即充分使用了CPU硬件资源又加快 了大数据情况下程序的处理效率。
48
我当时在工作的过程中,认识一个做电商的朋友,他们当时公司才起步,很多 技术都不成熟,所以就常常和我探讨一些技术问题,有次他向我请教一个问题,问我如何才能提高网站的性能,我根据自己在项目中的经验以及自己以前阅读的
关于优化方面的资料给他提出了很多建议,如用lucene进行全文检索,用memcached 进行分布式缓存,以及通过spring定时器结合freeMarker模板引擎来生成静态 页面,由于要生成的页面的数量比较多,考虑到程序的性能,我建议他结合 java的线程池进行工作,这样就可以充分使用了CPU硬件资源又加快 了大数据情况下程序的处理效率。
八、OSCache概述
oscache是一个高性能的j2ee框架,可以和任何java代码进行集成,并且还可以通过标签对页面内容进行缓存,还以缓存请求。
我们通常将那些频繁访问但是又不是经常改变的数据进行缓存。为了保证缓存数据的有效性,在数据发生改变的时候,我们要刷新缓存,避免脏数据的出现。刷新缓存的策略有两种,一种是定时刷新,一种手动刷新。
缓存数据的时机通常也分为两种,即在tomcat(web容器)启动时候加载数据进行缓存,另外也可以在用户第一次访问数据的时候进行缓存,这个相当于缓存的立即加载和按需加载。
缓存的层次如下:jsp-->action-->service-->dao,缓存越靠前对性能的提升越大
一个action里面可以有多个service,一个service中可以有多个dao或者多个service
任何类之间都可以进行相互调用,可以通过构造函数传参,set,get传参或者是方法传
参将相关的类连接起来。
九、OSCache+autocomplete+单例业务场景
在我以前做某项目的过程中,其中我们在做产品列表的查询的时候为了提高用户的体验度,我们使用了autocomplete插件来代替select进行品牌的选择,才开始的时候每次都要根据用户输入的信息去查询数据库进行模糊匹配返回结果,后来我们考虑到系统的性能,因此我们采用了oscache缓存,才开始这个功能是交给我们项目组中的另外一个同事来做的,但是他做完后,我们在使用这个工具类的时候,发现有时缓存中明明已经有时我们需要的数据,但是从缓存里面取的时候,发现没有,之后项目经理让我去帮这个同事看看这个问题,我经过阅读他的代码发现,它里面在使用缓存的时候,针对于每次方法的调用都产生一个新的实例,结果导致了上面的问题,这个时候我想起了可以使用设计模式中的单例模式来解决这个问题,才开始我直接采用了普通的单列模式,但是后来在测试的过程中,发现当用户并发量大的时候还是会出现上面的问题,之后我再次考虑了代码,最后发现是因为没有给单列模式加锁的原因,从而导致了大用户并发的时候,线程安全的问题,之后我便在方法上加上了synchronized关键字,解决上述的问题,但是后来测试人员反馈,觉的这段的性能有问题,我考虑之后便采用在方法体内加锁并结合双重判定的方式解决了上面的问题。
49
我们是将数据在tomcat启动的时候加载到缓存中,之后用户进行查询的时候直接从缓存中获取数据,根据前缀匹配进行查询,将结果返回给用户。这样在提高用户体验度的同时也提高性能。
十、缓存概述
应用程序为了提高性能,可以通过使用缓存来达到目的,缓存的存储介质可以 内存或者硬盘,通常将数据存储在内存里,确切的说是jvm的内存中,缓存是 基于Map这种思想构建的,以键值对的方式进行存取,之所以还可以将
缓存的数据存储在硬盘中,是因为内存资源相当有限和宝贵,所以当内存资源 不足的时候,就可以将其存储到硬盘中,虽然硬盘的存取速度比内存要慢,但是 因为减少了网络通信量,所以还是提高程序的性能。缓存可以分为客户端缓存和 服务器端缓存,所谓的客户端缓存通常指的是IE浏览器的缓存,服务器端缓存指 的web服务器的缓存,通常可以通过第三方组件实现,如oscache,memcache
我们通常将那些频繁访问但是又不是经常改变的数据进行缓存。为了保证缓存数据的 有效性,在数据发生改变的时候,我们要刷新缓存,避免脏数据的出现。刷新缓存的 策略有两种,一种是定时刷新,一种手动刷新。
缓存的层次如下:jsp-->action-->service(通常放置在service)-->dao, 缓存越靠前对性能的提升越大
缓存的策略:(缓存空间不足需要进行清理的时候使用)LRU:最近最少使用原则.(理解:存储书)FIFO:先进先出的缓存策略.(理解:排队)
你来说说缓存?说说你对缓存的理解(如果遇到重复的,就可以省略)
我们在项目中使用缓存的目的是为了提高应用程序的性能,减少访问数据库 的次数,从而提高应用程序的吞吐量。我们通常将权限,菜单,组织机构
这些频繁访问但是不经常改变的基础数据进行缓存,其中我在做()某某项目的时候 就通过oscache对ZTree的树形菜单进行了缓存,并且在做的时候和单列设计 模式进行结合,考虑到多线程下的安全问题,还对单例模式加入了双重判定锁 的检查方式。
十一、实现页面静态化业务场景
我们在做某项目时,涉及到程序访问的性能问题,这时候我们想到可以通过静态化来提高用户访问时候的性能,所以我们就采用了freemarker模板引擎,考虑到页面也是要有动态的变化的,所以我们采用spring定时器在每天晚上2点钟的时候定时再次生成html静态
50
第三篇:JAVA基础知识点总结
1)开发Java语言的公司? Sun(Sun Microsystems)太阳微电子公司开发 2)
Java的3个版本?
J2SE(Java2 Standard Edition)标准版
J2EE(Java 2 Platform,Enterprise Edition)企业版 J2ME(Java 2 Micro Edition)微小版
在5.0以后新版本中称作:JavaSE JavaEE JavaME 3)
Java语言的几个主要特点?平台无关性:能运行于不同的平台上
安全性:去掉了指针操作,内存由操作系统分配 面向对象:利用类使程序更加利于维护
分布式:可以使用网络文件和使用本机文件一样容易 健壮性:检查程序编译和运行的错误 4)
Java的三大核心机制
虚拟机机制:利用虚拟机解释字节码执行java程序实现跨平台 垃圾收集机制:自动内存回收
代码安全性机制:加载代码后校验代码后再执行代码 第2章Java语言的开发环境 1)
JDK是什么?
JDK(Java Development Kit)Java开发工具包。包括了JRE,是开发Java的人员必备的开发运行Java程序的工具。2)
JRE是什么?
JRE(Java Runtime Environment)Java运行环境,运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。3)
JVM是什么?
JVM(Java Virtual Machine)Java虚拟机,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。4)
安装JDK的操作系统问题?
必须针对于不同的操作系统下载安装不同的JDK,例如windows下安装针对于windows的JDK,linux下安装针对于linux的JDK。
5)需要配置的相关环境变量? path:用于搜索外部命令,例如编译程序的javac命令,执行程序的java命令
classpath:用于搜索类,即class文件,例如可以在不同的位置执行类文件 6)
配置环境变量的方式? 有两种:临时配置和持久配置
临时配置:在命令行下用set 变量名=变量值,仅在当前命令行窗口有效
持久配置:在我的电脑——属性中配置,持久有效 7)可以编写Java程序的常见开发工具? 记事本,EditPlus,ULTRAEDIT,Eclipse,Jbuilder,NetBeans 8)
Java文件的类型?
有两种:
扩展名为java的文件:是Java源文件,属于编译之前的纯文本文件,存储java源代码。
扩展名为class的文件:是Java类文件,属于编译之后的二进制文件,存储字节码。9)
Java的编译运行原理?
首先编写java源文件,然后编译成class类文件,然后通过虚拟机解释成机器码到硬件执行。
10)Java是编译型语言还是解释型的语言?
既不是完全编译型,也不是完全解释型,是半编译半解释的。第3章Java程序的基本结构 1)
Java语言区分大小写吗?
区分,不管是数据还是标识符或者关键字都区分大小写,例如public不能写成Public,“abc”不能写成“ABC”,int i不能写成INT I等等。2)main方法是作什么用处的? 这是程序的入口方法,是由虚拟机自动调用的。
3)语句必须用分号结束吗? 必须的,但是代码块{}可以用分号结束,也可以不用分号结束
4)
Java中有几种注释,各自的功能
有三种:
单行注释//:加在行首只能注释一行 多行注释/* */:注释多行,但不能嵌套使用
文档注释/***/:用于生成HTML形式的文档,需要配合javadoc命令实现 5)Java语言的数据类型是强类型还是弱类型? 是强类型,意味着每一个变量都必须明确声明数据类型。6)
Java语言中数据类型的划分?有什么区别? 分成基本类型和引用类型两大类。
基本类型:有8种,只能存储单一的值,不以对象的形式存在引用类型:除了基本类型之外其他的都是引用类型,能够存储复杂数据类型,以对象的形式存在 7)
基本类型都有哪8种类型? 布尔类型:boolean 占1字节 字符类型:char 占2字节
整型:byte 占1字节 short 占2字节 int 占4字节 long 占8字节
浮点型:float 占4字节double 占8字节 8)
布尔值可不可以用0或者非0数代替?
不可以,布尔值只能是true和false,不能使用数字,这和C语言是不一样的。9)
直接写个整数10默认是什么类型的?
整型的直接量例如10,100等默认的数据类型都是int型 10)如何让一个整型的直接量变成long型的? 在直接量后面加大写L后者小写l,例如10L 11)整型数据在程序中直接使用可以使用什么进制? 10进制,8进制,16进制,但不能使用二进制 12)浮点运算在Java中有没有误差? 有误差,所以精密运算请使用BigDecimal类 13)直接写一个3.14的直接量是什么数据类型的?
是double型,如果想表示是float的3.14必须写成3.14F或者3.14f,double型的3.14也可以写成3.14D 14)char型采取的是什么类型的字符集?
是Unicode全球统一编码,支持任何世界上官方的语言中的字符
15)常见的转义字符有哪些? 转义序列 名称 b 退格 t 制表 n 换行 r
回车
” 双引号 ’ 单引号 反斜杠
16)常见的Unicode字符对应的编码?
大写的A到Z是对应65到90,小写的a到z是对应97到122,字符0到9是对应48到57
17)空字符是不是用’’(两个并列的单引号)来表示? 不是,空字符用’u0000’来表示,两个并列的单引号什么也不是。
18)点,分号,花括号的各自的作用?
点的作用有两个:一个是使用类或对象中的成员,用对象.成员,再一个就是包名和子包名之间的分隔符,例如顶层包名.子包名 分号的作用是表示语句结束 花括号的作用是代表一个语句块
19)语句和关键字之间可以有任意的空白吗? 可以的,例如System.out.println(100);就是正确的语句,但是关键字本身不能加空白或换行
20)标识符是什么?
标识符就是指在程序中给包,类,接口,方法,变量起的名字 21)标识符有什么起名规则? 1. 应以字母、下划线、美元符开头 2. 后跟字母、下划线、美元符或数字 3. 不能用关键字和保留字
4. 严格区分大小写 5. 名称长度没有限制 22)中文的变量名可以吗?
是可以的,例如 int 数字 = 10;这个语句是正确的。因为java中采取Unicode字符集,所以任何的Unicode中的字符都可以作为标识符的名称,但考虑字符集的支持问题推荐还是使用英文字母命名。
23)关键字和保留字有区别吗?
在1.5后没有区别,都被称作关键字,但是1.5之前认为关键字是在Java中有特殊用途的不允许编程人员擅自改作其他用途,而保留字是在Java中没有特殊用途但不允许编程人员擅自改作其他用途,按此说法goto和const应该是此意义上的保留字。
24)true,false,null可以用作标识符命名吗?
不可以,这3个虽然不是关键字,但都是有特殊用途的值,也不能作为标识符命名
25)一条声明语句可以声明多个变量吗? 可以的,例如以下声明都是正确的int i;int i,j;int i = 10,j;int i,j = 10;
int i = 10,j = 20;
26)变量在没有赋值的情况下可以使用吗?
不可以,变量没有赋值使用会报出变量未初始化的编译错误。27)常量有什么特点?
在声明变量的时候加上final修饰符即为常量,表示这个变量只能被赋一次值。
28)算数运算符有哪些? 基本算数运算符有+-* / % ++--
29)单目运算符,双目运算符,三目运算符都是什么意思? 其实也有叫一元运算符,双元操作符,三元操作符的,指的是
有几个操作数形成一个完整表达式,例如++就是一个单目运算符,只需要一个操作数就可以形成表达式,像i++,而+运算符就是双目运算符,需要两个操作数形成表达式,例如5 + 3,还有三目运算符,例如5 > 3 ? 0 :-1
30)++和--放在前面和放在后面有什么区别?
如果是在一个表达式中,那++放后面表示先运算表达式,然后再进行自增运算,如果在一个表达式中,++放前面,则表示先进行自增运算然后在运算表达式。--同样道理。例如: int i = 10;int j = i ++;//先进行赋值运算然后再进行自增运算j的结果是10
int i = 10;
int j = ++ i;//先进行自增运算然后再进行赋值运算
j的结果是11
31)-5 % 2等于几,5 %-2等于几?
-5 % 2等于-1,5%-2等于1,运算得到是正数还是负数取决于第一个操作数的符号 32)5 / 2 结果是不是2.5?
不是,是2,因为5和2都是int类型,所以不可能得到double型的结果。
33)比较运算符有哪些?
有><>=<===!= 六项基本比较运算 34)任何数据类型都可以使用> < >= <=运算符吗?
不是所有数据类型,例如true>false这个表达式就是编译错误,布尔类型和引用类型的表达式只能用==和!=两个比较运算,例如”abc” <= ”xyz” 这个表达式也是编译错误的 35)’a’ > ’b’这个表达式编译正确吗?
编译正确,’a’和’b’是字符类型,内部用Unicode编码表示的话a是97,b是98,所以实际上比较的是97>98,结果为false 36)逻辑运算符有哪些?
有 &逻辑与,|逻辑或,!逻辑非,^ 异或,&& 短路与,||短路或
37)逻辑与,逻辑或和短路与,短路或有什么区别? 逻辑与和短路与的区别是:
如果是逻辑与&,不管第一个表达式是true还是false,都会执行第二个表达式,例如a > b & x < y,即使a > b为false,也会执行x > y
如果是短路与&&,如果第一个表达式为false,将不会执行第二个表达式
例如a > b && x < y,如果a > b为false,就不会执行x > y
以此类推,逻辑或和短路或的区别是:
如果是逻辑或|,不管第一个表达式是true还是false,都会执行第二个表达式
如果是短路或||,如果第一个表达式为true,将不会执行
第二个表达式
38)与或非三个逻辑运算符的优先级是怎么排列的? “非”优先级最高,“与”其次,“或”优先级最低 39)原码,反码,补码分别是什么意思?
原码:将数字转换为二进制,第一位为符号位,正数为0,负数为1
例如:12的原码是00001100-12的原码是10001100
反码:正数的反码和原码相同,负数的反码将原码符号位之外的位逐位取反
例如:12的反码是00001100-12的反码是11110011
补码:正数的补码和原码相同,负数的补码将反码加1 例如:12的补码是00001100-12的补码是11110100 最后强调一点,计算机存储数据用补码形式来存储。40)位运算符都有哪些?
&与 |或 ^异或 ~非 >>右移 <<左移 >>>无符号右移 41)1<<35怎么理解?
1是int类型是32位,所以需要把35%32=3,所以事实上是和执行1<<3等价的42)数据类型转换需要遵循什么原则?
小类型向大类型转换,是自动转换的,或者说隐式转换的 大类型向小类型转换,是需要强制转换的,或者说显式转换例如:byte b = 1;
short s = b;//自动转换
b =(byte)s;//强制转换
43)byte b = 10这个语句是正确的,为什么10是int型比byte大还不需要强制转换呢?
因为在java中做了特殊处理,其中规定byte,short,char类型可以直接赋予int类型的直接量,例如: byte b = 10;short s = 10;char c = 10;
以上赋值语句都是正确的。
但是不能超出超出类型的范围,例如以下赋值就是错误的: byte b = 128;
如果超出范围,必须得作强制转换,例如以下语句是正确的: byte b =(byte)128;
需要强调的是,必须是int类型的直接量,以下语句就是错误的: byte b = 10L;
10L不是int类型的直接量。
44)byte b =(byte)300;强制转换后的结果是44,是按照什么规律得出来的?
是先把300转换成二进制,然后根据byte类型的大小截取了后8个位
300的补码是00000000 00000000 00000001 00101100
b的结果是:00000000 00000000 00000001 00101100 结果为44 45)byte b =(byte)true;这个转换成立吗?
不成立,布尔值和数字是不兼容的,不能作任何转换。
46)int i =(int)“100”;这个转换成立吗?
不成立,引用类型和基本类型是不能直接强制转换的,需要用包装类的方法来转换。
47)char型和short型哪个比较大?
不能说哪个大,哪个小,这两个类型char的取值是从0~65535,而short类型的取值是-32768~32767,这个两个类型之间的转换都需要强制转换。
48)字符串是不是基本类型?
不是,String是java.lang包中的一个类,是引用类型的,8种基本类型中没有一个是String类型。49)空字符串用什么来表示?
用””(两个并列的双引号)表示,代表0个长度的字符串对象。50)String s = “”;和String s = null;有什么区别?
第一个表示s被赋值,指向了一个字符串对象,第二个表示s没有指向任何对象实例,是真空
51)两个字符串用什么运算符可以连成一个字符串? 用+运算符,例如”abc” + “xyz”最后的结果就是“abcxyz” 52)数学运算符加法和字符串连接符都是+,怎么区分? 是通过运算符两边的操作数来判断的,如果两边的操作数都是数字型的基本类型,则进行数学运算,如果两边的操作数有一个是字符串,则把另一个操作数也转换为则进行字符串连接运算。例如:+ 4 的结果是9 “5” + 4的结果是54
53)判断字符串内容相同用什么方法?
用equals方法判断内容相同,==只能判断引用是否相同 54)提供用户输入使用哪个类 使用javav.util.Scanner类
55)if语句可以用if(-1)形式判断吗? 不可以,数字不能代替布尔值
56)if语句和循环语句的花括号什么时候可以省略?
当执行的语句只有一句的时候 57)switch语句有哪些规则?
表达式expr的返回值必须是下述几种类型之一:int, byte, char, short或枚举常量;
case子句中的值必须是常量,且所有case子句中的值应是不同的,也必须是下述几种类型之一:int, byte, char, short或枚举常量
default子句是任选的;
break语句用来在执行完一个case分支后使程序跳出switch语句块;
58)对于退出循环break和continue有什么区别? break是退出整个循环
continue是退出当前循环继续下一次循环 59)声明数组创建数组的方法? 以下声明都是合法的: int [] a;int a[];String[] a;
以下创建数组对象都是合法的: int[] a = new int[3];int[] a = {1,2,3};int[] a = new int[] {1,2,3};
60)int[] x和String[] s这两个数组对象,哪个是基本类型,哪个是引用类型?
两个都是数组对象,都是引用类型的61)数组元素下标最小是多少,最大是多少,超出范围会怎么样?
最小是0,最大是数组元素个数减一,超出范围将会出现下标越界异常
62)得到数组长度用length属性还是length()方法? 是length属性,得到字符串长度才有length方法
63)声明int[][] a = new int[3][],a是一个二维数组,a[0]本身
是什么类型的?
二维数组的元素都是一维数组,a[0]是int[]类型的 64)数组的大小一经创建可不可以改变大小了? 不可以,数组是定长的,一经创建就不能再改变大小了 65)可以把2个int型,3个double型,4个String型的值放到一个数组中吗?
不可以,数组的元素类型必须是相同类型的。66)java中的多维数组必须是要形成矩阵排列吗? 不一定,也可以是不规则的。67)操作数组比较方便的实用类?
java.util.Arrays类提供了很多关于数组的实用方法。第4章对象和类 1)OOP是什么意思? Object Oriented Programming(面向对象编程)
2)
类和对象的区别?
类:对象的蓝图,生成对象的模板,是对一类事物的描述,是抽象的概念上的定义
对象:对象是实际存在的该类事物的每个个体,因而也称为实例 3)
类之间的3种关系? 依赖关系(uses-a)聚集关系(has-a)继承关系(is-a)4)
一个java源文件可以写多个类吗?
可以,但必须只能有一个公有类,并且文件名和公有类的类名相同。5)类中有哪些成员?
有属性(数据域),方法,构造器(构造方法)
6)
构造方法和普通方法的区别?
构造方法没有返回值,方法名必须和类名相同,需要用new语句调用构造方法。7)
普通方法可不可以也类名作为方法名?
是可以的,因为调用普通方法的语法和调用构造器的语法不一样。8)
一个构造器调用另外一个构造器需要用什么语法? 用this()语法调用另外一个重载构造器,需要注意的是调用语句必须是构造器中的第一句 9)
什么时候虚拟机会自动添加一个默认构造器?
当类中没有显式定义任何构造器的时候,虚拟机会自动添加一个无参的构造器
10)实例成员和静态成员的区别?
实例成员:是属于对象实例的,用对象.成员名称语法调用 静态成员:和对象实例无关,是属于类本身的,用类名.成员名称语法调用
11)静态初始化块statci{}的执行时机是什么时候? 在类被加载的时候,仅执行一次。
12)静态方法可不可以直接调用同一个类中的非静态方法? 不可以,静态方法不能直接调用一个非静态成员,需要用对象调用。
13)包是什么?
包实际上就是物理上的文件夹,可以把类放到不同的包中。14)把一个类放到包中,需要在类中加上什么语句? 需要加上包声明package语句,必须写在源文件的第一句。15)什么时候需要导入类?用什么语句?
当使用的类和当前类并不在同一个包中的时候,用import语句导入。
16)默认包中的类可以导入吗?
不可以,不在默认包中的类无法使用默认包中的类。17)java中哪个包中的类是自动导入的? java.lang包
18)什么叫做完整类名? 顶层包名.子包名.类名
19)静态导入语句有什么作用?
在使用类中的静态成员的时候前面不需要加类名前缀。
20)局部变量和全局变量的区别? 区别 局部变量 全局变量
声明位置 方法或块内部 方法外类内部 访问权限修饰符 没有访问权限 有访问权限
默认值 没有默认值
有默认值
使用形式 直接使用 对象调用
作用域
在方法或语句块内部 整个类
生命周期 进入方法或语句块创建退出方法或语句块销毁 随着对象的创建而创建随着对象的销毁而销毁
21)赋值语句赋给目标的是值还是引用?
如果是基本类型则赋的是值本身,引用类型则赋的是引用地址 第5章继承和多态 1)类的继承是谁继承谁?
是子类继承了父类,子类也称为派生类,父类也称为超类或基
类 2)子类继承了父类的什么东西?
子类可以继承父类的数据域(属性),方法,但构造器不能继
承 3)
私有成员能被子类继承吗?
能继承,但是由于访问权限的控制,在子类中不能直接使用父类的私有成员 4)
Object是什么类?
这个所有类的根类,任何类如果没有写显式的继承语句,默认都是直接继承Object类的 5)java中是单继承还是多继承?
是单继承,一个子类只能有一个父类 6)
访问权限修饰符有几种,访问的范围又是多大? 有四种:
private:私用 只能在被类中被访问 default:默认 只能被同一个包中的类访问
protected:受保护的 只能被同一个包中的类和不同包中的子类
访问
public:公有 可以被任何类访问 7)
覆盖方法的规则有哪些?
子类覆盖方法和父类被覆盖方法的方法返回类型,方法名称,参数列表必须相同
子类覆盖方法的访问权限必须大于等于父类的方法的访问权限
方法覆盖只能存在于子类和父类之间
子类覆盖方法不能比父类被覆盖方法抛出更多异常 8)
参数列表是否相同从哪几方面看?
从三方面看:参数个数,类型和顺序,需要注意的是参数的名字不相同是无所谓的 9)
覆盖方法的规则有哪些? 方法名相同
方法的参数类型,个数,顺序至少有一项不同 方法的返回类型和修饰符均不受限制
10)可变长参数的声明格式是什么?实际上是什么类型的? 类型 „ 变量,实际上是一个一维数组 11)this和super是作什么用处的?
this:本身代表当前的对象引用,可以用this.成员名称调用当前对象的属性和方法,如果属性和局部变量重名,可以用this.属性名和局部变量区分开。也可以用this()语法调用本类重载构造器。
super:本事是一个特殊关键字,可以用super.成员名称调用从父类继承的属性和方法,也可以用super()语法调用父类构造器。
12)super代表子类中的父类对象引用吗?
不,这个错误的说法,super不代表任何对象引用,仅仅是一个关键字
13)什么时候子类构造器会自动调用父类无参构造器? 当子类构造器中没有任何显式构造器调用的时候,即既没有this()调用也没有super()调用的时候
14)一个父类类型的引用变量可以引用一个子类的实例吗? 可以,这个引用变量是一个多态对象 15)多态对象有什么特点?
多态对象只能使用父类的成员,但如果多态对象使用了被子类覆盖的方法,则会动态绑定使用子类的成员,称为虚拟方法调用
16)引用类型之间的类型转换需要遵循哪些规则? 自动转换:从子类到父类的类型可以自动转换 强制转换:从父类到子类的类型要强制转换 无继承关系的类型转换是非法的 17)instanceof操作符是作什么用处的?
可以判断一个对象的类型是否是某一个类的类型或子类,也可以判断这个对象的类型是否是一个接口的实现类 18)toString方法什么时候会自动被调用?
在打印语句中传入引用类型的对象或者对象和字符串作连接时
19)默认的equals方法实现的是比较内容还是比较引用地址?
在Object中是比较引用地址。
20)覆盖equals方法和hashCode方法有什么规则? 必须保证当两个对象equals比较为true的时候,返回的hashCode相同,当比较为false的时候,返回的hashCode不同21)java中有几个包装类?
有8个包装类,正好对应8种基本数据类型。
分别是:Boolean Byte Short Integer Long Character Float Double 22)装箱和拆箱分别是什么意思?
装箱指的是把基本类型包装成包装类的引用类型 拆箱指的是把包装类形式的引用类型转换为基本类型 例如:
Integer objInt = new Integer(10);//装箱
int i = objInt.intValue();
//拆箱
23)JDK1.4和1.5的装箱和拆箱有什么区别?
自动拆装箱,例如: Integer intObj = 10;//自动装箱 int i = intObj + 5;//自动拆箱
24)final修饰符如何使用,使用了final修饰符有什么特点? final修饰符可以修饰类,方法,变量 final类为最终类,不能被子类继承 final方法为最终方法,不能被子类覆盖 final变量为常量,只能赋一次值
25)abstract修饰符如何使用,使用了abstract修饰符有什么特点?
abstract修饰符可以修饰类和方法 abstract类为抽象类,是不能创建对象的abstract方法为抽象方法,只有方法的声明,没有具体的实现 需要注意的是:
有抽象方法的类一定是抽象类 抽象类不一定有抽象方法
抽象类也有构造器,但不能创建对象实例 26)abstract不能和哪些修饰符配合使用? 不能和private,static,final一起使用 27)可以在非抽象方法中调用抽象方法吗? 可以,模板方法设计模式就是典型的这种调用 第6章 泛型程序设计 1)泛型的特点是什么? 主要特点是类型参数化,后期绑定数据类型 2)泛型支持基本类型吗?
不支持,只支持引用类型 3)如果没有传入类型参数,默认是什么类型? 默认是Object类型
4)泛型方法有什么特点?
将泛型参数声明在方法中,调用方法的时候绑定泛型 5)
泛型类声明泛型参数的时候,
么意思?
表示绑定的类型必须是A类型后者是A类型的子类或实现类 第7章 接口和内部类
1)声明一个接口的关键字是什么? interface关键字
2)
接口中的成员有什么特点?
数据域必须是(public static final修饰)公有静态常量 方法必须是(public abstract修饰)公有抽象 没有构造方法 3)接口能创建对象实例吗? 不能,接口没有构造器,不能创建对象
4)
接口和类的关系?
接口和类之间是实现关系,一个类用implements语句实现了某接口,这个类被称为接口的实现类,一个类可以实现多个接口,一个类实现了某接口,必须覆盖这个接口中的所以方法,否则这个类必须是个抽象类 5)
接口和接口的关系?
接口和接口之间是继承关系,一个接口用extends继承另外一个接口,称为这个接口的子接口。一个接口可以继承多个父接口 6)
内部类如何定义?
一个类声明在另一个类的里面,这个类就被称为内部类,而外面的类被称为外部类 7)
内部类可以分成几种?
实例内部类:声明在方法外边没有static修饰符 静态内部类:声明在方法外边有static修饰符 局部内部类:声明在方法里边 8)
如何创建实例内部类的对象实例? 需要用外部类的对象来创建 例如: class A {class B {
}
}
如果像创建B类的实例,则必须用以下语句: A a = new A();A.B b = a.new B();9)
如何在实例内部类中访问外部类的成员?
在实例内部类中可以直接使用外部类的成员,不需要创建外部类的对象实例,但是如果在内部类中的成员名称屏蔽隐藏了外部类的成员(即外部类和内部类的成员名相同),则需要用“外部类名.this.成员名”访问外部类成员 第8章异常处理
1)异常的对象的根类是哪个类? 是Throwable类
2)
Throwable类有哪两个分支?
分成Error类和Excepion类两个分支 Error类表示严重错误
Exception类表示可以在程序中处理的错误 3)
Exception类有哪两个分支?
分成运行时异常和非运行时异常(已检查异常)运行时异常编译不检查,在运行时才会发生异常
已检查异常编译时就会作检查,不处理异常则通不过编译 4)如果在try块中发生异常,那么程序将会跳转到哪? 会跳转到catch语句块 5)catch语句可以用父类类型捕获子类异常吗? 因为有多态特点,是可以的6)处理异常代码finally语句会在什么时候执行? finally代码在任何时候都会执行,不管有没有发生异常。7)
如何声明已检查异常,由谁来处理这个异常? 用throws语句来声明一个已检查异常,由方法的调用者来处理这个异常 8)
如何抛出一个异常? 用throw语句抛出
9)如何创建一个自定义的异常类? 创建一个类,只要让它继承任何一个现有的异常类就可以了 10)覆盖方法对于异常有什么要求? 覆盖方法不能比父类方法抛出更多异常 第9章反射,代理,标注
1)
获得一个类型的Class对象有哪几种途径?
方法1:对象.getClass()方法2:类型名.class 方法3:Class.forName()2)
反射相关的类型都有哪些? Class 代表一个运行时类 Field 代表一个类的属性 Method 代表一个类的方法 Constructor 代笔一个类的构造器 3)
如何声明一个自定义标注? [<修饰符>] @interface <标注名>{ 返回值方法名称(); 返回值方法名称(); „„ } 例如:
public @interface MyComment { int id();String info();} 4)
java有几个内置标注? 有3个
@Override——用于修饰此方法覆盖了父类的方法,而非重载。@Deprecated——用于修饰已经过时的方法。
@SuppressWarnings——用于通知Java编译器禁止特定的警告。第10章 java常用类 1)
字符串String是可变类还是不可变类?
是不可变类,一经创建就不能修改其内容了 2)
字符串的常用方法有哪些? charAt方法:可以返回指定位置的字符 substring方法:可以截取子字符串 length方法:返回字符串长度 indexOf方法:查找子串的位置 lastIndexOf方法:反向搜索字串的位置 replaceAll方法:替换字符串 split方法:分解字符串
toLowerCase, toUpperCase方法:字符串大小写转换 3)StringBuffer类和String类有什么区别? StringBuffer是可变类,String是不可变类
4)StringBuffer类和StringBuilder类有什么区别? StringBuffer类是线程安全的,StringBuilder类是线程不安全的5)Math类主要提供了哪些方法?
Math类提供了大量的和数学运算相关的静态方法 6)Set集合和List集合共同的父接口是什么? 是Collection集合7)
Set集合和List集合有什么区别? Set: Collection的子接口,不记录元素的保存顺序,且不允许有重复元素
List: Collection的子接口,记录元素的保存顺序,且允许有重复元素 8)
ArrayList和LinkedList有什么不同?
ArrayList 的内部实现是基于内部数组Object[],所以从概念上
讲它更像数组
LinkedList的内部实现是基于一组连接的记录,所以它更象一个链表 结构,所以它们在性能上有很大的差别。ArrayList 随机访问比较块,但插入和删除元素比较慢 LinkedList但插入和删除元素比较快,但随机访问比较慢 9)
HashTable和HashMap有什么不同?
HashTable是线程安全的,HashMap是线程不安全的10)Vector和ArrayList有什么不同? Vector是线程安全的ArrayList是线程不安全的 第11章 IO流 1)
流分成哪两类?
按照单位划分分成字节流和字符流。按输入输出分成输入流和输出流 2)
和文件流相关的有那几个类? FileInputStream文件输入字节流 FileOutputStream文件输出字节流 FileReader文件输入字符流 FileWriter文件输出字符流 3)
文件流操作应该用字节流还是字符流? 如果是纯文本文件应该用字符流 如果是二进制文件应该用字节流 4)
文件操作用哪个类? 用java.io.File类 第12章 线程 1)
创建一个线程类的两种方式? 继承Thread类 实现Runnable接口 2)线程体应该放在哪个方法里面? run方法 3)启动新的线程用什么方法?
用start方法
4)一个线程对象能够用start多次启动吗? 不可以,一个线程方法只能start一次
5)线程有哪几种主要状态? 有四种,分别是:新生状态,可运行状态,阻塞状态,死亡状
态 6)
线程的同步需要用什么方法? 旧的方法是用synchronized关键字
新的方法是用ReentrantLock类的lock和unlock方法
第四篇:java知识点总结目录.
1:J2SE 面向对象-封装、继承、多态 内存的分析 递归 集合类、泛型、自动打包与解包、Annotation IO 多线程、线程同步 TCP/UDP AWT、事件模型、匿名类 正则表达式 反射机制 2:数据库(Oracle或者MySQL)SQL语句 多表连接,内外连接,子查询等 管理表、视图、索引、序列、约束等 树状结构存储 存储过程、触发器 数据库设计三范式、3:JDBC JDBC基础 连接池 树状结构存储与展现 DataSource & RowSet JDBC连接Oracle及MySQL 4:HTML_CSS_JAVASCRIPT html、css、javascript基础语法 JavaScript Form判断 Dom编程基础(事件处理等)JS常用效果如TreeView、下拉联动等 JS学习方法 JS调试方法 DreamWeaver初步(建立HTML、Table、Form、CSS)等 5:Servlet & JSP tomcat基础 servlet基础 web.xml配置基础 web application的结构 servlet生命周期 request response等常用方法 ServletContext类 HTTP协议基础(GET POST)Cookie Session Application JSP的几种语法(包括JSTL等)注意在项目中练习,不要拘泥于语法细节而裹步不前。6:Struts 多层架构理论 Model 1 and Model 2 Struts基本概念 MVC Action与业务逻辑类的关系 在Struts与JSP之间传递数据 Struts处理流程(控制流)Struts TagLib(了解常用的)JSTL ActionForm 字段收集 上传文件 类型转换 DTO 动态Action Form 验证框架 ActionForward 转发与重定向 动态生成ActionForward 全局与局部的ActionForward Action Forward Scope UnknownActionMapping Action的线程安全 I18N 如何切换语言环境 Struts异常处理机制 程序处理 自动处理 自定义异常处理器 Struts的多模块配置 7:XML(XML/XSL、XSLT/DTD、SCHEMA等基础的概念、关于Java的编程可以暂时扔在一边)8:Hibernate OR Mapping原理 Hibernate基础开发步骤 Hibernate基本接口(重点Session)普通属性映射 关联关系映射 Native SQL inverse lazy cascade 继承关系映射 HQL 性能优化 一级缓存 二级缓存 查询缓存 事务与并发 悲观锁、乐观锁 OpenSessionInView CurrentSession(至于JTA、联合主键、自然主键、动态主键、Any类型 Creteria Queries Intercepter and Event 自定义类型等,可以暂时扔在一边)9:Spring IOC/DI Spring配置 Spring架构 AOP及Spring AOP 声明式事务(AOP)Spring + Hibernate Spring支持Web Scope(其他的Spring模块对于自学来说可以暂时扔在一边)10:EJB3.0 J2EE架
构基础(JTA JMS等)EJB基础(地位及基本理论、分类等)Annotation Ant编译与部署EJB Session Bean EJB的依赖注入 Persistence API(可以
用JBoss学习EJB3.0)
第五篇:Java基础知识点总结-Ch1
Java基础知识点总结
第一章 Java语言概述
1.面性对象语言的基本特征。
Java语言的特点。最大优势。
Java语言是区分大小写的。
2.Java虚拟机的核心。
环境变量classpath设置中的“.;”是指可以加载应用程序当前目录及其子目录中的类。环境变量的变量值的最后是以“rt.jar;.;”结束。
3.编写源文件时不可以使用Word编辑器,因为他含有不可见字符。
要用记事本或Edit。源文件的扩展名是java。
4.一个Java应用程序的源文件必须有一个类含有public static void main(String args[ ])的方法,这样类的应用程序叫做主类。
5.源文件的名称必须与有public修饰的类的名称相同。
若源文件有多个类,那么只能有一个是public类;
若只有一个类是 public类,那么源文件的名字必须与这个类的名字完全相同,扩展名是.java;
若源文件没有public类,那么源文件的名字只要和某个类的名字相同即可,并且扩展名为.java。
6.编译时,Java编译器是什么。
进入某个文件夹的命令是“cd 目录名”;退出某个文件夹的命令是“cd..”。
7.编译源文件后将生成多个扩展名为.class的文件,每个扩展名是.class的文件夹存放一个类的字节码文件,文件名与该类的类名相同。这些字节码文件被存放在与源文件相同的目录中。
8.运行时,Java解释器是什么。
Java应用程序总是从主类的main方法开始执行。
9.在运行字节码文件是不可以带有扩展名。
当Java应用程序有多个类时,Java命令执行的类名必须是主类的名字(不带扩展名)。
10.例子:有一个源文件名字叫Apple.java,其中包括3个类,名字分别是Apple, Banana, Orange,有1个是主类,则主类名是什么,生成多少个字节码文件,字节码文件名称是什么,在编译,运行时语句分别是怎样的。
11.Application程序又称什么,Applet程序又称什么,哪一个是源文件编译时运行的程序。
12.J开发一个Java程序要经过的三个步骤。
13.单行注释,多行注释的标记分别是什么
14.javac *.java的意思。
15.Allmans风格又称什么,Kernighan风格又称什么,两者各自的意思是什么。