还剩41页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
1.java语言是强类型还是弱类型语言为什么?Java是强类语言,在使用变量时有如下规则变量必须声明,并且初始化以后才能使用变量必须有明确的类型(type)变量不能重复定义javascript是一种弱类型语言,即变量在声明时,不能明确声明其类型变量的类型是在运行时确定的,并且可以随时改变
2.JAVA的数据类型有哪些?⑴基本数据类型(八种)整型byte1字节short2字节int4字节long8字节浮点型float4字节double8字节【float类型共32位(不int相同),其中1位为符号位指数8位尾数23位】【double类型能表示64位,其中1位符号位11位指数52位尾数】【浮点数的字面量默认是double】字符型char2字节【unicode编码值】boolean型boolean1字节【值只有true和false】隐式类型转换正方向:charbyteshortintlongfloatdouble负方向:⑵引用类型(自定义类型):对象:比如String数组:int[]接口interface
3.JAVA中成员变量和局部变量的区别⑴成员变量是在类范围内定义的(也叫成员属性)类属性使用static修饰的就是类属性作用域:类属性的作用域与这个类的生存范围相同,它作为类的一个成员,与类共存亡只要类存在,程序就可以访问该类的类属性实例属性不被static修饰的就是实例属性作用域实例属性则从这个类的实例(对象)被创建开始存在,直到系统完全销毁这个实例,它作为实例(对象)的一个成员,与实例(对象)共存亡只要实例存在,程序就可以访问该实例的实例属性⑵局部变量在一个方法内定义的变量(包括方法的形式参数)
1.形参作用域是整个方法体
2.方法局部变量一个代码块中
3.代码块局部变量一个代码块中注意局部变量除了形式参数外,都必须显示初使化必须显示指定初使值否则不可以访问它们形式参数不须显示初使化,它在被调用时由系统完成
4.前++和后++的区别?i++后++先将i的值作为整个表达的值然后将i增加1++i先++先将i增加1然后将i的值作为整个表达的值
5.短路运算符和非短路运算符的区别短路运算符[条件1条件2],如果条件1不成立,则条件2不执行;非短路运算符[条件1条件2],两个条件都会执行
6.怎样取得数组的长度?数组:arr.length集合:list.size字符串:str.length
7.实现数组拷贝(复制)的2种方法System.arraycopysrcsrcPosdestdestPoslength;src-源数组srcPos-源数组中的起始位置dest-目标数组destPos-目标数据中的起始位置length-要复制的数组元素的数量Arrays.copyOfsrclength是JDK
1.6版本提供的方法,比起System.arraycopy使用更简便.注:当然,可以用新建数组用for循环的方式进行复制
8.java中的4种访问制权限有哪些?分别作用范围是什么?
1.public最大访问控制权限,对所有的类都可见
2.protect修饰的,在类内部、同一个包、子类中能访问
3.default包访问权限,即同一个包中的类可以可见默认不显式指定访问控制权限时就是default包访问控制权限
4.private最严格的访问控制权限,仅该类本身可见注:访问控制修饰符可以修饰类,成员变量,方法,但是修饰类只用public和default
9.JAVA5的新特性有哪些1循环For-each循环fortypevariable:array{body}fortypevariable:arrayList{body}而
1.4必须是forinti=0;iarray.length;i++{typevariable=array[i]; body}forinti=0;iarrayList.size;i++{typevariable=typearrayList.geti;body}2泛型以ArrayList为例,包括创建一个容器对象和取得容器内对象操作
1.5ArrayListTypearrayList=newArrayListType;arrayList.geti
1.4ArrayListarrayList=newArrayList; TypearrayList.geti3自动装箱拆箱在JDK
5.0以前,在原始类型与相应的包装类之间的转化是不能自动完成的要完成这种转化,需要手动调用包装类的构造函数,在JDK
5.0环境中,可以自动转化
1.5Integerwrapper=n; intn=wrapper;
1.4Integerwrapper=newIntegern; intn=wrapper.intValue;自动装包/拆包大大方便了基本类型数据和它们包装类地使用自动装包基本类型自动转为包装类.intInteger;自动拆包包装类自动转为基本类型.Integerint;4静态导入静态导入功能对于JDK
5.0以前的版本是不支持的importstaticjava.lang.Math;importstaticjava.lang.System;...
1.5out.printlnsqrtPI;
1.4System.out.printlnMath.sqrtMath.PI;5可变参数Varargs可变参数使程序员可以声明一个接受可变数目参数的方法注意,可变参数必须是函数声明中的最后一个参数在JDK
1.5之前,可以用重载来实现,但是这样就需要写很多的重载函数line1publicvoidwriteObject...objs{line2forObjectobj:objsline3System.out.printlnobj;line4}
10.面向对象编程中几种对象组合方式——is-a/has-a/use-a
1.is-a组合一个类继承具有相似功能的另一个类,根据需要在所继承的类基础上进行扩展优点具有共同属性和方法的类可以将共享信息抽象到父类中,增强代码复用性,同时也是多态的基础缺点子类中扩展的部分对父类不可见,另外如果共性比较少的时候使用继承会增加冗余代码
2.has-a组合has-a组合是在一个类中引用另一个类作为其成员变量优点可扩展性和灵活性高在对象组合关系中应优先考虑has-a组合关系缺点具有共性的类之间看不到派生关系
3.use-a组合是一个类中使用到了另外一个类,依赖关系
11.构造方法(构造器)特点?Java中的构造器(构造方法)声明在类内部方法名与类名一致的方法叫构造方法构造方法不能声明返回值类型构造方法可以包含参数,参数一般是创建对象实例必须依赖的条件(前提条件)子类默认调用父类的无参构造器,如果父类没有无参构造器,那么子类必需显示的去调用父类的有参构造器如果一个类没有提供无参构造器,那么编译器将会自动提供一个无参构造器
12.JAVA中属性和方法的静态绑定和动态绑定?静态绑定Java根据引用变量类型查找属性动态绑定java根据实际的对象查找方法
13.JavaBean规范1必须有包(package)2Java类,具有无参数构造器3有用getXxx和setXxx声明的Bean属性如getName和setNameStringn声明的Bean属性为name不是否有实例变量name无关boolean类型的get方法可以有两种形式getMarried戒者isMarried4必须实现序列化接口(注在学习IO的时候具体学习)
14.static关键字的特点static静态关键字修饰属性、方法、内部类、代码块static修饰的资源属于类级别,是全体对象实例共享的资源static变量在类加载期间初始化静态代码块是在类加载期间运行的代码块,由于类只加载一次,所以静态代码块只执行一次!
15.final关键字的特点final可以修饰类,方法,变量final修饰的类,不能再被继承final修饰的方法,不能覆盖final方法final修饰的变量final的局部变量,只能初始化不能改final的方法参数,不能改final的引用,引用指向不能改,但是对象的属性可以改
16.常见的final类有哪些?Java的String就是final类,不能被继承!Math是final类,不能被继承!Integer、Long、Character等包装类是final类,不能被继承!
17.抽象类和接口的区别抽象类--不具体的类1抽象方法,只有行为的概念,没有具体的行为实现使用abstract关键字修饰,并且没有方法体2包含抽象方法的类,就一定是抽象类使用abstract关键字修饰,包含抽象方法如平面图形一定可以计算面积publicabstractclassCRMSystem{publicabstractClientaddClientStringnameStringqq;}3抽象方法和抽象类非常适合作为系统的分析和设计的工具4抽象类不能直接创建实例可以定义引用变量5抽象类只能被继承,一个具体类继承一个抽象类,必须实现所有抽象方法接口
1.接口全部的方法都是抽象方法,全部的属性都是常量接口用来表示纯抽象概念,没有任何具体的方法和属性
2.不能实例化,可以定义变量
3.接口变量可以引用具体实现类的实例
4.接口只能被实现,一个具体类实现接口,必须使用全部的抽象方法
5.接口之间可以继承
6.一个具体类可以实现多个接口,实现多继承现象,表示一个概念即是XXX也是XXX.
7.接口中的属性,默认是常量publicstaticfinal
8.接中的方法一定是:publicabstract
9.实现一个接口,使用关键字implements实现实际上是一种继承关系接口和实现类是父子类型的关系
18.重载和重写的区别重载方法名相同,参数不同(参数类型或者长度)重载和修饰符和返回类型无关一是方法的参数列表必须改变,包括参数的类型,参数的个数多少,参数顺序二是重载对返回类型,访问修饰符,异常声明没有任何限制,可以作任意的修改实质上,重载只是创建了一个方法而已,特殊的地方在于方法的名字重写两同两小一大(规则)两同方法名相同参数类型相同两小返回值类型(基本数据类型要一致,引用类型可以是其子类)抛出的异常要小(也可以抛出父类型的异常的部分异常,或者不抛出异常)一大访问控制修饰符大
(1)重写方法必须和被重写方法具有相同的参数列表,返回类型必须和被重写方法的返回类型相同或者是返回类型的子类型
(2)重写方法的访问控制修饰符不能比被重写方法更严格(比如一个在父类中声明为public的方法重写成一个protected的方法)
(3)只有实例方法才能被重写,超类中的final方法不能被重写
(4)重写方法不能抛出新的检查异常,或者是抛出比被重写方法声明的检查异常更广泛的检查异常
19.==和equals的区别“==”比较引用值和基本数据类型是否相等xxx.equals方法比较对象的内容是否相等默认的比较规则是比较引用20.为什么要同时覆盖hashcode和equalshashCode方法要不equals方法一同覆盖(Sun公司规定)当两个对象equals比较为true时,应具有相同的hashCode值当两个对象equals比较为false时,应具有不相同的hashCode值hashCode值要稳定(一致性),一个对象创建以后就不应该再变化默认的hashCode值是当前堆对象地址转换的一个整数,这个整数不是内存地址!在java的中,判断两个对象是否相等的规则是首先,判断两个对象的hashCode是否相等如果不相等,认为两个对象也不相等如果相等,则判断两个对象用equals运算是否相等如果不相等,认为两个对象也不相等如果相等,认为两个对象相等
21.String类有哪些常用的方法charAtlengthtrimtoLowerCasetoUpperCaseindexOflastIndexOfendsWithstartsWithsubstringintstartintendsubstringintstarttoCharArray
22.StringStringBuilderStringBuffer的区别?String=char[]+操作复制创建新对象char[]不可变StringBuilder=char[]+对char[]操作处理当前数组内容char[]可变1StringBuilder是变长字符序列2StringBuilder方法append,insert...都返回当前StringBuilder对象本身的引用StringBuffer和StringBuilderAPI几乎一样!StringBuffer是java早期提供的(JDK
1.0),速度稍慢,线程安全StringBuilder是Java5以后提供的(JDK
5.0),速度快,非线程安全
23.谈谈集合框架的理解集合框架包括集合不映射(CollectionandMap)List元素有先后次序的集合元素有index位置元素可以重复,继承自Collection接口实现类:ArrayListVectorLinkedListList表示有先后次序的对象集合ArrayList是使用变长数组算法实现的,ArrayList实现自List1ArrayList和Vector的比较Vector
1.0版本提供的,线程安全的,效率稍低,也是使用变长数组算法实现的,继承自List接口ArrayList,线程不安全的,效率高速度快(现在较常用)2ArrayList和LinkedList的比较LinkedList是采用双向循环链表实现的ListArrayList是采用变长数组算法实现的的List在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的ArrayList查询速度快,而LinkedList增删速度快Set元素无续不能重复添加是数学意义上的集合继承自Collection接口实现类:HashSet是一个只有Key的HashMap,使用Set时要重写hashCodeequals方法HashMap以键-值对(关键字值)的形式存储对象,关键字key是唯一的、不重复的1key可以是任何对象,Value可以任何对象2(key value)成对放置在集合中3重复的key算一个,重复添加是替换操作(会覆盖原来的元素)4HashMap根据key检索查找value值HashMap新,非线程安全,不检查锁,快Hashtable旧JDK
1.2版本以前,线程安全,检查锁,慢一点(差的很小)
23.散列表的特点散列表中存放的对象是不连续的,所以称为“散列表”散列表的优点查找迅速在ArrayList中查找Mac,顺序查找,需要查找5次在HashMap中(底层实现原理是散列表)查找Mac,经过散列运算,仅需1次
24.java泛型的作用是什么泛型是Java5以后提出的语法现象,作用是在编译期检查的类型约束(运行期不检查泛型)泛型可以用来约束类中元素的类型
25.Collection和Collections的区别?Collection是集合接口,下面有子接口,ListSet集合的工具类为Collections,同数组的工具类Arrays相同,其中提供了许多的方法,诸如排序、二分查找、打乱、填充等操作
26.内部类的分类?各有什么特点?1根据位置的不同,Java中的内部类分为四种静态内部类使用static修饰,声明在类体中静态内部类中可以访问外部类的静态成员成员内部类声明在类体中,不使用static,具有类的成员特征,也就是,必须有类的实例才能创建内部类实例内部类实例可以访问共享外部类的成员变量(很常用)如链表的节点就可以定义为内部类局部内部类把类声明在方法中,就是局部内部类,作用域类似局部变量(很少见)匿名内部类匿名类,非常常见,可以写在任何地方就像一般的语句语法更象是创建对象Dated=newDate{//...};匿名类是对原类的一个继承,同时创建了实例,{}就是继承以后的类体类体中可使用所有类的语法匿名类不能写构造器匿名类可以从抽象类或者接口继承,必须提供抽象方法的实现2任何内部类都编译成独立的class文件3最大的作用封装!
27.怎么将Date和String互相转换?28.Java中的异常理解?异常是程序运行过程过程出现的错误,在Java中用类来描述,用对象来表示具体的异常Java将其区分为Error与Exception,Error是程序无力处理的错误,Exception是程序可以处理的错误1Error与ExceptionError是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等这些异常发生时,Java虚拟机(JVM)一般会选择线程终止Error:一般指虚拟机相关问题,如虚拟机崩溃,虚拟机出错等这种错误无法恢复或不可捕获,将导致应用程序中断对于Error一般不编写针对性代码对齐进行处理Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常程序中应当尽可能去处理这些异常2运行时异常和非运行时异常检查异常:当代码中抛出了一个检查异常,那么编译器在编译代码时会检查代码是否有处理该异常的代码片段,没有则编译不通过非检查异常:编译器不检查该类异常抛出是否有代码处理ClassNotFoundException不是RuntimeException的子类运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException,ArrayIndexOutOfBoundsExceptionClassCastException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常自定义异常自己定义异常表达错误MyExceptionextendsException检测check异常MyExceptionextendsRuntimException运行时runtime异常
29.JAVA中异常处理的方式有哪些?1try…catch…finallytry{//(尝试运行的)程序代码}catch异常类型异常的变量名{//异常处理代码}finally{//}注:子类异常的处理块必须在父类异常处理块的前面,否则会发生编译错误finally块中一定会执行吗2throwsthrowthrow关键字是用于方法体内部,用来抛出一个Throwable类型的异常如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常
30.实现序列化的作用?(implementsSerializable)序列化的作用是,将数据分解成字节流,以便存储在文件中或在网络上传输
31.IO流的分类?以及常用流的写法分为字节流和字符流或者输入流和输出流InputStreamis=newFileInputStreamgbk.txt;Readerin=newInputStreamReaderis;BufferedReaderreader=newBufferedReaderin;PrintWriterout=newPrintWtirernewOutputStreamWriternewFileOutputStreamfilename;
32.创建线程的两种方式继承Thread类(extendsThread)或者实现Runnable接口(implementsRunnable)1继承Thread类实现步骤继承Thread类覆盖run方法提供并发运程的过程创建这个类的实例使用start方法启动线程2实现Runnable接口实现步骤实现Runnable接口实现run方法提供并发运程的过程创建这个类的实例用这个实例作为Thread构造器参数,创建Thread类使用start方法启动线程
33.线程的5中状态1New新建状态当程序使用new关键字创建了一个线程后,该线程就处于新建状态,此时线程还未启动,当线程对象调用start方法时,线程启动,进入Runnable状态2Runnable可运行(就绪)状态当线程处于Runnable状态时,表示线程准备就绪,等待获取CPU3Running运行(正在运行)状态假如该线程获取了CPU,则进入Running状态,开始执行线程体,即run方法中的内容注意如果系统叧有1个CPU,那么在仸意时间点则叧有1条线程处于Running状态;如果是双核系统,那么同一时间点会有2条线程处于Running状态但是,当线程数大于处理器数时,依然会是多条线程在同一个CPU上轮换执行当一条线程开始运行时,如果它不是一瞬间完成,那么它不可能一直处于Running状态,线程在执行过程中会被中断,目的是让其它线程获得执行的机会,像这样线程调度的策略取决于底层平台对于抢占式策略的平台而言,系统系统会给每个可执行的线程一小段时间来处理仸务,当该时间段(时间片)用完,系统会剥夺该线程所占资源(CPU),让其他线程获得运行机会调用yield方法,可以使线程由Running状态进入Runnable状态4Block阻塞(挂起)状态当如下情冴下,线程会进入阻塞状态线程调用了sleep方法主动放弃所占CPU资源线程调用了一个阻塞式IO方法(比如控制台输入方法),在该方法返回前,该线程被阻塞......当正在执行的线程被阻塞时,其它线程就获得执行机会了需要注意的是,当阻塞结束时,该线程将进入Runnable状态,而非直接进入Running状态5Dead死亡状态当线程的run方法执行结束,线程进入Dead状态需要注意的是,不要试图对一个已经死亡的线程调用start方法,线程死亡后将不能再次作为线程执行,系统会抛出IllegalThreadStateException异常注1new运算创建线程后,线程进入New状态(初始状态)2调用start方法后,线程从New状态进入Runnable状态(就绪状态)start方法是在main方法(Running状态)中调用的3线程结束后,进入Dead状态(死亡状态),被对象垃圾回收4main方法结束后,其它线程,比如上例中p1和p2开始抢着进入Running状态由谁抢到是底层操作系统决定(操作系统分配时间片)单核处理器在一个时间点上叧有一个线程在Running状态;双核处理器2个如果p1进入Running状态,当操作系统分配给它的时间片到期时,p1进入Runnable状态,p2进入Running状态在期间有可能其它的进程的线程获得时间片,那么p1和p2同时进入Runnable状态,等待操作系统分配时间片5线程进入Dead状态后,叧能被垃圾回收,不能再开始6如果线程在运行过程中,自己调用了yield方法,则主动由Running状态进入Runnable状态
34.异步与同步的区别?1异步并发各干自己的如:一群人上卡车2同步步调一致的处理如:一群人上公交车
35.数据库中,char和varchar类型的区别?charn表示定长字符串方便查询最长放入n个字符放入的数据如果不够n个字符则补空格无论如何都占n个字符长度varcharn表示变长字符串节省空间最长放入n个字符放入的数据是几个长度就占多大空间select decodea2AAAAABBBBFROMtable;select decodea1A AAAABBBBFROMTT;--此处是两个空格
36.在数据库中怎么做表的复制?一条语句完成createtableemp_xxxasselect*fromemp_yyy;(注:如何将一个表中的数据复制到另外一个表中insertintotableselect*fromtable2;两个表结构一样insertintotablenameageselectnameagefromtable2;复制指定的字段)
37.分别简述一下DDLDMLDQLTCLDCL1数据定义语言DDLDataDefinitionLanguage是SQL语言集中负责数据结构定义不数据库对象定义的语言主要有create、alter、drop和truncate四种常用语句DDL对数据结构起作用create数据库对象的创建alter修改数据库对象drop删除数据库对象truncate清空表数据2数据操纵语言DMLDataManipulationLanguage用户通过它可以实现对数据表的基本操作即对表中数据的增、删、改DML对数据起作用insert插入操作update更新操作delete删除操作3数据查询语言DQLDataQueryLanguage用户主要通过它实现对数据的查询操作select查询操作4TCL事务控制语句是用来对DML操作进行确认的commit提交数据rollback数据回滚savepoint保存点5数据控制语言(DataControlLanguage,DCL)用于对用户授权或撤销其权限,也可使用角色实现对用户的批量授权或撤销权限,在应用开发层面较少用到grant授予权限/revoke回收权限
38.Oracle常用的单行函数有哪些?round数字小数点后的位数用于数字的四舍五入trunc数字小数点后的位数用于截取,如果没有第二个参数默认是0to_date和to_char是时间处理的函数to_date将字符串数据按指定格式转换为日期数据to_char将日期数据按指定格式转换为字符串数据coalesce参数列表函数的作用返回参数列表中第一个非空参数参数列表中最后一个值通常为常量decode函数是Oracle中等价于casewhen语句的函数作用同case语句相同decode函数语法如下decode判断条件匹配1值1匹配2值2…默认值nvlbonus0空值转换函数
39.常用的组函数有哪些AVG求平均数COUNT求数量MAX求最大值MIN求最小值SUM求和注意avg/sum操作数字max/min可以操作各种数据类型组函数默认忽略空值
40.判断语句是否正确?selectenamecount*fromempwhereename=KINGgroupbyename;selectcount*sumsalfromempgroupbyename;在SELECT列表中所有未包含在组函数中的列都应该包含在GROUPBY子句中包含在GROUPBY子句中的列不必包含在SELECT列表中
41.研发部有哪些职位?selectdistinctjobfromemp_xxxwheredeptno=selectdeptnofromdept_xxxwheredname=developer;
42.ALLAnyIn的用法ALL--大于最大值Any--大于最小值子查询的条件是单列还是多列没关系关键是要分清返回的是单行还是多行如果是单行用单行比较运算符=这些如果是多行用inallanyallany这些
43.哪个部门的平均薪水比部门20的平均薪水高?selectdeptnoavgnvlsalary0avg_sfromemp_xxxgroupbydeptnohavingavgnvlsalary0selectavgnvlsalary0fromemp_xxxwheredeptno=20;
44.什么叫关联子查询?子查询中不再是独立的Sql语句需要依赖主查询传来的参数这种方式叫关联子查询哪些员工的薪水比本部门的平均薪水低?不再和整个部门的平均薪水比较selectenamesalarydeptnofromemp_xxxawheresalaryselectavgnvlsalary0fromemp_xxxwheredeptno=a.deptno;--子查询不再是独立的Sql语句需要依赖主查询传来的参数a.deptno
45.哪些人不是别人的经理?selectenamefromemp_xxxawherenotexistsselect1fromemp_xxxwheremgr=a.empno;
46.union和unionall的区别union去掉重复记录unionall不去重union排序unionall不排序(当列的个数、列的顺序、列的数据类型一致时我们称这两个结果集结构相同只有结构相同的结果集才能做集合操作)
47.Oracle中表连接的方式有哪些?内连接自然连接等值连接、自然连接和不等值连接{内连接是join关键字连接两个表,语法为table1jointable2on条件根据使用的比较方式不同,内连接又分为等值连接、自然连接和不等值连接等值连接所谓等值连接,是指在连接条件中使用等于(=)运算符比较被连接的值,也就是通过相等的列值连接起来的查询例子Selectempnoenamesalemp.deptnodnamefromempdeptwhereemp.deptno=dept.deptno;非等值连接所谓不等连接,就是在连接条件中使用除等号(=)外的其他比较运算符,构成非等值连接查询可以使用的比较运算符包括(大于)、(小于)、=(大于等于)、=(小于等于)、(不等于)、!=(不等于)、LIKE、IN和BETWEEN等例子selecte.enamee.sals.gradefromempejoinsalgradesone.salbetweens.losalands.hisal;查询所有员工的薪水等级自然连接自然连接是在两张表中寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件的结果例子select*fromempnaturaljoindept;}外连接外连接的结果集=内连接的结果集+驱动表在匹配表中找不到匹配记录的数据和空值{使用一张表中的所有记录去和另一张表中的记录按条件匹配空值也会匹配,这个表中的所有记录都会显示左外连接,右外连接,全外连接LEFT/RIGHT/FULLOUTERJOIN}左外连接左边的表不加限制{【例】t1leftouterjoint2--其中t1是驱动表,t2是匹配表等价于t2rightouterjoint1【例】查询每个员工的经理的名字?selectworker.enamemanager.enamefromempworkerleftouterjoinempmanageronworker.mgr=manager.empno;}右外连接右边的表不加限制{t1rightouterjoint2--t2是驱动表,t1是匹配表等价于:t2leftouterjoint1【例】-哪些员工没有下属(不是别人的领导)外连接+匹配表PKisnull表示否定问题,不是,不包括,等等selectmanager.enamefromempworkerrightouterjoinempmanageronworker.mgr=manager.empno(首先找到所有经理下面的员工是哪些)whereworker.empnoisnull;然后将员工为空的过滤出来}全外连接左右两表都不加限制fullouterjoin{左表和右表都不做限制,所有的记录都显示,两表不足的地方用null填充【例】selecte.enamed.locfromempefullouterjoindeptdone.deptno=d.deptno;}自连接(同一张表内的连接)自连接是等值连接的一种表中的列外键关联自己表的主键列{自连接selfjoin是SQL语句中经常要用的连接方式,使用自连接可以将自身表的一个镜像当作另一个表来对待,从而能够得到一些特殊的数据【例】查询每个员工的经理的名字?selectworker.enamemanager.enamefromempworkerjoinempmanageronworker.mgr=manager.empno;}
48.什么是事务(Transaction)什么是事务控制事务(Transaction)是指组成单个逻辑工作单元的一系列操作事务控制(TransactionControl)则是指通过将一组相关操作组合为一个要么全部成功、要么全部失败的逻辑工作单元(即事务),以简化错误恢复、提高应用程序的可靠性
49.约束条件constraint有哪些主键Primarykey简称PK1主键约束primarykey=不能重复+不能为null2主键约束可以用两种方式定义列级约束和表级约束非空约束notnull简称NN注意非空约束只能定义在列级唯一约束Unique简称UK可以定义在表级和列级检查约束Check简称CK可以定义在表级和列级因为约束条件建立在列级时可读性不好而丐不方便定义约束条件名字一般建议定义在表级外键Foreignkey简称FK之前讲的几个约束条件都是用来约束单个表中的列而外键约束定义在两个表的两个字段上或者一个表的两个字段上用亍保证相关两个字段的关系constraintfk_customerid__cardinfo2foreignkeycustomerIDreferencesuserInfocustomerID注意一张表中,只能有一个PK但是可以有多个FK
50.视图View索引Index序列Sequence?视图View视图的使用和表相同视图的好处简化查询;屏蔽数据库表结构、限制对数据的访问视图不包含任何数据是基表数据的投影视图本身并不在物理上保存数据,在视图上进行的查询或更新操作实际上都是针对其基表来完成的当基表变化时,视图也随着变化索引Index index索引(Index)一种用于提升查询效率的数据库对象,使用索引可以快速定位数据、减少磁盘I/O操作次数注意对于数据变更频繁DML操作频繁的表索引会影响查询性能如果数据表有PK/Unique两种约束索引自动创建除此以外索引必须手动创建自定义索引语法createindex索引名on表名列名;为什么索引查询快Oracleserver通过rowid快速定位要找的行通过rowid定位数据能有效的降低读取数据块的数量索引的使用和维护是自动的,一般情况下不需要用户干预序列Sequence序列的特性产生连续的不同的数字值用来作为数据表的主键序列这种对象在Oracle、db2等数据库中有在mysql、sqlserver中没有(在mysql通过auto_increment自动增长列来实现同样的功能)
51.TRUNCATE与前述DELETE操作的区别?DELETE为DML操作,可以回滚,而TRUNCATE为DDL操作,一经执行不可撤销,故其效率要高一些;DELETE操作可以选择删除表中全部或部分数据,而TRUNCATE操作只能删除表中全部数据如果不再用到表中数据、但又需要保留表的结构,则可该使用TRUNCATETABLE操作;如果连表的结构也需要了,则可使用DROPTABLE操作将表彻底删除
52.第n条到第n条记录的获取方式Oracle获取方式:selectenamesalrnfromselectenamesalrownumrnfromempwherern=5andrn=10;selectenamesalrnfromselectenamesalrownumrnfromempwherernbetween5and10;selectidnamejoprnfromselectidnamejoprownumrnfromdept10whererownum10wherern5;selectt
2.*fromselectt
1.*rownumrnfromempt1whererownum=5t2wherern3;MySql获取方式:SELECT*FROMtableLIMIT510; //检索记录行6-
1553.JDBC编程步骤1注册DriverOracle:Class.forName“oracle.jdbc.driver.OracleDriver”;Mysql:Class.forName“com.mysql.jdbc.Driver”;2建立连接Mysql:Stringurl=“jdbc:mysql://localhost:3306/tarena”;Oracle:Stringurl=“jdbc:oracle:thin:@localhost:1521:tarena”;Stringname=”root”;Stringpwd=”root”;Connectionconn=DriverManager.getConnectionurlnamepwd;3获得一个Statement对象两种方式Statementsta=conn.createStatement;PreparedStatementpstm=conn.prepareStatement;4通过Statement执行Sql语句ResultSetrs=sta.executeQueryStringsql;返回一个查询结果集用于select语句intI=sta.executeUpdateStringsql;返回值为int型,表示影响记录的条数用于insertupdatedelete语句5)处理结果集whilers.next{System.out.printlnrs.getString“name”;//------------------}6关闭数据库连接(释放资源)调用.closers.close;sta.close;con.close;ResultSetStatementConnection是依次依赖的
54.Statement和PreparedStatement区别1)PreparedStatement代码的可读性和可维护性2PreparedStatement尽最大可能提高性能.数据库会对PreparedStatement语句进行预编译,下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率3)最重要的一点是极大地提高了安全性.如果是Statement构建的语句select*fromtb_name=随意andpasswd=or1=1;很容易造成Sql注入而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系
55.xml和html的区别XML被设计用来传输和存储数据HTML被设计用来XML不是HTML的替代XML和HTML为不同的目的而设计XML被设计为传输和存储数据,其焦点是数据的内容HTML被设计用来显示数据,其焦点是数据的外观HTML旨在显示信息,而XML旨在传输信息显示数据1超文本标记语言HTML(HyperTextMarkupLanguage写法格式ahref=link.htmllink/a关注数据的展示不用户体验标记是固定的,不可扩展(如a/a表示超链接)2可扩展的标记语言XML(eXtensibleMarkupLanguage写法格式同html样式alink/a仅关注数据本身标记可扩展,可自定义
56.XML的解析方式?1DOM(DocumentObjectModel文档对象模型)关键字树Document优点把xml文件在内存中构造树形结构,可以遍历和修改节点缺点如果文件比较大,内存有压力,解析的时间会比较长2SAX(SimpleAPIforXml基于XML的简单API)关键字流Stream把xml文件作为输入流,触发标记开始,内容开始,标记结束等动作优点解析可以立即开始,速度快,没有内存压力缺点不能对节点做修改
57.servlet是如何运行的?当用户向浏览器地址栏输入http://ip:port/helloweb/sayHelloname=zs1浏览器使用ip port(端口号)连接服务器2浏览器将请求数据按照http协议打成一个数据包(请求数据包)发送给服务器请求数据包的内容包含了请求资源路径/helloweb/sayHelloname=zs,另外,在请求数据包当中,还会包含浏览器自动生成的一些信息3服务器创建两个对象请求对象(Request)和响应对象(Response)服务器解析请求数据包,将解析之后的数据存放到请求对象里面,方便servlet读取请求数据因为servlet不用解析请求数据包,如果要解析,需要理解http协议请求对象是HttpServletRequest接口的一个实现响应对象是HttpServletResponse接口的一个实现,响应对象由于存放servlet处理的结果4依据请求资源路径找到相应的servlet配置,通过反射创建servlet实例然后调用其service方法在调用service方法时,会将事先创建好的请求对象request和响应对象response作为参数进行传递在servlet内部,可以通过request获得请求数据,戒者通过response设置响应数据5服务器从response中获取数据,按照http协议打成一个数据包响应数据包发送给浏览器6浏览器会解析响应数据包,取出相应的数据,生成相应的界面
58.get和post请求的区别?1哪一些是get请求方式a直接在浏览器地址栏输入某个地址b点击链接地址c表单默认的提交方式2get请求方式的特点a请求参数会添加到请求资源路径后面请求资源路径后面添加的参数数据量大小是有限制的,b会将请求参数直接显示在浏览器地址栏,不安全cget方式只适合于向服务器请求资源或者是向服务器提交少量的数据3哪一些是post请求方式a设置表单的method=post4post方式的特点apost方式会将请求参数及值添加到实体内容里面,可以放置大量的数据b因为不会将参数直接显示在浏览器地址栏,所以,相对安全get方式会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限制,不适合提交大量的数据;post方式会将请求参数及参数值放在实体内容里面,理论上没有限制,适合大量数据的提交
59.重定向和转发的区别重定向1什么是重定向?服务器向浏览器发送一个状态码302及一个消息头locationlocation的值是一个地址,浏览器会立即向location所指定的地址发送一个新的请求我们把这样一种机制叫重定向2编程response.sendRedirectStringurl;3需要注意的问题在重定向之前,不能够有任何的输出;如果response缓存当中有数据,在重定向之前,会自动清空4重定向的特点a地址任意b浏览器地址栏地址会变化(即变化为跳转之后的地址)转发1)什么是转发一个web组件(servlet/jsp)将未完成的处理交给另外一个web组件继续完成转发所涉及的各个web组件可以共享request和response对象2)编程step1绑订数据到request对象上request.setAttributeStringnameObjectobj;request.removeAttributeStringname;Objectrequest.getAttributeStringname;//如果绑订名不存在,则返回nullstep2获得转发器RequestDispatcherrd=request.getRequestDispatcherStringurl;step3转发rd.forwardrequestresponse;servlet:负责业务逻辑处理(包括数据访问)jsp负责生成界面3)需要注意的问题在转发之前,response缓存的数据会被清空主要区别如下1地址转发的地址必须是同一个应用内部的某个组件(不能跨应用,不能跨服务器)比如地址1http://localhost:8080/web06/aaa.jsp地址2http://localhost:8080/web06/bbb.jsp地址3http://localhost:8080/web07/ccc.jsp地址4http://www.tarena.com.cn在应用web06内部的组件aaa.jsp可以将信息转发到地址2(同一应用),但是不可以转发到地址3(跨应用)和地址4(跨服务器)重定向的地址没有限制2能否共享request转发可以重定向不行原因是转发是一次请求,重定向为两次请求,Request的生命周期叧能在一次请求内,请求结束,Request被删除3浏览器地址栏的地址是否变化转发不变重定向会变4事件是否处理完毕转发是一件事未做完重定向是一件事已经做完
60.get请求和post请求中文乱码问题的处理?
1、Get请求Tomcat这个容器会用ISO-8859-1这种编码去解析URL里面的值;
1.解决方法newStringrequest.getParameterusername.getBytesISO-8859-1UTF-8;
2.直接改Tomcat配置conf/server.xmlConnectorport=8080protocol=HTTP/
1.1connectionTimeout=20000redirectPort=8443URIEncoding=utf-8/
2、Post请求在html文件中,添加metahttp-equiv=content-typecontent=text/html;charset=utf-8另外,表单的提交方式必须是postrequest.setCharacterEncodingutf-8;get和post请求的中文乱码问题处理当表单提交时,浏览器会对表单中的中文参数值进行编码会使用打开表单所在的页面时的编码格式来进行编码服务器在默认情况下,会使用iso-8859-1这种编码格式进行解码所以会出现乱码1get请求方式的处理:第一种方式:要确保表单所在的页面,使用指定的编码格式打开对于html文件,可以添加:metahttp-equiv=content-typecontent=text/html;charset=utf-8确保表单中的编码为utf8能够存储中文在Servlet中使用name=newStringname.getBytesiso-8859-1utf-8;来处理编码第二种方式:找到tomcat----conf-----server.xml----Connectorport=8080protocol=HTTP/
1.1connectionTimeout=20000redirectPort=8443URIEncoding=UTF-8/后面加上URIEncoding=UTF-82post请求方式的处理:
2.1首先确保html的编码为utf-
82.1在服务器端,取数据之前添加request.setCharacterEncodingutf-8;MySQL的乱码解决方案:如果第一次安装MySQL数据库:在选择编码时,选择最后一项,并指定编码为utf8或者gbk(这两种编码支持中文是我们比较常用的)如果已经按照完成了MySQL数据库,那么可以进行重新配置修改:在开始菜单中找到:然后重复第一个步骤即可注意这样修改完成后,那么数据库中原来保存的数据如果有中文,就会乱码,因为当前的编码已经变为了utf8,而原来保存的可能是其它编码重启MySql的服务.右键管理员身份打开命令提示符窗口进入MySQL中,如果通过一下命令查看编码如下图所示,那么表示配置正确:但是这个时候如果向表中插入数据,会报编码错误,如下图这个时候,我们就可以使用setnamesgbk;命令来设定字符集为gbk就可以正常插入数据了(注意这个只是让显示的时候正确,并不会改变表中的数据的编码此命令只在当前会话中有效,也就是如果新开一个窗口打开MySql,用select查询时会发现还是乱码,这个时候如果要正确显示,那么还得用此语句)Servlet中的数据插入MySql乱码:(我们都用UTF8这样的编码来存储)首先在Servlet这个java文件得是utf8编码,在其中打印要插入MySql中的数据,查看是否能够正确显示,如果能够正确显示那么说明Servlet中的数据就是utf8编码如果上一步不能通过检查,那么插入数据就会出现问题,直到检查第一步完成为止建数据库之前首先保证MySql按照上面的安装正确:创建数据库:createdatabasewuxidefaultcharactersetutf8;可以使用showcreatedatabasewuxi;来查看这个数据库的SQL语句.建表时加上:createtablet_picidbigintprimarykeyauto_incrementpicNamevarchar100userIdbigintENGINE=InnoDBDEFAULTCHARSET=utf8;JDBC连接数据库时:conn=DriverManager.getConnectionjdbc:mysql://localhost:3306/jd1105dbuseUnicode=truecharacterEncoding=utf8root1234;
1.乱码的解决方案:
1.
1、html/jsp
1.
1.
1、html中模拟一个消息头content-type告诉浏览器正在处理的数据的类型和字符集metahttp-equiv=content-typecontent=text/html;charset=utf-8这个编码应该和html文件保存的编码一致如果不写这句话,可能浏览器在读取html时使用的编码有些步一致而且同样会导致提交数据时的编码不一致
1.
1.
2、jsp中%@pagelanguage=javacontentType=text/html;charset=utf-8pageEncoding=”utf-8”%contentType属性:设置response.setContentType方法的参数值pageEncoding属性告诉容器jsp文件的字符集,容器会按照该属性指定的字符集去解码容器需要读取jsp文件的内容,有些容器默认情况下会按照iso-8859-1去解码jsp中不需要加metacharset=”utf-8”/因为contentType已经解决了告诉浏览器的编码问题
1.
2、从html提交数据到Servlet从html/jsp中的form表单将数据提交到Servlet使用的编码是浏览器打开此页面的编码也就是和
1.1中的设置有关系
1.
3、Servlet
1.
2.
1、获取数据:分两种,get和post请求的处理方式不同GET请求方式
1.
2.
1.
1、TOMCAT默认ISO-8859-1来处理get请求,因此可以设置默认编码为UTF-8解决,在tomcat安装的conf\server.xml文件中设置如下Connectorport=8080protocol=HTTP/
1.1connectionTimeout=20000redirectPort=8443URIEncoding=”UTF-8”/
1.
2.
1.
2、在所写到的Servlet中直接进行处理Stringusername=request.getParameter“username”;username=newStringusername.getBytesISO-8859-1“UTF-8;POST请求方式必须在获取参数之前,调用如下方法先解码request.setCharacterEncoding“UTF-8”;Stringusername=request.getParameter“username”;
1.
2.
2、输出数据:response.setContentTypetext/html;charset=utf-8;指定HTTP响应的编码同时指定了浏览器显示的编码.
1.
4、连接数据库时的编码:jdbc:mysql://localhost:3306/jsd1402dbuseUnicode=truecharacterEncoding=utf8root1234;
1.
5、DB数据库的编码:
1.
5.
1、修改整个数据库保存数据的编码:MySQL的乱码解决方案
1.
5.
2、创建数据库时设置的编码:
1.创建数据库:createdatabasewuxidefaultcharactersetutf8;
2.可以使用showcreatedatabasewuxi;来查看这个数据库的SQL语句
3.createtablet_picidbigintprimarykeyauto_incrementpicNamevarchar100userIdbigintENGINE=InnoDBDEFAULTCHARSET=utf8;
61.servlet的生命周期所谓生命周期,指的是servlet容器如何创建servlet实例、分配其资源、调用其方法、并销毁其实例的整个过程阶段一:实例化(就是创建servlet对象调用构造器)在如下两种情况下会迚行对象实例化第一种情况当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,才会创建实例第二种情况容器在启动时,或者新部署了某个应用时,会检查web.xml当中,servlet是否有load-on-starup配置如果有,则会创建该servlet实例load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)阶段二初始化为servlet分配资源,调用initServletConfigconfig;方法config对象可以用来访问servlet的初始化参数初始化参数是使用init-param配置的参数init可以override阶段三就绪/调用有请求到达容器,容器调用servlet对象的service方法HttpServlet的service方法,会依据请求方式来调用doGet或者doPost方法但是,这两个do方法默认情况下,会抛出异常,需要子类去override阶段四销毁容器依据自身的算法,将不再需要的servlet对象删除掉在删除之前,会调用servlet对象的destroy方法destroy方法用于释放资源在servlet的整个生命周期当中,initdestroy只会执行一次,而service方法会执行多次
62.JSP和Servlet的区别Servlet是sun公司制订的一种用于扩展web服务器功能的组件规范javaserverpagejava服务器端页面技术,是sun公司制订的一种服务器端动态页面生成技术的规范因为直接使用servlet生成页面,如果页面比较复杂,则代码过于繁琐,并且难以维护,所以对于比较复杂的页面,使用jsp来编写,更容易编写和维护当客户端请求访问某个.jsp文件,则服务器会自劢将.jsp文件转换成一个.java文件该.java文件其实是一个servlet
63.JSP的隐含对象有哪些?共9个outrequestresponsesessionapplication隐含对象其实就是ServletContext(Servlet上下文容器在启动的时候,会为每一个应用创建唯一的一个Servlet上下文对象该对象会一直存在,除非容器关闭)exceptionconfig:ServletConfig实例page:相当于this代表当前jsp实例pageContext:PageContext实例容器会为每一个jsp实例创建唯一的一个pageContext对象该对象一直存在,除非jsp实例被容器销毁
64.Cookie和Session的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上cookie存放在内存或者硬盘上,cookie.setMaxAgeintseconds; cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递用户每次访问站点时,Web应用程序都可以读取cookie包含的信息session失效时间的设置,这里要分两方面来看浏览器端和服务端对于浏览器端而言,session与访问进程直接相关,当浏览器被关闭时,session也随之消失;而服务器端的session失效时间一般是人为设置的,目的是能定期地释放内存空间,减小服务器压力,一般的设置为当会话处于非活动状态达20或30分钟时清除该session
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session
3、session会在一定时间内保存在服务器上当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE
4、单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K
5、所以个人建议将登陆信息等重要信息存放为SESSION其他信息如果需要保留,可以放在COOKIE中
65.谈谈对MVC的理解?1什么是MVC?MVC是一种设计思想,根据职责不同将程序中的组件分成以下3个部分V(View视图)负责与用户交互将数据展现,或者是接收数据M(Model模型)负责业务处理业务模型,数据模型C(Controller控制器)负责协同模型和视图工作视图有请求调用模型处理,模型处理完毕调用视图响应2为什么使用MVC?MVC是一个非常优秀的设计思想,基于该思想架构程序,可以提高程序的结构灵活性,便于日后维护、扩展和升级注意下面内容助于理解1一个模型可以被多个视图共享模型只负责输出数据,不关心数据的表现形式,同一仹数据,可以使用多个不同的视图展现给用户模型只负责处理数据,不关心是谁在调用,可以使用多种不同的界面来调用模型2方便测试模型一般使用java类来开发,在开发完成之后,可以立即测试如果业务逻辑直接写在servlet里面,则需要部署在服务器上面才能测试,比较麻烦3组件复用控制器可以做成一个通用的模块4代码好维护,利于分工协作按照mvc的思想,可以对程序迚行分层,一般划分成表示层包括vc、业务层m中的业务逻辑部分、持久层m中的数据访问逻辑部分下一层的代码发生改变,只要接口不变,不会影响到上一层的代码mvc的缺点1采用mvc以后,会增加代码量,相应的开发周期以及开发的成本会相应增加2使用mvc,需要良好的设计如果设计不当,会增加开发的难度结论一般来说,如果一个程序需要良好的架构,需要良好的代码的可维护性及可扩展性,需要使用mvc思想来架构反之,则不必使用
66.什么是Ajax?asynchronousjavascriptandxml异步的javascript和xml为了解决传统的web应用当中“等待-响应-等待的弊端而创建的一种技术,其实质可以理解为使用浏览器内置的一个对象XmlHttpRequest向服务器发送请求,服务器返回xml数据或者是文本数据给浏览器,然后在浏览器端,使用这些数据更新部分页面,整个过程,页面无任何的刷新
67.ajax编程步骤?1获得XmlHttpRequest对象2使用XmlHttpRequest向服务器发请求a.发送get请求:/*open请求方式请求地址同步/异步*请求方式:get/post*请求地址如果是get请求,请求参数添加到地址之后*比如check_user.dousername=zs*同步/异步:true表示异步*/xhr.opengetcheck_user.dotrue;b.发送post请求xhr.openpostcheck_username.dotrue;//必须添加一个消息头content-typexhr.setRequestHeaderContent-Typeapplication/x-www-form-urlencoded;
3.在服务器端,处理请求
4.在监听器当中,处理服务器返回的响应xhr.onreadystatechange=function{//编写相应的处理代码ifxhr.readyState==4{//只有readyState等亍4xhr才完整地接收到了服务器返回的数据//获得文本数据vartxt=xhr.responseText;//获得一个xmldom对象varxml=xhr.responseXML;//dom操作、更新页面}};
5.xhr.sendnullAjax技术的优点
1.页面无刷新
2.不打断用户的操作,用户的体验好
3.按需获取数据,浏览器和服务器之间数据的传输量减少
4.是一个标准技术,不需要下载任何的插件
5.可以利用客户端浏览器的计算能力
68.什么是JQueryjQuery是一个JS框架,设计思想是将原始的dom对象封装成一个jQuery对象,通过调用jQuery对象的方法来实现对原始的dom对象的操作这样设计的目的是是为了更好地兼容不同的浏览器简化代码
70.程序,线程,进程的区别?一般操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序被称为一个进程,当一个程序运行时,内部可能包含多个顺序执行流,每个顺序执行流就是一个线程1程序指令+数据的byte序列,如:qq.exe2进程正在运行的程序是程序动态的执行过程(运行于内存中)3线程在进程内部,并发运程的过程(Java中的方法可以看做线程)
71.在做项目的过程中,遇到了中文乱码问题,该如何处理(比如网站主页查询页面显示乱码)可以从页面,程序,以及数据库三个方面去查看问题的原因所在,主页面显示中文乱码,无外乎是因为从数据库中取出来的数据传输到主页面的过程中出现了编码问题,那么就应该从这三个方面去查找问题的所在因为我们常用UTF-8的编码格式,所以我们就检查所有数据的编码是否都是UTF-8编码查看一下页面jsp文件的编码格式
1.
3.1/
1.
3.
21.
1、项目文本文件默认编码【右击项目】-【Properties】-【Resource】-【Textfileencoding】
1.
2、文件默认编码默认使用项目的默认编码【右击文件】-【Properties】-【Resource】-【Textfileencoding】
1.
3、JSP文件编码由于JSP要翻译为Servlet
1.
3.
1、JSP文件编码【右击文件】-【Properties】-【Resource】-【Textfileencoding】
1.
3.
2、JSP翻译为Servlet时的编码(此项可以由
1.
11.
21.
3.1代替)%@pagelanguage=javapageEncoding=utf-8%
1.
3.
3、从服务器将jsp内容输出到浏览器%@pagecontentType=text/html;charset=utf-8%在这次输出过程中,由contentType属性中的charset来指定,将servlet编译后的的二进制码以charset的编码形式来输出服务器端编码设置服务器端编码,将客户端传过来的数据进行解码浏览器默认使用ISO-8859-1进行编码数据,然后将数据传输到服务器,因此我们默认只需要将浏览器发送过来的数据转换为我们需要的编码即可GET请求方式
2.1TOMCAT默认ISO-8859-1因此可以设置默认编码为UTF-8解决,在conf\server.xml文件中设置如下Connectorport=8080protocol=HTTP/
1.1connectionTimeout=20000redirectPort=8443URIEncoding=”UTF-8”/
2.2Stringusername=request.getParameter“username”;username=newStringusername.getBytesISO-8859-1“UTF-8;POST请求方式
2.3//必须在获取参数之前,调用如下方法先解码request.setCharacterEncoding“UTF-8”;Stringusername=request.getParameter“username”;response.setContentTypetext/html;charset=utf-8;
3.数据库的编码设置
3.1JDBC连接数据库的编码设置jdbc:mysql://localhost:3306/jd1203dbuseUnicode=truecharacterEncoding=utf8root1234;
3.2在建表或者建数据库时可以加上createdatabasejsd1203dbENGINE=InnoDBDEFAULTCHARSET=utf8;
3.3查看MySql数据中当前联接系统参数showvariableslikechar%,显示各个编码类型可以showcreatedatabasedangdang;通过该语句查看建库的语句,看是否有设置编码如果各种编码都是对的,可是在数据库中查看数据时是乱码,可以用setnames‘gbk’设置查看编码为gbk,与系统一致windows注意,这个设置只对当前会话有效
72.get和post请求的中文乱码问题处理当表单提交时,浏览器会对表单中的中文参数值进行编码会使用打开表单所在的页面时的编码格式来进行编码服务器在默认情况下,会使用iso-8859-1这种编码格式进行解码所以会出现乱码1get请求方式的处理:第一种方式:要确保表单所在的页面,使用指定的编码格式打开对于html文件,可以添加:metahttp-equiv=content-typecontent=text/html;charset=utf-8确保表单中的编码为utf8能够存储中文在Servlet中使用name=newStringname.getBytesiso-8859-1utf-8;来处理编码第二种方式:找到tomcat----conf-----server.xml----Connectorport=8080protocol=HTTP/
1.1connectionTimeout=20000redirectPort=8443URIEncoding=UTF-8/后面加上URIEncoding=UTF-82post请求方式的处理:
2.1首先确保html的编码为utf-
82.1在服务器端,取数据之前添加request.setCharacterEncodingutf-8;MySQL的乱码解决方案:如果第一次安装MySQL数据库:在选择编码时,选择最后一项,并指定编码为utf8或者gbk(这两种编码支持中文是我们比较常用的)如果已经按照完成了MySQL数据库,那么可以进行重新配置修改:在开始菜单中找到:然后重复第一个步骤即可注意这样修改完成后,那么数据库中原来保存的数据如果有中文,就会乱码,因为当前的编码已经变为了utf8,而原来保存的可能是其它编码重启MySql的服务.右键管理员身份打开命令提示符窗口进入MySQL中,如果通过一下命令查看编码如下图所示,那么表示配置正确:但是这个时候如果向表中插入数据,会报编码错误,如下图这个时候,我们就可以使用setnamesgbk;命令来设定字符集为gbk就可以正常插入数据了(注意这个只是让显示的时候正确,并不会改变表中的数据的编码此命令只在当前会话中有效,也就是如果新开一个窗口打开MySql,用select查询时会发现还是乱码,这个时候如果要正确显示,那么还得用此语句)
73.Servlet中的数据插入MySql乱码:(我们都用UTF8这样的编码来存储)首先在Servlet这个java文件得是utf8编码,在其中打印要插入MySql中的数据,查看是否能够正确显示,如果能够正确显示那么说明Servlet中的数据就是utf8编码如果上一步不能通过检查,那么插入数据就会出现问题,直到检查第一步完成为止建数据库之前首先保证MySql按照上面的安装正确:创建数据库:createdatabasewuxidefaultcharactersetutf8;可以使用showcreatedatabasewuxi;来查看这个数据库的SQL语句.建表时加上:createtablet_picidbigintprimarykeyauto_incrementpicNamevarchar100userIdbigintENGINE=InnoDBDEFAULTCHARSET=utf8;JDBC连接数据库时:conn=DriverManager.getConnectionjdbc:mysql://localhost:3306/jd1105dbuseUnicode=truecharacterEncoding=utf8root1234;
74.MySql和Oracle数据库的区别?查询当前所有的表SQLselect*fromtab;SQLselect*fromcatwheretable_type=’TABLE’;//可能会有viewSQLselect*fromuser_tables;mysqlshowtables;c:/mysql/binmysqlshow库名显示当前连接用户(库)SQLshowusermysqlconnect查看帮助SQLmysqlhelp显示表结构SQLdesc表名SQLdescribe表名mysqldesc表名;mysqldescribe表名;mysqlshowcolumnsfrom表名;c:/mysql/binmysqlshow库名表名日期函数SQLselectsysdatefromdual;mysqlselectnow;mysqlselectsysdate;mysqlselectcurdate;mysqlselectcurrent_date;mysqlselectcurtime;mysqlselectcurrent_time;日期格式化SQLselectto_charsysdateyyyy-mm-ddfromdual;SQLselectto_charsysdatehh24-mi-ssfromdual;mysqlselectdate_formatnow%Y-%m-%d;mysqlselecttime_formatnow%H-%i-%S;日期函数(增加一个月)SQLselectto_charadd_monthsto_date20000101yyyymmdd1yyyy-mm-ddfromdual;结果2000-02-01SQLselectto_charadd_monthsto_date20000101yyyymmdd5yyyy-mm-ddfromdual;结果2000-06-01mysqlselectdate_add2000-01-01interval1month;结果2000-02-01mysqlselectdate_add2000-01-01interval5month;结果2000-06-01别名SQLselect1afromdual;SQLselect1asafromdual;//as可以省略mysqlselect1asa;字符串截取函数SQLselectsubstrabcdefg15fromdual;SQLselectsubstrabcdefg15fromdual;结果abcdemysqlselectsubstringabcdefg23;结果bcdmysqlselectmidabcdefg23;结果bcdmysqlselectsubstringabcdefg2;结果bcdefgmysqlselectsubstringabcdefgfrom2;结果bcdefg另有SUBSTRING_INDEXstrdelimcount函数返回从字符串str的第count个出现的分隔符delim之后的子串如果count是正数,返回最后的分隔符到左边从左边数的所有字符如果count是负数,返回最后的分隔符到右边的所有字符从右边数执行外部脚本命令SQL@a.sql1mysqlsourcea.sql2c:/mysql/binmysqla.sql3c:/mysql/binmysql库名a.sql导入、导出工具exp.exeexp
73.exeimp.exeimp
73.exemysqldump.exemysqlimport.exe改表名SQLrenameatob;mysqlaltertablearenameb;执行命令;回车/rrun;回车goegodistinct用法SQLselectdistinct列1from表1;SQLselectdistinct列1列2from表1;mysqlselectdistinct列1from表1;mysqlselectdistinct列1列2from表1;注释--/*与*/#--/*与*/当作计算器SQLselect1+1fromdual;mysqlselect1+1;限制返回记录条数SQLselect*from表名whererownum5;mysqlselect*from表名limit5;新建用户(库)SQLcreateuser用户名identifiedby密码;mysqlcreatedatabase库名;删用户(库)SQLdropuser用户名;mysqldropdatabase库名;查询索引SQLselectindex_nametable_namefromuser_indexes;mysqlshowindexfrom表名[FROM库名];通配符“%”和“_”“%”和“_”SQL语法SELECTselection_list选择哪些列FROMtable_list从何处选择行WHEREprimary_constraint行必须满足什么条件GROUPBYgrouping_columns怎样对结果分组HAVINGsecondary_constraint行必须满足的第二条件ORDERBYsorting_columns怎样对结果排序SELECTselection_list选择哪些列FROMtable_list从何处选择行WHEREprimary_constraint行必须满足什么条件GROUPBYgrouping_columns怎样对结果分组HAVINGsecondary_constraint行必须满足的第二条件ORDERBYsorting_columns怎样对结果排序LIMITcount结果限定自动增长的数据类型处理createsequencemyseqincrementby1startwith1maxvalue99999;主键列上加auto_incrementStruts2详细工作流程?a.浏览器发出welcome.action请求b.请求到达Struts的Filter控制器由于web.xml配置c.Struts控制器判断请求类型,如果是/welcome.action或/welcome格式请求,将调用struts.xml配置,寻找对应的Action组件d.调用Action组件的execute方法处理请求,最后返回一个String视图标识e.Struts控制器根据视图标识寻找相应的JSP(struts.xml中result配置)f.调用JSP视图生成响应界面给浏览器显示Struts2控制流程1请求到来2创建ValueStackAction放栈顶,进行初始化3调用拦截器Interceptor,在拦截器中是可以访问ValueStack的4调用Action执行execute方法5调用Result,Result负责把数据显示给用户6最后到页面,通过标记库Taglib取出数据Struts2中常用的集中Result组件1)JSP响应dispatcher采用请求转发方式调用JSP组件响应redirect采用请求重定向方式调用JSP组件响应(在重定向后,原request和action都被销毁掉,因此在JSP获取不到值)2)Action响应redirectAction采用重定向方式发出一个*.action请求chain采用转发方式发出一个*.action请求3)流响应典型功能验证码和下载stream可以将Action中的一个InputStream类型属性以流方式响应输出4)JSON响应负责对Ajax请求进行数据响应json可以将Action中的一个属性或多个属性以json格式响应输出注意使用前需要引入struts-json-plugin.jar,然后将package元素的extends设置成json-defaultfilter(过滤器)和interceptor(拦截器)的区别
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次Hibernate是什么,有什么作用和好处Hibernate是一个数据库访问框架,用于实现对数据库的增删改查操作使用Hibernate框架可以简化数据库访问操作,要程序员将更多的经历放在业务层编写上原有JDBC操作数据库存在一些问题,主要有以下几个方面:a需要编写大量复杂的SQL语句b需要设置大量的SQL参数或者将ResultSet取值封装成实体对象c当数据库移值时,需要修改部分SQL语句和操作使用Hibernate框架可以解决以上问题什么是ORM?ORMObjectRelationMapping对象关系映射意思是将程序中的实体对象和关系数据库表中的一行记录进行映射这样在程序中使用该工具就可以将一个对象写入数据表,或者将数据表记录自动封装成一个对象返回(这个也是Hibernate实现的原理)Hibernate的几个核心接口Configuration类Configuration用于配置并启动HibernateSessionFactory接口一个SessionFactory对应一个数据源,它是个重量级对象,不可随意生成多个实例它是线程安全的,同一个实例可以被应用中的多个线程共享Session接口Session接口是Hibernate应用中使用最广泛的接口了,它是持久化管理器,提供添加、更新、删除、加载、查询对象Session不是线程安全的,所以应避免多个线程共享同一个Session实例Session是轻量级对象,它的创建和销毁不需要太多资源,这意味着在应用中可以经常创建和销毁Session对象Transaction接口Transaction是Hibernate的数据库事务接口,它对底层的事务接口进行了封装Query和Criteria接口这两个是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程Hibernate中的主键生成方式有哪些Hibernate一级缓存?是session级别的缓存a.当查询某个对象时,Hibernate首先去一级缓存中查找,如果存在将缓存中的对象取出返回如果不存在才去数据库查询b.当查询某个对象时,Hibernate会自动将数据库查询出的对象放入一级缓存(例如session的load和get方法查出的对象)c.一级缓存默认启用,一般被称为Session级别的缓存因此一级缓存随着Session对象创建,随着Session对象释放而销毁d.每个Session都有自己一个独立的一级缓存空间,不能访问其他Session的缓存空间----------------------一级缓存的好处-------------------------在使用同一个Session查询同一个对象若干次的时候,只在第一次时查询数据库,后续几次都会从缓存取出从而减少对数据库的查询次数-----------------------**使用建议(重点)**----------------------------为了将一级缓存的优势更好的发挥出来,建议在处理一个请求时,使用一个Session对象处理可以使用ThreadLocal技术封装Session.在Hibernate中,可以!--指定将session与处理线程绑定,实现线程单例--propertyname=current_session_context_classthread/propertyHibernate的二级缓存二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享,可以被多个不Session对象访问二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存线程单例及其使用Hibernate中session的get和load方法区别?相同点作用相同,都是按照主键条件查询某个对象不同点
1.get方法不使用延迟加载机制,load采用延迟加载机制
2.如果没有满足条件的记录,get方法返回null,load则抛出异常3).load方法返回的对象是一个动态代理类(Hibernate框架动态生成的,是实体类的子类型)
4.get方法返回的对象类型就是原实体类型注意:a.在程序中,如果使用上述延迟加载操作,需要避免Session对象过早关闭问题(couldnotinitializeproxy-noSession)b.为避免上述异常,一般采用OpenSessionInView模式c.可以将Session关闭采用Filter或InterceptorStruts2推荐封装HQL和SQL的区别HibernateQueryLanguage(Hibernate查询语言)结构化查询语言StructuredQueryLanguage简称SQLHQL语句结构与SQL语句相似,SQL语句是面向数据表和字段进行查询,而HQL是面向映射后的对象和属性进行查询因此HQL被称为面向对象查询语句HQL语句与SQL相似点如下a.HQL语句支持selectfromwhereorderbygroupbyhaving子句b.HQL语句支持分组函数maxminavgsumcountc.HQL语句支持运算符和表达式d.HQL语句支持==innotinlikebetween...and...!=等查询条件也支持andor关键字e.HQL语句支持innerjoinleftouterjoinfulljoin等连接HQL语句与SQL不同点如下下面内容为重点a.HQL区分大小写(大小写敏感)除关键字之外b.HQL语句使用的类名和属性名(将SQL表名替换成类名,字段名替换成属性名)c.HQL不支持select*写法,但支持selectcount*d.HQL语句不支持表连接的on子句,on关联条件可以通过关联映射自动追加Hibernate中操作并发处理(乐观锁和悲观锁)Hibernate框架可以使用锁的机制来解决操作并发a.悲观锁在数据查询出来时,就给数据加一个锁,锁定这样其他用户再执行删、改操作时不允许当占用着事务结束,锁会自动解除Hibernate采用的是数据库锁机制实现悲观锁控制缺点将并发用户操作同步开,一个一个处理当一个用户处理时间比较长时,效率会比较低b.乐观锁允许同时更新提交,但是最快的会成功,慢的失败在记录中追加一个字段值,用该字段值当做版本当最先提交者提交后,会自动将版本字段值提升,这样其他用户提交,会发现版本低于数据库记录目前版本,因此抛出异常提示失败特点允许用户同时处理,但只能有一个成功,其他失败,以异常方式提示Spring框架的作用和好处?Spring框架提供了一个容器,该容器可以管理应用程序的组件,还提供了IoC和AoP机制,实现组件之间解耦,提高程序结构的灵活性,增强系统的可维护和可扩展性在SSH整合开发中,利用Spring管理Service、DAO等组件,利用IoC机制实现Action和ServiceService和DAO之间低耦合调用利用AoP机制实现事务管理、以及共通功能的切入等功能是整合,好处是解耦IoCInverseofController控制反转?控制权A调用B组件,可以说成A组件拥有控制权控制权可以代指对象的创建、初始化、销毁等操作控制反转是将控制权转移,转移给第三方(Spring容器),当需要改变对象关系时,只需要修改Spring容器注入配置即可IoC是一种思想,Spring框架通过DI(依赖注入:setter注入和构造方法注入)技术实现了控制反转什么是AOPAspectOrientedProgramming面向方面编程面向方面编程侧重点是关注方面组件(共通处理部分),可以将方面组件作用到某一批目标对象的方法上面向对象编程侧重点是关注对象,如何构建一个对象类型面向方面编程是基于面向对象编程的,主要用于改善程序结构,降低组件耦合度在SSH的组合框架模式中,三者各自的作用? Struts是一个很好的MVC框架,主要技术是Servlet和JspStruts的MVC设计模式可以使我们的逻辑变得很清晰,让我们写的程序层次分明基于Struts开发可以简化开发难度,提高开发效率 Spring提供了管理业务对象的一致方法,并鼓励注入对接口编程而不是对类编程的良好习惯,使我们的产品在最大程度上解耦Hibernate是用来持久化数据的,提供了完全面向对象的数据库操作Hibernate对JDBC进行了非常轻量级的封装,它使得与关系型数据库打交道变得非常轻松在Struts+Spring+Hibernate系统中,对象之间的调用流程如下 Struts——Spring——Hibernate JSP——Action——Service——DAO——HibernateSSH工作流程?a.启动服务器,加载工程以及web.xml.实例化LisenerFilter等组件,将Spring容器和Struts2控制创建b.客户端发送请求,所有请求进入Struts2控制器控制器根据请求类型不同,分别处理action请求,*.action会进入struts.xml寻找action配置.其他请求,*.jsp会直接调用请求资源,生成响应信息c.Struts2控制器根据action配置调用一个Action对象处理整合方法一将Action交给Spring容器Action对象由struts2-spring-plugin.jar插件提供的StrutsSpringObjectFactory负责去Spring容器获取整合方法二将Action置于Spring容器之外Action对象由struts2-spring-plugin.jar插件提供的StrutsSpringObjectFactory负责创建,然后到Spring容器中寻找与Action属性匹配的Bean对象,给Action对象注入默认采用名称匹配规则d.Struts2控制器执行defaultStack拦截器、Action对象、Result等组件处理.e.执行Action的execute业务方法时,如果使用Service或DAO采用Spring的IoC机制调用f.执行Result生成响应信息,执行后续拦截器处理g.将响应信息输出。