第一篇:java知识点小结
java重要知识点总结如下:
1,抽象,封装,继承,多态是面向对象程序设计中得四个特点.2,面向对象得软件开发大体分为:面向对象的分析,面向对象的设计,面向对象的实现.可概括为如下过程:分析用户需求,从问题中抽取对象模型;细化模型,设计类,包括类的属性和类间的
相互关系,同时观察是否有可以直接引用的已有类或部件;选定一种面向对象的编程语言,具体编码实现
上一阶段类的设计,并在开发过程中引入测试,完善整个解决方案.3,面向对象程序设计方法的优点是:可重用性,可扩展性,可管理性.4,类的定义:class前的修饰符分为访问控制符和非访问控制符两大类.访问控制符包括public和private.非访问控制符包括abstract(抽象),final(最终).5,final类是最终类,是不能有子类的类.abstract和final不能同时修饰一个类,因为抽象类本身没有具体对象,需要派生出子类后在创建子类的对象.而最终类不可能有子类.6,创建对象的格式为: 类名 对象名=new 构造方法(参数);注意前面是类名后面是构造方法.注意构造方法没有返回类型,也不能写void,主要用于完成类对象的初始化工作,一般不能直接由编程
直接调用,而是用new运算符来调用.7,如果class前面由public修饰符,则默认构造方法的前面也应该有public修饰符.8,类中有static修饰的域或方法,可用类名或对象名访问,否则只能用对象名访问.9,修饰域的访问控制符可以是:public,private,protected,private protected.非访问控制符可以是:
static,final,volatile(易失域)
10,类变量的最本质的特点是:他们是类的域,不属于任何一个类的具体对象实例.不是保存在某个对象实例的内存空间中,而是保存在类的内存区域的公共存储单元中.11,局部变量是在方法体内声明的,只有当方法被调用时他们才存在,因而只能在本方法内使用,不存在访问控制符,也不能声明为静态变量(static),但可以声明为final变量.局部变量必须初始化.12,修饰方法的访问控制符可以是:public,private,protected,private protected,修饰方法的非访问控制符可以是:static,final,abstract,native(本地方法),synchronized(同步方法)。
13,用static修饰的变量或方法都为类成员,类成员可以用类名或实例名访问,实例成员只能用实例名来访问。
14,如果一个类中含有抽象方法,则此类必须为抽象类,如果抽象类的子类不为抽象类,则子类必须实现父类的所有抽象方法。抽象方法不能用静态方法和最终方法。抽想方法只有函数头的声明,而用分号来替代方法体,没有大括号。如abstract void abstractmethod();
15,this变量用在一个方法的内部,指向当前对象,当前对象指的是调用当前正在执行的方法的那个对象。super变量是直接指向父类的构造方法,用来引用父类种的变量和方法。(由于他们指的是对象,所以不能通过它来引用类变量和类方法)
16,如果要引用一个包中的多个类,可以用星号来代替。使用星号只能表示本层次的所有类,而不包括子层次下的类。所以经常需要用两条语句来引入两个层次的类:import java.awt.*;import java.awt.event.*;
17,访问修饰符:
--类中限定为public的成员可以被所有的类访问。
--类中先定位private的成员只能被这个类本身访问。同一个类的不同对象可以访问对方的private域变量或调用对方的域方法,这是因为访问保护控制在类的级别上,而不是对象的级别上。
--类中限定为protected的成员可以被这个类本身,它的子类(包括同一个包中和不同包中的子类),以及同一个包中的其他类访问。
--用private protected修饰的成员可以被该类本身访问,也可以被该类的所有子类访问。
--默认访问控制符规定只能被同一个包中的类访问和引用,而不能被其他包的类访问。即他的访问权限是friendly。
18,注意:
----abstract和private,static,final,native不能并列修饰同一个方法。
----abstract类中不能有private修饰的域和方法
----static方法不能处理非static的域。
19,重载方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。重载的多个方法必须返回相同的数据类型。
20,在java中,一个类获取某一接口定义的功能并不是通过直接继承这个接口的属性和方法来实现的。因为接口中的属性都是常量,接口的方法都是没有方法体的抽象方法,没有具体定义操作。
第二篇:java小结
//1.累加 public class 累加 {
}
//2.阶乘
public class 30的阶乘 {
} public static void main(String[] args){
} int product=1;for(int i=1;i<=30;i++){ product=*i;} public static void main(String[] args){
} int i=1;for(int counter=1;counter<=100;counter++){ } System.out.println(i);i+=counter;
//3.倒序输出
法1 用char数组思想 import java.util.Scanner;public class 逆序输出 {
public static void main(String[] args){
Scanner scan=new Scanner(System.in);// String input[]=new String[4];input=scan.nextLine();// huiche
// String result=“";char[] Array=input[4].toCharArray();for(int i=Array.length-1;i>=0;i--){
} result+=Array[i];} System.out.println(result);} //倒序输出 法2 用reverse()方法 import javax.swing.JOptionPane;public static void main(String[] args){
}
String a = null;StringBuffer b;//输入
a=JOptionPane.showInputDialog(a);StringBuffer c1=new StringBuffer(a);b=c1.reverse();System.out.println(b);
//4.输出100 121 144...361 public class平方输入数组 {
}
//5.求最大公约数
private static int gys(int m,int n)
{
if(n==0)
return m;else public static void main(String[] args){
} int[] array=new int[10];for(int i=0;i<10;i++){ } array[i]=Math.pow((i+10),2.0);
for(int k=0;k return gcd(n,m%n); } //6.求最小公倍数 public static int gbs(int n1,int n2){ int a =(n1>n2)? n1 : n2; for(int j=a;j<=n1*n2;j++) { if(j%n1==0 && j%n2==0) { return j; } } return 0;} //7.1)十进制整数转化为二进制整数采用“除2取余,逆序排列” import java.util.Scanner;public class Main { public static void main(String[] args){ //第一行输入要几组测试数据 int N=0,a;//N为输入几组数据,a为输入的十进制数字 } String b = null;Scanner scan=new Scanner(System.in);N=scan.nextInt();Main num=new Main();for(int i=1;i<=N;i++){ } a=scan.nextInt();b=num.deimalBinary(a);int d=num.Calcute(b);if(d%2==0)System.out.println(”Even“);else System.out.println(”Odd“); /*一个方法得到二进制数,用递归 *用2去除十进制整数,可以得到一个商和余数; *再用2去除商,又会得到一个商和余数,} *如此进行,直到商为零时为止,*然后把先得到的余数作为二进制数的低位有效位,*后得到的余数作为二进制数的高位有效位,依次排列起来 */ public String deimalBinary(int a){ } public int Calcute(String b){ } char[] Array=b.toCharArray();for(int i=0;i } if(Array[i]=='1'){ } counter+=1;return counter; //7.2)十进制小数转换为二进制小数采用“乘2取整,顺序排列” /*用2乘十进制小数,可以得到积,*将积的整数部分取出,再用2乘余下的小数部分,//8.矩阵运算(加减乘)//矩阵运算 *又得到一个积,再将积的整数部分取出,*如此进行,直到积中的小数部分为零,*或者达到所要求的精度为止。 *然后把取出的整数部分按顺序排列起来,*先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。*/ import java.util.Scanner;public class Main { public static void main(String[] args){ int N1,M1,N2,M2,K;Scanner scan=new Scanner(System.in);N1=scan.nextInt();M1=scan.nextInt();int[][] a=new int[N1][M1];for(int i=0;i for(int j=0;j N2=scan.nextInt();M2=scan.nextInt();int[][] b=new int[N2][M2];for(int i=0;i { } b[i][j]=scan.nextInt();} K=scan.nextInt();if(K==1)//加法 { int[][] c=new int[N1][M1];for(int i=0;i } { for(int j=0;j } System.out.println();} } if(K==2)//减法 { int[][] c=new int[N1][M1];for(int i=0;i } for(int j=0;j for(int j:i){ System.out.print(j+” “);} System.out.println();} } if(K==3)//乘法 { int[][] c=new int[N1][M2];for(int i=0;i } { for(int j=0;j } for(int p=0;p c[i][j]+=a[i][p]*b[p][j];for(int[] i:c)for(int j:i){ System.out.print(j+” “);} System.out.println();} } } } 9.//保留确定位数输出 import java.text.DecimalFormat;//非四舍五入 DecimalFormat myformat=new DecimalFormat(”#0.00"); myformat.format(double num);//四舍五入,例为保留2位 double f=3.1415926; BigDecimal a=new BigDecimal(f); double af=a.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); 目录 目录................................................................................................................................................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 原文[2007年03月25日 星期日 上午 03:04] Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE。这三块相互补充,应用范围不同。 J2SE就是Java2的标准版,主要用于桌面应用软件的编程; J2ME主要应用于嵌入是系统开发,如手机和PDA的编程; J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。先学习j2se 要学习j2ee就要先学习j2se,刚开始学习j2se先建议不要使用IDE,然后渐渐的过渡到使用IDE开发,毕竟用它方便嘛。学习j2se推荐两本书,《java2核心技术一二卷》,《java编程思想》,《java模式》。其中《java编程思想》要研读,精读。这一段时间是基本功学习,时间会很长,也可能很短,这要看学习者自身水平而定。 不要被IDE纠缠 在学习java和j2ee过程中,你会遇到五花八门的IDE,不要被他们迷惑,学JAVA的时候,要学语言本身的东西,不要太在意IDE的附加功能,JAVA编程在不同IDE之间的转换是很容易的,过于的在意IDE的功能反而容易耽误对语言本身的理解。目前流行的IDE有jbuilder,eclipse和eclipse的加强版WSAD。用好其中一个就可以了,推荐从eclipse入手j2ee。因为Jbuilder更适合于写j2se程序。 选择和学习服务器使用配置 当你有了j2se和IDE的经验时,可以开始j2ee的学习了,web服务器:tomcat,勿庸置疑,tomcat为学习web服务首选。而应用服务器目前主要有三个:jboss、weblogic、websphere。有很多项目开始采用jboss,并且有大量的公司开始做websphere或weblogic向jboss应用服务器的移植(节省成本),这里要说的是,学习tomcat和jboss我认为是首选,也是最容易上手的。学习服务器使用配置最好去询问有经验的人(有条件的话),因为他们或许一句话就能解决问题,你自己上网摸索可能要一两天(我就干过这种傻事),我们应该把主要时间放在学习原理和理论上,一项特定技术的使用永远代替不了一个人的知识和学问。 学习web知识 如果你是在做电子商务网站等时,你可能要充当几个角色,这是你还要学习: html,可能要用到dreamwave等IDE。 Javascript,学会简单的数据校验,数据联动显示等等 J2eeAPI学习 学习j2eeAPI和学习服务器应该是一个迭代的过程。 先学习jsp和servlet编程,这方面的书很多,我建立看oreilly公司的两本《jsp设计》和《java servlet编程》,oreilly出的书总是那本优秀,不得不佩服。 学习jdbc数据库编程,j2ee项目大多都是MIS系统,访问数据库是核心。这本应属于j2se学习中,这里拿出来强调一下。 学习jndi api,它和学习ejb可以结合起来。 学习ejb api,推荐书《精通ejb》 经过上面的这些的学习,大概可以对付一般的应用了。 有人说跟着sun公司的《j2ee tutorial》一路学下来,当然也可以。 学习ejb设计模式和看代码(最重要) 设计模式是练内功,其重要性可以这么说吧,如果你不会用设计模式的话,你将写出一堆使用了ejb的垃圾,有慢又是一堆bug,其结果不如不用ejb实现(ejb不等于j2ee) 无论学习什么语言,都应该看大量代码,你看的代码量不到一定数量,是学不好j2ee的目前有很多开源的工程可以作为教材: jive论坛 petstore sun公司 dune sun公司 等等,研读一个,并把它用到自己的工程中来。 J2ee其他学习 当你渐渐对j2ee了解到一定深度时,你要开始关注当前领域中的一些技术变化,J2ee是一块百家争鸣的领域,大家都在这里提出自己的解决方案,例如structs,hiberate,ofbiz等等,学习这些东西要你的项目和目标而定,预先补充一下未尝不可,但不用涉及太深,毕竟学习原理和理论是最最重要的事。 目前常见j2eeAPI JavaServer Pages(JSP)技术1.2 Java Servlet技术2.3 JDBC API 2.0 Java XML处理API(JAXP)1.1 Enterprise JavaBeans技术2.0 Java消息服务(JMS)1.0 Java命名目录接口(JNDI)1.2 Java事务API(JTA)1.0 JavaMail API 1.2 JavaBeans激活架构(JAF)1.0 J2EE连接器体系结构(JCA)1.0 Java认证和授权服务(JAAS)1.0 学习上面的某些API要以你的项目而定,了解所有他们总之是有好处的上面印证了大家说的一句话,java语言本身不难学,但是技术太多,所以学java很费劲。回想一下,基本上每个初学者,在刚学习java的时候可能都会问别人这么一句话,你怎么知道的哪个方法(api)在哪个包里的?呵呵,无他,唯手熟尔。 2008年10月29日 星期三 下午 9:29 [ティン]The only one is in my world,the favourite song is wrote for you!1 垃圾收集器的问题 工作原理:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象中的内存。垃圾收集并不等于破坏! 用途;垃圾收集存在的唯一原因是为了回收程序不在是用的内存 2对象构造 (1)重载:如果多个方法,比如有相同的名字,不同的参数,便产生了重载。 ToSitrng()方法用于返回表示对象值的字符串 3监听器 监听器对象实现listener interface类 事件源是一个能够注册监听器对象并发送事件对象的对象 当事件发生时,事件源将事件对象中的信息决定如何对时间做出响应 异常、日志调试 1 用户输入错误 2 设备错误 3 物理限制 4 代码错误 Error 和Exception Error类层次结构描述了java运行时系统的内部错误和资源耗尽错误,应用程序不应该抛出这种类型的对象。如果出现了这样的错误,除了通告给用户,并尽力使程序终止之外,再也无能为力了。 Exception 划分为 RuntimeException;另一个分为其它异常 只有是应用程序错误导致的异常才叫做 RuntimeException RuntimeException出现的情况:错误的类型转换;数组访问越界;访问空指针 4集合 循环数组是一个有界的集合,是有限的容量,如果程序中没有收集数量的上线就最好是用链表来实现 Collection接口有两个方法 Add 用于向集合中添加元素 Iterator 迭代器对象可以一次访问几个中的元素 Special Drivin' Date(只 凝 视 着 你) 项目设计思路 1对象是什么(怎样将自己的项目分割成一系列单独的组件?) 2它们的接口是什么(需要将什么消息发送给每一个对象?)阶段0 模拟出一个计划 设定路标 阶段1 要制作什么 需求分析 阶段2 如何构建 UML 阶段3 开始创建 阶段4 校订 维护 向对象发送消息 Int x =a.f();f()方法的返回值类型必须是int类型 For循环在第一次反复之前要进行初始化 for(初始表达式;布尔表达式;步进) 无论继承还是合成,我们都可以在现有类型的基础上创建一个新类型。但在典型情况下,我们通过合成来实 现现有类型的“再生”或“重复使用”,将其作为新类型基础实施过程的一部分使用。但如果想实现接口的 “再生”,就应使用继承。由于衍生或派生出来的类拥有基础类的接口,所以能够将其“上溯造型”为基础 类。对于下一章要讲述的多形性问题,这一点是至关重要的。 尽管继承在面向对象的程序设计中得到了特别的强调,但在实际启动一个设计时,最好还是先考虑采用合成 技术。只有在特别必要的时候,才应考虑采用继承技术(下一章还会讲到这个问题)。合成显得更加灵活。 但是,通过对自己的成员类型应用一些继承技巧,可在运行期准确改变那些成员对象的类型,由此可改变它们的行为。第三篇:java知识点总结(定稿)
第四篇:java个人小结(范文模版)
第五篇:java小结