热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java基础大全简单概括

java语言的特点特点一:完全面向对象两个基本概念:类、对象三大特性:封装、继承

java语言的特点

特点一:完全面向对象

两个基本概念:类、对象

三大特性:封装、继承、多态

特点二:健壮性

吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分。如:指针、内存的申请与释放等

特点三:跨平台性

跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。一次编译,处处运行(因为jvm)

Java两大核心机制

Java虚拟机(Java Virtual Machine)

JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器。

JVM 用于运行 Java 应用程序。

对于不同的平台,有不同的虚拟机。

Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”。

垃圾收集机制(Garbage Collection)

垃圾回收:将不再使用的内存空间进行回收。

在 C/C++ 等语言中,由程序员负责回收无用内存。

Java 不需要程序员负责回收无用的内存:它提供一种系统级线程跟踪存储空间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。

垃圾回收在 Java 程序运行过程中自动进行,程序员无法精确控制和干预。

标识符定义规范

由26个英文字母大小写,数字:0-9 ,_或 $ 组成  

数字不可以开头。

不可以使用关键字和保留字,但能包含关键字和保留字。

Java中严格区分大小写,长度无限制。

标识符不能包含空格

数据类型分类

基本数据类型

数值型:整数类型(byte,short,int,long)、浮点类型(float,double){long类型常量后加L,float后加F}

字符型(char)

布尔型(boolean)

引用数据类型

类(class)

接口(interface)

数组([ ])

转义字符:使用‘\’来将其后的字符转变为特殊字符型常量。例如:char c3 = ‘\n’;  (换行符)

基本数据类型转换

容量小的类型自动转换为容量大的数据类型

当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型

大的转小的要强转

算数运算符

++或--在等号前面:先运算后取值

在后面:先取值后运算

&和&&的区别:单&时,左边无论真假,右边都进行运算;

双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。

面向对象:

是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

成员、局部变量

成员变量:如果在声明的时候,不显式的赋值,那么不同数据类型会有不同的默认初始化值。

byte short int lOng==>0

float double ==>0.0

char ==>空格

boolean ==>false

引用类型变量==>null

局部变量:一定要显式的赋值。(局部变量没有默认初始化值)

参数传递:

基本类型传值,对象类型传地址

按值传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的一个副本。因此,如果方法修改了该参数,仅改变副本,而原始值保持不变。

按引用传递意味着当将一个参数传递给一个方法时,方法接收的是原始值的内存地址,而不是值的副本。因此,如果方法修改了该参数,调用代码中的原始值也随之改变。

“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”

封装的意义:

使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据

的错误、混乱或安全性问题。

Java中通过将数据声明为私有的(private),再提供公开的(public)方法:getXXX和setXXX实现对该属性的操作,以实现下述目的:

隐藏一个类的实现细节;

提高安全性,使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;

便于修改,增强代码的可维护性;

构造方法作用:

创建对象

利用构造器参数初始化对象的属性。

继承

Java只支持单继承,不允许多重继承

子类继承了父类,就继承了父类的方法和属性。

在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。同时可以重写父类的方法

因而,子类通常比父类的功能更多

所有类的基类都是Object

This

代表对象。代表哪个对象呢?当前对象。

this就是所在函数所属对象的引用。

简单说:哪个对象调用了this所在的函数, this就代表哪个对象。

This、super也可以用于在构造函数中调用其他构造函数。

注意:只能定义在构造函数的第一行。因为初始化动作要先执行。

父类构造方法的调用:

子类继承父类所有的成员变量和成员方法,但不继承父类的构造方法

在子类的构造方法中可使用super(参数列表)形式的语句调用父类的构造方法

如果子类的构造方法中没有显示地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法

如果子类构造方法中既未显式调用父类构造方法,而父类中又没有无参的构造方法,则编译出错

类的初始化过程:

对于一个简单类的初始化过程是:

    static 修饰的模块(static变量和static 块)  ---> 按照代码顺序依次执行。

        |

    实例变量  及非static模块---> 按照代码顺序依次执行。

        |

构造函数 ---> 执行对应的构造函数。

 

子类的初始化过程。

    父类static修饰的模块

        |

    子类static修饰模块

        |

    父类实例变量和非static块

        |

    父类对应构造函数。当子类对应构造函数中没有显示调用时调用的是父类默认的构造函数。

        |

    子类实例变量和非static块

        |

    子类构造函数

访问权限修饰符

 

同一个类

同一个包

不同包的子类

不同包的非子类

Private

 

 

 

Default

 

 

Protected

 

Public

多态

概念:

多态性,可以理解为一个事物的多种表型形态。在Java中有两种体现:

方法的重载(overload)和重写(overwrite)

对象的多态性(可以直接应用在抽象类和接口上)

对象的多态性是什么?:一个对象多种形态;在Java中,子类的对象可以替代父类的对象使用

作用:

1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。

重写和重载

重写:

在子类中可以根据需要对从父类中继承来的方法进行改造重写方法,在程序执行时,子类的方法将覆盖父类的方法。

方法重写必须和被重写的方法具有相同的方法名、参数列表和返回值类型。

重写方法不能使用比被重写方法更严格的访问权限。

重载:

所谓方法重载是指在一个类中,多个方法的方法名相同,但是参数列表不同。

参数列表不同指的是参数个数、参数类型或者参数的顺序不同。

不仅是一般的方法,构造方法也可以重载。

用时,Java虚拟机就会根
据不同的参数列表来选择合适的方法执行。

static关键字

可以修饰变量,也可修饰方法

Static修饰变量,成为类变量。类变量中所有对象共享一套数据,类名.静态变量名

Static修饰方法:所有对象共享,类名.静态方法

在静态方法里只能直接调用同类中其它的静态成员(包括变量和方法),而不能直接访 问类中的非静态成员。

静态方法不能以任何方式引用this关键字。因为静态方法在使用前不用创建任何实例对 象,当静态方法被调用时,this所引用的对象根本就没有产生。

main() 方法是静态的,因此JVM在执行main方法时不创建main方法所在的类的实例 对象,因而在main()方法中,我们不能直接访问该类中的非静态成员。

随着类的加载而加载,只加载一次

类属性作为该类各个对象之间共享的变量。

作用:

随着类的加载而加载,只加载一次

类属性作为该类各个对象之间共享的变量。

在设计类时,分析哪些类属性不因对象的不同而改变,将这些属性设置为类属性。

如果方法与调用者无关,则这样的方法通常被声明为类方法,由于不需要创建对象就可 以调用类方法,从而简化了方法的调用。

Final关键字

Final修饰的类不能被继承,例如String

Final修饰的方法不能被重写:

Final修饰的基本数据类型变量,初始化不能被修改

Final修饰引用数据类型变量,地址不能被修改,即不能把一个其他变量赋值给它

接口和抽象类

抽象类

类可以定义为抽象类

有抽象方法的类都是抽象类

抽象方法应用场景:

方法的实现没想好

无法统一子类的实现

如果父类中有抽象方法,子类不实现,子类必须为抽象类

抽象类不能被实例化

抽象类不能用abstract修饰属性、私有方法、构造器、静态方法、final的方法

属性:Abstract只能修饰类,方法。属性(成员变量)都有具体的值。

私有方法:如果能修饰,子类可以实现私有方法。私有方法只有本类能访问到,子类没有访问权限,既然不能访问就不能实现,子类必须定义为抽象类,子类继承类也必须是抽象类。子类中没有类能定义为非抽象类,无法用构造方法创建对象。

构造方法:构造方法特点:和本类类名相同。构造方法在子类中不能被重写。如果能够修饰构造方法,构造方法在父类中只有声明,需要在子类中重写。所有不能修饰,矛盾

静态方法:静态方法调用规则:类名.静态方法。如果能修饰,静态方法只能声明,不能有实现。矛盾

Final:final修饰的方法,不能被重写。如果用abstract修饰,目的是让子类实现这个方法。又不能被重写,又要求实现,矛盾

接口应用场景:

无法统一实现,即使实现了意义也不大

软件实现流程,详细设计阶段。统一类功能,方法名,返回,参数等信息

接口的特点:

用 interface 来定义。

接口中的所有成员变量都默认是由public static final修饰的。

接口中的所有方法都默认是由public abstract修饰的。

接口没有构造方法。

实现接口的类必须提供接口中所有方法的具体实现内容。

抽象类VS接口

相同点:

接口和抽象类都不能被实例化。只能被其他类实现和继承。

接口和抽象类都可以包含抽象方法,实现接口和抽象类的类都必须实现这些抽象方法,否则实现的类就是抽象类。

不同点

抽象类与接口定义不同:抽象类abstract class ,接口  interface

接口里只能包含抽象方法,不包含已经实现的方法;抽象类则完全可以包含普通的方法。

接口里不能定义静态方法;抽象类可以定义静态方法

接口里只能定义静态常量属性,不能定义普通属性;抽象类里既可以定义普通属性,也可以定义静态常量

接口不包含构造函数;抽象类可以包含构造函数,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。

一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java的单继承不足

22、java的常用类有哪些?(jdk)(问过好几次)

Object类

String类

StringBuffer类

包装类

Date类

Calendar类

 

==和equals方法区别:

==比较引用地址,

equals只能比较引用数据类型,在Object类的定义中,其作用与“==”相同,比较是否指向同一个对象。

注意:对类File、String、Date、封装类(Wrapper Class)及很多重写了equals()方法的类来说,是比较类型及内容而不考虑引用是否指向同一个对象

java集合框架和泛型

Java 集合可分为 Set、List 和 Map 三种体系

Set:无序、不可重复的集合,set又是以map为底层实现

List:有序,可重复的集合,list接口是以数组为底层实现,是有序的

Map:具有映射关系的集合,key-value(键值对),map接口底层是hash函数,无续(不是随机)

 

遍历:

Iterator接口表示对集合进行迭代的迭代器,专门实现集合的遍历。

方法:

hasNext():判断是否存在另一个可访问的元素

next():返回要访问的下一个元素foreach:

HashMap 和 Hashtable 都是 Map 接口的实现类

区别:

Hashtable 不建议使用,线程安全

HashMap 是线程不安全的。

Hashtable 不允许使用 null 作为 key 和 value,而 HashMap 可以

  1. 为什么要使用泛型?

类型安全:通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中

如果你添加其它类型的任何元素,它会在编译时报错

  1. 三大集合适用场景

List:有序的,需要按存入顺序储存时,查询操作频繁

Set:无序,不可重复,存放一些不能重复的元素时

Map:存放一些有键值对的信息

单例模式

单例模式只能有一个实例

单例类必须创建自己的唯一实例

单例类必须向其他对象提供这一实例

 

指向自己实例的私有静态引用

私有的构造方法

以自己实例为返回值的静态的公有的方法

多线程

程序(program)计算机指令的集合

进程(process) 是一个程序的一次执行活动;是系统 进行资源分配、调度和独立运行的基本单位。

线程(thread),是进程中的一个单一的连续控制流程,是操作系统能够运算调度的最小单位。被包含在进程中,是进程中的实际运作单位。一个进程可以拥有多个线程。

进程和线程的区别

(1)地址空间:线程是进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

(3)线程是处理器调度的最小单位,但进程不是.

多线程不是万能的.它是并发的,也就是说,它在创建和切换资源时还要额外消耗资源.

 

并发和并行的区别:

并发:一个处理器同时处理多个任务   (一个人同时吃三个馒头)

并行:多个处理器同时处理多个不同的任务  (三个人同时吃三个馒头)

 

为什么需要多线程

程序需要同时执行两个或多个任务。

程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等。

需要一些后台运行的程序时。

  1. 多线程常用的方法

void start():  启动线程,并执行对象的run()方法

run():  线程在被调度时执行的操作

static  void  yield():线程让步

暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程

若队列中没有同优先级的线程,忽略此方法

join() :当某个程序执行流中调用其他线程的 join() 方法时,调用线程将被阻塞,直到 join() 方法加入的 join 线程执行完为止   

低优先级的线程也可以获得执行

static  void  sleep(long millis):(指定时间:毫秒)

令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后重排队。

抛出InterruptedException异常

stop(): 强制线程生命期结束

boolean isAlive():返回boolean,判断线程是否还活着

创建线程的两种方法和区别?

区别:

继承Thread:       线程代码存放Thread子类run方法中。

实现Runnable:线程代码存在接口的子类的run方法。

实现方法的好处:

1)避免了单继承的局限性

2)多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源。

30、多线程优点:

提高应用程序的响应。对图形化界面更有意义,可增强用户体验。

改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改

线程不安全问题:

  1. 互斥锁:

在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。

每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

关键字synchronized 来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。

同步的局限性:导致程序的执行效率要降低

同步方法(非静态的)的锁为this。

同步方法(静态的)的锁为当前类本身。

  1. 死锁

死锁

不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁

解决方法

专门的算法、原则

尽量减少同步资源的定义

异常分类:

Error:  JVM系统内部错误、资源耗尽等严重情况//无法控制,不处理

是程序无法处理的错误,表示运行应用程序中较严重问题。

Exception: 其它因编程错误或偶然的外在因素导致的一般性问题。比如:空指针访问、试图读取不存在的文件等。

是程序本身可以处理的异常

常见异常:

RuntimeException

错误的类型转换

数组下标越界

算数异常

空指针访问

IOExeption

从一个不存在的文件中读取数据

越过文件结尾继续读取

连接一个不存在的URL

  1. 异常处理机制

Try catch或者throws抛出

try {

    ...... //可能产生异常的代码

}

catch( ExceptionName1 e ) {

    ...... //当产生ExceptionName1型异常时的处置措施

}

catch( ExceptionName2 e ) {

    ...... //当产生ExceptionName2型异常时的处置措施

}  

[ finally{

......  //无条件执行的语句

}  ]

io流

File类:通过构造函数创建一个File类对象,则该对象就是指定文件的引用,可以通过该对象对文件操作。

分类:

按流向(站位到程序的角度):

输入流

输出流

按处理的单位:

字节流(8bit)byte

字符流(16bit)char

Io常用类(简单记几个)

字节流文件读写步骤:

创建文件对象:File  f = new File(“文件路径”);

根据文件对象创建输入输出流

 

实现对文件的读写

读:filein.read(字节数组);//将文件内容读到指定的字节数组

写:fileout.write(字节数组);//将指定字节数组中的数据写到文件

 

关闭流

filein.close();

fileout.close();

 

序列化

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据

对象序列化:对象序列化的目标是将对象保存到磁盘上,或允许在网络中直接传输对象。

  1. 反射:

反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。

作用:

动态编译:需要什么加载什么

举例:

很多框架(比如 Spring)都是配置化的(比如通过 XML文件配置JavaBean,Action之类的),为了保证框架的通用性,他们可能根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象

反射开销是昂贵的

TCP和UDP

TCP:

使用TCP协议前,须先建立TCP连接,形成传输数据通道

传输前,采用“三次握手”方式,是可靠的

TCP协议进行通信的两个应用进程:客户端、服务端

在连接中可进行大数据量的传输

传输完毕,需释放已建立的连接,效率低

UDP:

将数据、源、目的封装成数据包,不需要建立连接

每个数据报的大小限制在64K

因无需连接,故是不可靠的

发送数据结束时无需释放资源,速度快

 

 

 

 

Servlet

B/S架构:  浏览器端与服务器端的交互   UI界面是在服务端器

B/S架构优势:

用户不需要更新应用程序

几乎不占用用户的资源

数据更安全

Servlet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的生命周期,以及管理它们的共享数据。:Tomcat

Java Servlet是和平台无关的基于Java技术的Web组件

Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。

Servlet的功能:

  1:接收用户请求的HTTP协议,解析。

  2:返回一个http的响应协议。让浏览器再去解析。

常见状态码:

200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中

302 :请求重定向,你访问我,我通知你访问另一个资源  

304 :如果再次访问的页面没有经过修改,通知浏览器去读缓存  

404 :找不到资源  

500 :服务器程序出错

Servlet声明周期:

加载阶段:加载并实例化(创建servlet实例)

初始化阶段: 调用init()方法

响应客户请求阶段:调用service()方法,一般业务逻辑在这里处理,该方法在访问该servlet时,会被调用

终止阶段:调用destroy()方法

Servlet是单例的

Servlet线程安全问题:

servlet首先不是线程安全的。Servlet体系结构是建立在Java多线程机制之上的,

当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。

解决方法:

使用 synchronized同步代码块。效率太低,不建议使用

不能依赖实例全局成员变量。将接收参数的变量声明成局部的变量。

  1. 请求方式:
  2. request和response

out.print("请求来自哪里:"+req.getHeader("Referer")+"


");

判断来源是否为空,可以防止盗链接

转发:

是将请求在服务器内部交给另一个组件再去执行,同时共享request中的数据

重定向:就是将请求发送回浏览器。然后由浏览器再重新向服务器自动的发送一个请求。,不是同一个请求

请求重定向:指的是一个web资源受到客户端请求后,通知客户端去访问另外一个web资源

  1. 会话跟踪

COOKIE 保存在客户端(浏览器)

Session 保存着服务器

一个COOKIE只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和值(VALUE)。

一个WEB站点可以给一个WEB浏览器发送多个COOKIE,一个WEB浏览器也可以存储多个WEB站点提供的COOKIE。

浏览器一般只允许存放300个COOKIE,其中允许每个站点最多20个COOKIE,每个COOKIE的大小限制为4KB。

COOKIE的销毁:

如果创建了一个COOKIE,并将他发送到浏览器,默认情况下它是一个会话级别的COOKIE; 存储在浏览器的内存中,用户退出浏览器之后被删除。若希望浏览器将该COOKIE存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该COOKIE。如果设置了过期时间,浏览器就会把COOKIE保存到硬盘上,关闭后再次打开浏览器,这些COOKIE依然有效直到超过设定的过期时间。

使用COOKIE可实现自动登录

把登录信息存储到 COOKIE 中,并设置 COOKIE 的最大时效

 

实现提示客户端计算机上次访问网站的时间

实现原理:

将每一个会话作为一次访问过程,将每次会话的开始时间作为每次访问网站的时间,然后将这个时间以COOKIE的形式存储到客户端的计算机中,客户端进行下次访问时通过该COOKIE回传上次访问站点的时间值。

为了让COOKIE信息在客户端浏览器或计算机关闭后仍然保持存在,COOKIE的保存时间被设置为了一年。

 

Session机制

一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用

session在下列情况下被删除:

A.程序调用HttpSession.invalidate()

B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间(tomcat服务器默认30分钟)

C.服务器进程被停止

注意:关闭浏览器只会使存储在客户端浏览器内存中的session COOKIE失效,不会使服务器端的session对象失效。

随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。

WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。

 

利用Session实现一次性验证码

一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码,其原理与利用Session防止表单重复提交的原理基本一样,只是将表单标识号变成了验证码的形式,并且要求用户将提示的验证码手工填写进一个表单字段中,而不是通过表单的隐藏字段自动回传给服务器。

服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。

密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。

 

利用Session防止表单重复提交

包含有FORM表单的页面必须通过一个服务器程序动态产生,服务器程序为每次产生的页面中的FORM表单都分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。

当用户提交FORM表单时,负责接收这一请求的服务器程序比较FORM表单隐藏字段中的标识号与存储在当前用户的Session域中的标识号是否相同,如果相同则处理表单数据,处理完后清除当前用户的Session域中存储的标识号。在下列情况下,服务器程序将忽略提交的表单请求:

当前用户的Session中不存在表单标识号

用户提交的表单数据中没有标识号字段

存储在当前用户的Session域中的表单标识号与表单数据中的标识号不同

浏览器只有重新向WEB服务器请求包含FORM表单的页面时,服务器程序才又产生另外一个随机标识号,并将这个标识号保存在Session域中和作为新返回的FORM表单中的隐藏字段值。

 

 

MVC模式简介

MVC模式(Model-View-Controller)是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑

Model(模型):表示应用程序核心,(比如数据库记录列表)--Bean,封装数据

View(视图):显示数据,如jsp/html页面

Controller(控制器):控制页面流转的, 如servlet负责转发

 

 

过滤器(Filter)

Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能。

若有多个 Filter 程序对某个 Servlet 程序的访问过程进行拦截,当针对该 Servlet 的访问请求到达时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链)。Filter 链中各个 Filter 的拦截顺序与它们在应用程序的web.xml 中映射的顺序一致。

 

应用:

字符编码的过滤器

通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题

 

检测用户是否登陆的过滤器:

情景:系统中的某些页面只有在正常登陆后才可以使用,用户请求这些页面时要检查 session 中有无该用户信息,但在所有必要的页面加上session的判断相当麻烦的事情。

解决方案:编写一个用于检测用户是否登陆的过滤器,如果用户未登录,则重定向到指的登录页面

要求:需检查的在 Session 中保存的关键字; 如果用户未登录,需重定向到指定的页面(URL不包括 ContextPath); 不做检查的URL列表(以分号分开,并且 URL 中不包括 ContextPath) 要采取可配置的方式

 

监听器:

专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。

 

应用:

统计在线人数

统计登录人数

 

 

 

AJAX:

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

优点

AJAX使用Javascript技术向服务器发送异步请求

AJAX无须刷新整个页面

因为服务器响应内容不再是整个页面,而是页面中的局部,所以AJAX性能高

记一下ajax的格式:

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址。

type: 要求为String类型的参数,请求方式(post或get)默认为get。

data: 要求为Object或String类型的参数,发送到服务器的数据。

dataType: 要求为String类型的参数,预期服务器返回的数据类型。

contentType:默认值: “application/x-www-form-urlencoded”。发送信息至服务器时内容编码类型。

重要参数:“application/json“ json格式传输

complete:要求为Function类型的参数,请求完成后调用的回调函数(请求成功或失败时均调用)。

success:要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
         (1)由服务器返回,并根据dataType参数进行处理后的数据。
         (2)描述状态的字符串。

 

 

 

 

 

 

 

 

 

SSM框架

Mybatis:

MyBatis 是一个优秀的持久层框架,它对 jdbc 的操作数据库的过程进行封装,使 开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建 connection、创建 statement、手动设置参数、结果集检索等 jdbc 繁杂的过程代 码;

传统的jdbc编写步骤:

  1. 加载数据库驱动
  2. 创建并获取数据库链接

3、 创建 jdbc statement 对象

4、 设置 sql 语句

5、 设置 sql 语句中的参数(使用 preparedStatement)

6、 通过 statement 执行 sql 并获取结果

7、 对 sql 执行结果进行解析处理

8、 释放资源(resultSet、preparedstatement、connection)

配置mybatis:

SqlMapConfig.xml,

此文件作为 mybatis 的全局配置文件,配置了 mybatis 的运行环境等信息。

  1. 配置数据源,连接数据库的信息

2、.通过 mybatis 环境等配置信息构造 SqlSessionFactory 即会话工厂

由会话工厂创建 sqlSession 即会话,操作数据库需要通过 sqlSession 进行。

mapper.xml 文件

即 sql 映射文件,文件中配置了操作数据库的 sql 语句。此文 件需要在 SqlMapConfig.xml 中加载。

与操作数据库的接口类放在同一个包下

Id:与接口方法名一致

parameterType:指定输入参数类型,mybatis 通过 ognl 从输入对象中获取参 数值拼接在 sql 中。

resultType:指定输出结果类型,mybatis 将 sql 查询结果的一行记录数据映射 为 resultType 指定类型的对象。

 

#{}表示一个占位符号,通过#{}可以实现 preparedStatement 向占位符中设 置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。 #{}可以 接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。

 

${}表示拼接 sql 串,通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。

 

 

 Mybatis 解决 jdbc 编程的问题

1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据 库链接池可解决此问题。

解决:在 SqlMapConfig.xml 中配置数据链接池,使用连接池管理数据库链接。

2、 Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动 需要改变 java 代码。

解决:将 Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。

3、 向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少, 占位符需要和参数一一对应。

解决:Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的类型。

4、 对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将 数据库记录封装成 pojo 对象解析比较方便。

解决:Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型。

 

 

 

 

Spring框架

Spring 是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架。

轻量—从大小与开销两方面而言 Spring 都是轻量的。完整的 Spring 框架可以在

一个大小只有 1MB 多的 JAR 文件里发布。并且 Spring 所需的处理开销也是微不

足道的。

为什么使用 spring?

至少在我看来,在项目中引入 spring 立即可以带来下面的好处

1、降低组件之间的耦合度,实现软件各层之间的解耦。

2、可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事

务传播。

、3容器提供单例模式支持,开发人员不再需要自己编写实现代码。

容器提供了 AOP 技术,利用它很容易实现如权限拦截、运行期监控等功

能。

4、容器提供的众多辅作类,使用这些类能够加快应用的开发,如:

JdbcTemplate、 HibernateTemplate。

、5Spring 对于主流的应用框架提供了集成支持,如:集成 Hibernate、JPA、

Struts 等,这样更便于应用的开发。

 

Spring IOC

控制反转(Inversion of Control,英文缩写为 IoC)把创建对象的权利交给框架,是

框架的重要特征,并非面向对象编程的专用术语。它包括依赖注入(Dependency Injection,简称 DI)和依赖查找(Dependency Lookup)。

IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

Spring 的注入--就是在实例化这个类时,由外部容器来设置这个对象的值

Spring的ioc操作:1.ioc的配置的方式 2.ioc的注解方式

ioc底层原理使用技术:1.xml配置文件 2.dom4j解析xml3.工厂设计模式4.反射

 

Bean 的装配方式

 

1、基于 XML 的装配

两种装配方式:设值注入和构造器注入。以上案例都是这种方式的,略设值注入的两个要求:

Bean 类必须提供一个默认的无参构造方法

Bean 类必须为需要注入的属性提供对应的 setter 方法。

见项目案例 面向结构编程 controller—service—dao

2、基于注解(annotation)

常用注解:

@Component 是所有受 Spring 管理组件的通用形式,@Component 注解可以放在类的头上,@Component 不推荐使用。

@Controller 控制器,表示 web 层组件

@Service 业务类,表示业务层组件

@Repository 表示持久层的组件

 

属性注解

@Autowired 默认按类型装配

@Qualifier 与@Autowired 配合使用,存在多个实例配合使用,按照名字匹配

@Resource 默认按名称装配,当找不到与名称匹配的 bean 才会按类型装配

 

Spring aop

 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现

  1. AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
  2. aop底层使用动态代理实现
  1. 第一种情况,有接口情况,使用动态代理创建接口实现类代理对象
  2. 第二种情况,没有接口情况,使用动态代理创建类的子类代理对象

可以做日志记录,权限验证,事务控制,性能检测,错误信息检测等等

AOP 采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或者运行时,再将这些提取出来的代码应用到需要执行的地方。

AOP 的本质是拦截方法的,对方法进行增强。如何增强? 通过代理----所以 AOP 的本质就是代理。

AOP 的基本概念:

  1. Aspect(切面):通常是一个类,里面可以定义切入点和通知

切面:把增强应用到具体的方法上面的过程叫做切面

(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用(在一个类里面那些方法可以做扩展功能(被增强),这些方法都叫做连接点)

(3)Advice(通知):AOP 在特定的切入点上执行的增强处理,有 before,after,afterReturning,afterThrowing,around

通知/增强:增强的逻辑或功能

前置通知:在方法之前执行

后置通知:后

异常通知:方法出现异常执行

最终通知:在后置之后执行

环绕通知:在方法之前和方法之后执行

(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式(在类中有很多方法可以被增强,实际增强的方法就叫做切入点)

(5)AOP 代理:AOP 框架创建的对象,代理就是目标对象的加强。Spring 中的 AOP 代理可以使 JDK 动态代理,也可以是 CGLIB 代理,前者基于接口,后者基于子类

配置

1.事务是什么?

事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败.

事务四个特性:ACID

  • 原子性Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
  • 隔离性Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
  • 持久性Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

如果不考虑隔离级别引发的安全性问题

  • 脏读:一个事务读到了另一个事务的未提交的数据,如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。
  • 不可重复读:一个事务读到了另一个事务已经提交的update的数据导致多次查询结果不一致.这通常是因为另一个并发事务在两次查询期间进行了更新。
  • 幻读:一个事务读到了另一个事务已经提交的insert的数据导致多次查询结果不一致.

 

Spring mvc

Spring MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级

Web 框架,即使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC 也是要简化我们日常 Web 开发的。

第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求 HandlerMapping 查找 Handler

可以根据 xml 配置、注解进行查找

第三步:处理器映射器 HandlerMapping 向前端控制器返回 Handler 第四步:前端控制器调用处理器适配器去执行 Handler 第五步:处理器适配器去执行 Handler

第六步:Handler 执行完成给适配器返回 ModelAndView 第七步:处理器适配器向前端控制器返回 ModelAndView

ModelAndView 是 springmvc 框架的一个底层对象,包括 Model 和 view

第八步:前端控制器请求视图解析器去进行视图解析根据逻辑视图名解析成真正的视图(jsp) 第九步:视图解析器向前端控制器返回 View

第十步:前端控制器进行视图渲染

视图渲染将模型数据(在 ModelAndView 对象中)填充到 request 域

第十一步:前端控制器向用户响应结果

 

组件:

  1. 前端控制器(不需要开发,需要配置)

作用:接收用户请求,响应结果,类似于CPU

使用前端控制器减少其他组件的耦合度

  1. 处理器映射器(不需要开发,需要配置)

根据请求的URL找到相应的handler

  1. 处理器适配器(不需要开发,需要配置)

按照规则去调用执行处理器

  1. 处理器(需要开发)

处理返回ModelAndView

  1. 视图解析器(不需要开发,需要配置)

进行视图解析,解析成真正的视图

  1. 视图(需要开发,jsp)

View是一个接口支持不同的view类型(jsp、pdf..)

注解

@RequestMapping:映射路径,通过路径访问类或方法

当前端请求中参数名后后天控制器类中的形参名不一样时,无法进行数据绑定。

Spring MVC 提供了@RequestParam来进行间接数据绑定。

JSON概述

JSON(Javascript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。

它基于ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

简洁和清晰的层次结构使得JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

  1. @RequestBody:用,通过 springmvc 提供的

HttpMessageConverter 接口将读到的内容转换为 json、xml 等格式的数据并绑定到 controller 方法的参数上。

  1. @ResponseBody:该注解用于将 Controller 的方法返回的对象,通过

HttpMessageConverter 接口转换为指定格式的数据如:json,xml 等,通过 Response

响应给客户端

JSON格式转换:https://blog.csdn.net/qq_37855506/article/details/79423161

 

传输协议:

Tcp 和udp的区别

 

TCP是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接 三次握手

UDP:是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!

区别:

交换机与路由器

交换机(Switch)是一种基于MAC(网卡的硬件地址)识别,能完成封装转发数据包功能的网络设备

路由器是一种连接多个网络或网段的网络设备,它能将不同网络或网段之间的数据信息进行“翻译”,以使它们能够相互“读”懂对方的数据,从而构成一个更大的网络。

交换机的功能:将一些机器连接起来组成一个局域网

路由器功能:在于连接不同的网段并且找到网络中数据传输最合适的路径

 

 

MVC设计模式

模型 视图 控制器

Servlet属于哪一层  控制层

栈、堆和队列 区别

队列是先进先出,有出口和入口,先进去可以先出来

堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。

堆总是一棵完全二叉树

视图 索引 游标

视图:从一个或几个表导出来的表,不是真实存在的基本表而是一张虚表,也可以说是一个头查询结果

索引:对数据库表中一个或多个列的值进行排序的结构

游标:允许应用程序对查询语句SELECT返回的结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作

 

Servlet和filter的区别

Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,

也可以对HttpServletResponse进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。

完整的流程是:Filter对用户请求进行预处理,接着将请求交给 Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理

Filter必须实现javax.Servlet.Filter接口,并且必须定义以下三个方法:init(),destory(),doFilter().

Servlet一般继承HttpServlet,当Url匹配这个Servlet时候运行处理请求;

1,servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在 业务处理之前进行控制.

2,filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。

COOKIE和session的区别

COOKIE数据存放在客户的浏览器上,session数据放在服务器上。

Session能存储任意的java对象,COOKIE只能存储String类型的对象

COOKIE不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗

   考虑到安全应当使用session。

session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能

   考虑到减轻服务器性能方面,应当使用COOKIE。

 

SQL Select语句完整的执行顺序: 

1、from子句组装来自不同数据源的数据; 

2、where子句基于指定的条件对记录行进行筛选; 

3、group by子句将数据划分为多个分组; 

4、使用聚集函数进行计算; 

5、使用having子句筛选分组; 

6、计算所有的表达式; 

7、select 的字段;

8、使用order by对结果集进行排序。

MySQL的sql语句语法大全:http://www.cnblogs.com/yunf/archive/2011/04/12/2013448.html


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
author-avatar
孜雪颖2000
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有