Java学习---基础知识学习
2016-07-23 周六
利用键盘输入的时候需要抛出异常 ,直接快捷键 ctrl + 1 ;
定义数组 int score[] = new int[4] ; 只有4个数字
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
String str = br.readLine() ;//直接输入,直接输出
score[i] = Integer.parseInt( str) ; //转换Str 为 Int
int temp = Integer.parseInt(str); //字符串变为int型
String str = new String(b); byte变字符串
Scanner scan = new Scanner(System.in) ;
冒泡排序: i=1;j=0 ;
for (int i = 1 ; i < 3 ;i++ ){
for(int j = 0 ; j< 3 ; j++){
if(score[i] < score[j]){
int temp = score[i] ;
score[i] = score[j] ;
score[j] = temp ;
}
方法的定义: public static 返回值 方法名(类型 参数 , 类型 参数,){
程序体 ;
(return) //可省略
}
类名定义: ArrayDemo (单词首字母大写)
方法定义: printInfo (第一个单词小写,后面的单词首字母大写 )定义的时候 char c[] = {'','','',''} ; 字符串都是单引号,字符都是双引号
float型的参数都是 3.2f,
使用 break 可以结束一层循环
使用 return 可以结束一个方法
方法的递归 ; return x + sum(temp) ;
栈中存放的是堆空间的地址; 中放的是名字,堆内存是实际数字
2016-07-24 周日
Java 的直接数组排序 java.util.ARRAY.sort() ;
Java 的直接复制数组 System.arraycopy(源数组,源数组开始位置,目标数组,目标数组开始位置,数组长度 ) ;
(说是复制,其实就是目标位置的数组的替换,将源数组的数字复制到目标数组的位置,目标数组的长度不变)
Java 新特性:foreach(数据类型 变量名: 数组名称) ; foreach (int x ; temp) ;
Java 新特性:可变参数:返回类型 方法名(类型... 参数) public void fun (int... arg)
例: fun(new int[]{1,1,1,1,1}); // 传递参数可以直接传递
Java的多态性:方法的重载 ; 方法名同但是参数类型和参数的个数不同 ; System.out.println 也属于重载
对象的多肽 : 子类对象可以和父类对象进行相互转换,而且根据子类的不同,完成的功能也不同
Java的封装性:对象的属性和行为看成整体,即对象;
信息的隐蔽
private 声明的属性或者方法只能被类的内部进行访问,而不能在外部被访问;
this的使用:
this.表示当前对象,this必须发放到构造方法的首行
this调用构造方法时一定要保留一个构造方法作为出口,也就是有一个构造方法不调用this();
this.方法名() 强调是本类中的方法;
this.属性 强调是本类中的属性;
Java的继承性:拥有一般特性的事物,在基础上 派生其他;
类 : 成员变量声明 + 方法定义:
构造方法: 在实例化的时候就可以进行赋值,而不是调用setter 和 getter 方法 //也即是说,只是一个赋值的过程,没有返回值
方法名与主类同; 不能有返回值类型声明; 不能有return语句;默认 default 类型
匿名对象:没有明确给出名称的对象;一般只使用一次,而且直接开启堆空间,不存在栈空间的索引;
new Person("zhangsan",12).tell() ;
String 本身就是一个类,但是我们一般用的String没有开辟栈空间,比较的只是堆空间的值;
一个字符串本身就是一个String的匿名对象;
“==” 比较的是开辟的空间,而不是内容;
equal() 比较内容是否一致;
String 里面indexOf本身就可以比较内容 是否相等, 他是找到内容,然后返回字符所在位置, !(indexOf("hello"))!= -1 表示找到
一个String对象内容的改变实际上是通过内存地址的更新完成的,本身的字符串内容不会变;
char[] toCharArray() ;//转换为字符数组 charAt() //特定的位置取值 String split()//按照指定的字符串分割
String subString()指定字段取值 equals(), equalsIgnoreCase()
split 和 raplaxeAll() 支持正则表达式;,返回时一个 String s[] =
indexOf : 从指定位置开始查找字符串位置,没有找到就返回 -1 ;
charAt : 取出指定位置的字符 trim() :去掉左右的空额
length 和 length() 在数组中,length是长度,String操作中是函数,需要length() ;
引用传递: 就是将一个堆内存空间的使用权交给多个栈内存空间
接受本类的对象: public void fun(Demo d2)
2016-07-28 周四
Java的内存区域:
栈内存:保存所有对象的名称(堆地址的内存空间)
堆内存:保存每个对象的属性内容
全局变量: static类型属性
全局代码段:保存所有的方法定义
Static关键字:堆内存保存对象,可以用static共享属性
static声明属性的又称为类属性,因为类的公共属性应该由类来修改,毕竟用户不知道到底会有多少对象产生;
static String count = "ad"; Person.count = "bc";
static声明的方法又称为类方法,可以用类名调用;
public static setName(String name) ; Person.setName("lvfengtao") ;
static应用,可以查看定义了多少给 实例化对象;
System.exit(1) ; //可以直接退出程序,设置非0数字
代码块:
普通代码块:{}括起来的,直接在方法或者语句中设置的
构造代码块:直接写在类中的代码块 //只有一行代码
静态代码块:用static声明的代码块
静态代码块优于主方法执行,类中的静态代码块优先于构造块执行,且只执行一次,不管产生几个对象
构造方法私有化: private 方法名()
构造方法一旦私有化,就不能new调用,就必须从内部调用
一种是static 属性,另一种是static 方法,返回实例,通过类.方法名调用;
单例设计模式: 无论程序怎么运行,始终只有一个实例化对象存在,只要将构造方法私有,就可以对控制实例化对象的产生;
数组一定要先开辟空间,因为是引用类型
主方法的String args[] 本身就是一个类,主方法中的参数本身就是以对象数组的形式出现的;
内部类: 在类的内部在定义一个类
缺点:类由属性和方法构成,所以会破坏类结构
唯一的好处就是可以访问外部类的私有属性;
用static声明的内部类变成了外部类,但是不能访问非static声明的外部类属性
在外部访问内部类
外部类.内部类 内部类对象 = 外部类实例.new 内部类() ;
private 定义是在一个类里面都可以访问,所以内部类可以直接访问外部类的属性;
使用statIC声明的内部类就会成外部类,使用static声明的内部类不能访问非static声明的外部类
在方法中定义一个内部类
在方法中定义的内部类不能直接访问方法中的参数,如果发放中的参数想要被内部类访问,就必须在参数前加final关键字
2016-07-30 周六
使用构造方法的时候,一定是this.setName(name); 继承的时候是,super(age,name); Getter方法中:return school;
关于输出,最好是在类中返回String方法,然后在主类中 System.out.println(实例化对象.方法名) ;6.1 继承类(派生类)
Java只允许单继承,一个子类只允许有一个父类,允许多层继承,一个父类还有一个父类;
子类是不能调用父类的私有成员,子类可以调用父类的非私有 方法,但是不能直接调用父类的私有成员,但是可以通过setter和getter;
子类实例化对象之前,先调用父类的构造方法,后调用子类的构造方法,实际上子类的构造方法中隐藏了super()方法【超类】
子类不能拥有比父类更高级的访问权限
6.2 this 和 super 区别:
1.this 只能调用本类的属性、方法,本类中没有则父类查找 super 访问父类的方法,方法
2.this 调用本类构造, supe 调用父类构造,且放在子类首行
3.this 表示当前对象
6.4 final :完结器 ,final声明的类不能有子类,声明的方法不能被覆写,声明的变量为常量,不可以修改
final声明的变量必须全部大写; public static ,final String NAME = "Lvfengtao";
6.5 Abstract 抽象类: 抽象类是一种模板,必须被继承才能用,一个子类只能继承一个抽象类
包含一个抽象方法的类是抽象类; 抽象类和抽象方法必须由abstract声明; 抽象方法只需声明,不需要具体;
抽象类必须被继承,子类必须前部复写抽象类中的全部抽象方法 public abstract void print();
抽象方法不要使用private声明,因为必须被覆写,子类不易复写;
抽象类可以定义构造函数,所以子类实例化之前必须对父类进行实例化,也就是说先必须给打印父类的构造方法然后子类的构造方法
子类可以通过super()方法调用抽象类(父类)的构造方法,也可以在子类调用父类指定参数的构造方法
子类 extends 抽象类 implements 接口A, 接口B
6.6 接口: 特殊的类,由全局常量和公共的抽象方法组成 // 接口本身已经定义,所以不需要在写 public static fianl 和 abstract ;
由于明确规定了抽象方法是public 类,所以也不需要在写;
接口与抽象方法一样需要子类的继承 implements,一个子类可以实现多个接口,摆脱继承的单继承
全局常量,在接口里定义的时候用大写
Java允许一个抽象类实现多个接口,但是一个接口不允许继承抽象类, 允许一个接口继承多个接口
接口的继承: interface A extends B, C
interface A {
public static final String INFO =, "Lvfengtao" ==== String INFO = "Lvfengtao"
public abstract void print() ========== (public)void print()
//全局常量;
抽象方法; //必须是public方法,写与不写,Java的接口方法都是pblci
}
6.7 对象的多态性
表现: 1、方法的重载和覆写
2、对象的多态性
(向上转型:子类--> 父类 ; 父类 父类对象 = 子类实类
向下转型:父类 --> 子类,且必须说明向下转型的子类类型) 子类 子类对象 = (子类)父类实例
** 对象是Object类型,需要转型 String str = (String)obj[i];
2016-08-02 星期二
6.12 包装类; Java数据分为基本数据类型和引用数据类型,
用的最多的还是讲字符串变为数据类型(int i= Interger.parseInt("1234"));
(字符串变为数组的时候需要抛出异常)
拆箱 和装箱: Interger i = new Interger(x); int x = i.intValue();
Integer i = 0 ;//自动封装 int x = i; //自动拆箱
7.1 异常的基本概念
Java的异常都是以类和对象的形式存在,Java的错误主要是语法和语义的错误,编译的时候没有报错,但是运行的时候也可能报错
Try() 找到错误后会跳转到 catch里面,一旦产生异常,则首先回产生一个异常类 的实例化对象,
Exception 和 Error 都是Java Throwable的异常类
通常用e.printStaceTrace()方法打印异常信息,所有的额子类的实例都可以用父类来接受,所以可以调转
7.2 throws 和 throw关键字
throws声明的方法,表示此方法不处理异常,而是调用方法去处理;
2016-08-03 星期三
9.1 多线程: 继承 Thread类【要覆写run()】或者实现Runnable类 // 都需要覆写run()方法
由于受到单继承的影响,所以一般多线
中程是通过
同时可以调用父类start()方法,实现多线程,说是调用start()方法,但是调用的却是run()方法的主题
一般重复调用start()方法回抛出异常,而且本质上调用 start0()这个方法,因为使用了native声明,所以需要依靠底层的操作系统支持
实现Runnable()方法,需要实现多线程,可以利用Thread类中设定的方法启动多线程
Thread类也是Runnable接口的子类,但是Thread并没有完全的实现Runnable接口的run() Thread 构造方法 Thread thread = new Thread(接受 Runnable的子类,设置线程名称 )
继承Thread类并不能实现资源共享,如果想要资源共享必须实现Runnable接口
避免单继承带来的局限性; 代码能与多个线程共享,代码与数据是分开的;
9.2 线程的状态: 创建 、就绪、 运行、 阻塞、 终止
getName: 取得线程名称; setName: 设置线程名称
main()本身也就是一个线程,每次Java运行都至少启动2个线程,一个main,一个垃圾回收
main()方法可能比其他方法更早执行;
public static Thread currentThread(): 返回当前执行的类
public final String getName(): 返回线程名称
public final int getPriority(): 返回优先级 1 5 10
public boolean isInterrupted(): 线程是否中断;
9.3 Thread类中有一个方法: 利用 构造函数可以直接命名线程 子类实例化以后就可以直接start
Runnable,需要 子类实例化对象,然后调用Thread调用start方法
9.6 解决资源同步问题:1、使用同步代码(Synchronized(同步对象 this)
2、同步方法
多线程 共享同一资源的时候需要同步,但是过多会产生死锁;
方法的完整定义:
public/default/private/protected final static syncronized 返回类型 方法名(参数类型 参数名称) throws EXCEPTION{ return [返回值/返回调用处]}
死锁: 同步可以保证资源共享的正确性,所谓死锁就是2个线程都在 等待彼此完成任务,造成程序停滞
2016-08-06 星期六
new String(bInput); //byte数组变为字符串 byte[] b = str.getBytes();
int i = Integer.parseInt(str); //字符串变整数 {\\d4}必须 数字出现4次
(^\\d+.?) 正则表达式匹配小数 ,? 表示小时代可以出现一次或0次
[a-zA-Z0-9]字母数字 \w 字母、数字、下划线 ^\\d{4}-\\d{2}-\\d{2}$:年与日
[abc]: 字符abc [^abc]: 除了abc之外的任意字符 \d :数字 \D: 非数字 \w:字母、数字、下划线 \s:所有空白字符
X?:出现0次到1次 X*:出现0次,1次,多次 X+:出现1次或多次
X|Y: 先X或Y XY:先X后Y
正则表达式需要Patter和Matcher两种类完成, Patter类主要进行正则规范Matcher主要执行验证
Patter.complie("[0-9]+").matcher(str).matches();
Patter p = Patter.compile("[0-9]+");
Matcher m = p.matcher(str);
m.matches();
12.16 序列化
实现Serializable接口,还需要依靠对象输出对象和对象输入流
对象输出流(ObjectOutputStream): 实现序列化
构造方法(传入输出对象):ObjectOutputStream(OutputStream out)
普通方法(输出对象): writeObject(Object obj)
File file = new File("E:" + File.separator + "test.txt");
ObjectOutputStream oos = null;
OutputStream os = new FileOutputStream(file);
oos = new ObjectOutputStream(os);
oos.writeObject(new People("People",21));
oos.close();
实现Externalable接口,还需要依靠对象输出对象和对象输入流
public void readExternal(ObjectInput input) // 读取需要的 内容
{
this.name = (String)input.readObject(); //需要转换
}
public void writeExternal(ObjectOutput output) // 写入需要的 内容
{
output.writeObject(this.name);
}
transient: 声明 的关键字不可以被序列化13.1 认识类集
:动态完成对象数组操作,是动态的对象数组,是对一些实现好 的数据结构的包装,不受对象数组长度限制;
特点:对基本类集(动态数组、连接表、树)实现是高效的
框架允许不同类型的类集以相同的方式和高度
Collection: 接口,存放一组单值(集合中的每个元素都是一个对象)的最大接口,
List: Collection 子类接口,堆Collection扩充,允许内容重复
Set: Collection 子类接口,没有对Collection扩充,允许内容不重复
依靠hashCode()和equals()两个方法区别
Map; 存放一对值得最大接口,Key -- > Value
Iterator:集合的输出接口,用于输出集合中的内容,胆小
ListIterator: 可以双向输出
Enumeration: 输出指定集合的内容
SortedSet: 单值的排序接口,可以使用比较器排序
SortedMap:存放一对值得排序接口,按照key值比较
Queue: 队列接口,可以实现队列操作
Map.Entry: Map.Entry的内部接口,每个Map.Entry对象都保存这一对 key --> Value的内容,每个Map接口都保存很多Map.Entry接口实例
List<String> list = new ArrayList<String>() ;
System.out.print(list);
2016-08-07 星期日
13.1 String str[] = list.toArray(new String[]{}); //后面的{}实为初始化
indexOf() 找不到返回-1 找到显示位置
ArrayList 和 Vector区别:
ArrayList是异步处理方式,性能高,非线程安全操作类,使用Iterators
LinkedList子类和Queue接口
LinkedList表示一个链表的操作类, ListedList<> l = new ListedList<>();
poll()方法找到首字母并回删除首节点, peak() 找到首字母
Queue表示的是队列操作接口,采用FIFO方式操作,for(int i; i< list.size()+1
set:
散列存放:HashSet:
set<String/也可以是个类名> s = new HashSet<String/也可以是类名>();
System.out.println(set); //自主调用toString()方法
有序存放:TresSet 类中的每一个对象所在的类都必须实现Comparable接口才可以使用;
TreeSet自定义排序是一定要继承Comparable类,复写Comparto()方法,
public int compareTo(Person per)
但是比较器比较的时候,如果某个属性没有进行比较的指定,也会认为是同一个对象,所以应该增加按照姓名比较;
return this.name.compareTo(per.name);
去除重复元素: 主类不需要继承TreeSet,但是需要复写equals方法,编写hashCode方法
13.6 集合的输出
如果要输出Collection、Set集合中的内容,可以将其转换为对象数组输出,而List则可以直接使用get()方法输出;
常用的类集合为:
Iterator: 迭代输出(判断元素是否有内容,有就输出)
ListItarator: Iterator的子接口,专门用于输出List
Enumeration: 旧接口
2016-08-08 星期一
13.6.1
Iteration: Iterator是一个接口,直接使用Colletion定义的 itreator()实例化;同理List和Set也实现了此方法
hasNext(): 返回boolean,判断元素是否有内容,
next():输出,取出内容
ListIterator: 只能通过List实现实例化,只能输List内容
hasPrevious(): 判断是否有上一个元素
pervious(): 取出当前元素
nextIndex(): 返回下一个元素的索引
previousIndex(): 返回上一个元素的索引
set(): 替换元素
实现ListIterator接口双向输出时,如果想完成右后向前输出,则一定要先右前向后输出;
forEach: for (String str: list)//(类 对象:集合){}
13.7 Map接口
Map<K,V>:
clear(): 清空cler()
containKey(): 判断指定key是否存在
set<May.Entry><K,V> entrySet(): 将Map对象变为Set集合
Map.Entry是Map内部定义的一个接口,专门保存key->va
可以由外部通过“外部类.内部类”直接调用
Map内容是K-V形式保存,实际上K-V是把数据保存在M.E之后
Map输出数据的时候必须使用M.Entry接口
V get(OBJECT key): 根据key 取得Value
set<K> keySet(): 取得所有key
Set<String> set = map.keySet();
Collection<V> value(): 取出全部value
V put(K kye, V value): 向集合中加入元素
putAll<Map<? extends K, ? extends V>t> 一个Map集合加入到另一个
13.7.1 Map接口常用的类
HashMap: 无序存放,新的操作类,key不能重复
HashTable: 无序存放,旧类操作,key不能重复
TreeMap:有序Map集合,按key排序,不允许重复
WeakHashMap: 不再用的内容青岛湖
IdenHashM: key可以重复
Map接口的使用注意事项:
1.不能直接使用迭代输出Map内容,因为Map 存放一对值,Iterator只能输出一个
2.Map很少作为直接输出的额,只是用作查询
3.直接使用非系统类作为key
2016-08-28 星期日
//利用indexOf判断某个字符是否存在 也可以用
//replaceAll (源数字 , 目标数字) 直接替换
//System.out.println(str.charAt(8)); 取出第8个字符
继承父类以后调用父类的构造方法:super(name, address, sex, age);
输出父类的属性: super.toString()
代理模式: 代理和真实主题均要实现接口,在代理中实现真实主题实例化(构造方法中实现)
工厂模式: 其他了均实现接口,定义一个类专门获取实例,不是构造方法获得
适配器模式:接口定义方法, 构造方法实现此接口,方法体为空,后子类继承抽象类,有选择的复写方法
观察者模式: 要被关注的继承Obserable类,调用父类方法 super.setChanged(); super.nosuper.notifyObservers() 观察着实现 Observer接口,在update类中,判断是否是一个类,输出即可
//这些接口呢都需要用到多态性,都是 接口 接口对象 = new 子类对象(),实现向上转型,转型后可以调用子类复写父类的方法
如果需要向下转型,则调用子类自己的方法,但是需要先向上转型后, instanceof 比较对象;//如果要进行字符串的拆分,利用split方法
Pattern p = Pattern.compile("[a-zA-Z]");
String s[] = p.split(str);
//如果需要正则表达式来进行字符的替换,
String str = "123231m3m123m123m123m12";
Pattern p = Pattern.compile("[a-zA-Z]");
Matcher m = p.matcher(str);
String ss = m.replaceAll("_");
、、以上方法String都有支持的 boolean matches(String regex); String[] split(); String replaceAll(String regex, s)
2016-08-30 星期三
时间类: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
sdf.format(new Date()) ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date temp = sdf.parse(str);
字符串拆分:
String str = "<html xmlns=\"http://www.w3.org/1999/xhtml\">";
str = str.substring(str.indexOf(" ")+1, str.indexOf(">")).replaceAll("\"", " ").replaceAll("\\.", " ").replaceAll("/", " ");
字符串内输入双引号: \"
定时调度:
Timer类: 是一种线程设施,可以定时安排一个时间,与TimerTask(实现由TImer安排的一次或重复执行的某一个任务)配合使用
IO操作:
File打开文件--> 字节流制定位置-->读写--> 关闭流
FIle类:文件本身操作
boolean createNewFile();
boolean exists();
boolean isDirectory();
String[] list();
File[] listFiles();
boolean mkdir();
boolean renameTo(File dest); //已有文件重新命名
RandomAccessFile类:随机读取类(一般不用)
RandomAccessFile(File file, String mode) //file路径
RandomAccessFile(String path, String mode)//固定路径
close(): 关闭操作
void writeBytes(String s): 字符串写入文件
void writeInt(jint v)
int read(byte[] b): 将内容读取到一个byte数组
byte readByte(): 读取一个字节
int readInt(): 读取整数型
int skipBytes(int n):指针跳过多少字节
void seek(long pos): 指针位置
所有数据都是已流的方式传输或保存,分字节和字符
字节流:以byte为准,需要将字符串转为Byte数组
OutputStream
OutputStream out = new FileOutputStream(file);
OutputStream out = new FileOutputStream(file, true);追加内容
String str = "\r\nHEllo world"; 文件需换行,可以加\r\n
byte[] b = str.getBytes();
out.write(b);
out.close();
InputStream:
int avaliable(); //取得文件大小
int read();//以数字的方式读取
int read(byte[] b) ;内容读取到byte数组
InputStream input = new FileInputStream(file);
byte[] bb = new byte [(int)f.length()]
//byte[] bb = new byte[1212];
//int len = input.read(b); //取出内容到byte数组,确定输出多少
while(input.read()!=-1)
{
b[len] = (byte) temp;
len++;
}
input.close();
System.out.println(new String(b, 0, len));
一个字符2个字节;
字符流: Writer 子类: FileWriter
可以添加对象, Writer writer = new FileWriter(new File(), true);
write(String str) 字符串输出
write(char[] c) 字符数组输出
flush() 强制清空缓存
Reader 子类 FileReader
int read()
int read(char[] c): 内容读取到字符数组,返回长度
字符的输出: new String(c, 0 ,len)
读取字符串有2中方法: 直接从文件读取
for循环 读取一个字节 int len = 0;
int temp = 0; //接收每一个内容
while((temp = reader.read())!=-1)
{
c[len] = (char)temp;
len++;
}
字符流使用了缓冲区,字节流没有使用缓冲区(内存区域);
不关闭时也将字符内容输出,可以使用Writer类的flush()方法打印流: PrintStream() 和 字符打印流()
2016-09-03 星期六
1.Serializable(Serializable)
一个类的对象要想被序列化(一个对象变为2进制,方便存储和传输),就必须实现Serialiable接口,依靠ObjectOutputStream()和ObjectInputStream()
Java序列化的时候会产生一个序列化ID,通过JVM实现
File file = new File("F:" + File.separator + "hello.txt");
OutputStream out = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(new Person("lisi"));
ObjectInputStream ois = new ObjectInputStream()
oos.close();
InputStream input = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(input);
Object obj = ois.readObject();
ois.close();
2. Externalizable是Serializable子类,实现此接口的可以用户自己制定被序列化的内容
writeExternal(ObjectOutput ot): 指定要保存的属性信息,对象序列化时调用
readExternal(ObjectInput in): 读取被保存的信息,反序列化用
以上2个方法都是DataOutput 和 DataInput接口的子类
public Person(){};
public Person(String name)
{ this.name = name; }
//读取属性,有一个强制转换的要求
public void readExternal(ObjectInput input)
{ this.name = (String) input.readObject();}
//保存name属性
public void writeExternal(ObjectOutput output)
{ output.writeObject(this.name); }
一个类要使用Externalizable实现序列化,此类必须有一个无参构造方法,因为在反序列化的时候会默认调用无参构造实例对象
3. transient:关键字表示对象的某一个属性不希望被序列化
4. 序列化一组对象:
对象输出时只提供了writeObject(Object obj)),并没有多对象输出,所以要实现同时序列化多个对象,就可以使用对象数组操作。
因为数组属于引用类型,可以用Object类型接收
5. List Set(重复内容依靠hashCode() 和 equals()方法区别) Queue SortSet(对集合中的数据进行排序)
List:接口
add(int index, E element)
addAll(int index, Collection<? extends E> c) 添加一组元素
E get(int index)
ListIterator<E> listIterator()
E remove(int index)
E removeAll(Collection<?> arg0)
List<E> subList(int fronIndex, int toIndex)
E set(int index, E element)
toArray(): 集合变为对象
size(): 返回集合的长度
get(int index): 返回当前的位置的数字
for(int i = 0; i < allList.size(); i++)
{
System.out.print(allList.get[i] + "、");
}
LinkedLis:链表操作类
addFirst(E e );
addList(E e);
boolean offer();
E removeFirst()
Queue:先进先出
E element(): 找到表头
E peek() 找到不删除;
E pool() 找到后删除; 利用此方法先进先出输出数字
E remove() 检索并移除表头
Set:HashSet && TreeSet
HashSet:
无规律可循
TreeSet:
有规律
如果是比较对象,则需要继承Comparable接口,实现CompareTo()方法
class Person implements Comparable<Person>//接口处定义泛型类型
public int compareTo(Person per) {
if ( this.age > per.age)
{
return 1;
}
else if (this.age < per.age)
{
return -1;
}
else
{
return 0;
}
比较器操作时如果某个实现没有进行比较,则默认为是一个对象
如果实现了HashSet,则所有的重复对象也会继续出现,就需要复写Object类的equals()方法和hashCode()方法,一个对象编码表示一个对象
SortedSet: TreeSet继承SortedSet
SortedSet<String> set = new TreeSet<String>();
first(); last();
SortedSet<E> headSet(E element):开始到指定位置
SortedSet<E> tailSet(E element):指定到最后
//可以用get()方法输出数字
Iterator:
Iterator iter = list.iterator();
ListIterator:
由前向后: hasNext() && next()
有后向前: 利用hasPrevious()方法由前向后判断,用previous取出元素
set() 和 add() 可以更改和添加元素
foreach输出:
for (类 对象: 集合) {}; for(String str: all)
Map:HashMap && TreeMap
put(Object key, Object obj): 添加数据
get(): 根据key值取得value的值
Map<String, String> map = new HashMap<String, String>();
Set<String> keys = map.keySet();
Iteration key = keys.iterator();
while(key.hasNext())
{
String str = key.next();
System.out.println(map.get(str));//根据key 取值
}
map.get(iter.next())
containKey(): 判断指定的key是否存在
keySet(): 将一个Map中的key变为Set集合,然后利用Iterator输出
values(): 返回Collection,注意定义泛型类型
Collection<String> col = map.values();
Iteration valus = col.iterator;
while(values.hasNext()){};
Map接口注意事项:
1. 不能直接使用迭代输出Map中的全部内容,因为Map存放的是一对值,Iterate只能每次找到一个值,如果非要迭代输出,则必须:
1> Map实例通过entrySet()方法变为Set接口对象
2> 通过Set接口实例化Iterator、
3> Iterator迭代输出,每一个ie内容都是Map.Entry的对象
4> 通过Map.Entry进行 key --> value分离
(Map中的每对数据都是通过Map.Entry保存的,所以也是Map.Entry输出)
Map<String ,String> map = null;
map = new HashMap<String, String>();
map.put("04122077", "吕峰涛");
map.put("04122076", "吕峰");
` Set<Map.Entry<String, String>> set = map.entrySet();
Iterator<Map.Entry<String, String>> iter = set.iterator();
while(iter.hasNext())
{
Map.Entry<String, String> me = iter.next();
System.out.print( me.getKey() + "--> " + me.getValue() + "\t");
}
SortedMap: 排序接口,实现此类都是排序的子类,例如TreeMap
Comparator<? super K> comparator();
K firstKey(); K lastKey();
SortedMap<k, V> subMap(K fromKey, K endKey)
SortedMap<K, V> tailMap<K fromKey): 返回大于指定key的部分集合
Collection:
addAll(): 为一个集合增加内容 Collection.addAll("ARRAY", "BufferedReader");
reserve():
binarySearch(): 返回内容位置
sort(); 排序
swap(): 交换我ie之
Stack: 先进先出
push: 进站
pop: 出战
int search(Object o): 在战中查找
Properties:
new Property().setProperty("key", "value");
store(OutputStream out, String comment, String encoding);
list(PrintStream out):
loadFromXML(InputStream in):
storeToXML(OutputStream out)
2016-09-05 星期一
1. Class类方法
Class<?> forName(String Name): 传入完整"包.类", 实例化Class对象
c1 = Class.forName("com.huawei.ftl.X");
System.out.println("类名称: " + c1.getName());
也可以通过类.class或者对象.getClass()实力化Class类
实例化后可以通过newInstance()实例化对象,注意转换类型
per = (Person) c.newInstance();
(以上注意一点,就是类中必须由无参构造方法)
Construtor[] getConstructor: 得到类中所有的构造方法
Field[] getDeclaredFields(): 得到继承来的类
Class[] getInte
2016-09-10 星期六 JavaWeb
HTML注释语句: <!-注释语言->
1. JS的事件处理: body (onLoad()="start()" onUnload()="stop()" onClick="fun()")
onSubmint():事件在提交之前先验证
onCHange(): 变化
文本处理: var value = document.form.content.value;
//精确到具体的name值,然后取值,否则为空
2.3.3Window对象
window.location: 定位到对应网页
window.open: 打开网页设置
HTML: 表达式完成交互的收到,表单元素写在《form>里面
JavaScript是基于对象的语言,function是函数,又返回值直接返回return即可。
3.1 XML: 可扩展性标志语言,实现数据交换,系统配置,内容管理。
XML语言是以<? ?> 开始和结束的
version:
encoding:编码
standalone: 是否独立运行, XML声导固定格式
<?xml-stylesheet type="text/css" href = "attri.css"?>
<![CADATA[里面的内容不解析]]>
3.2 XML解析:SAX && DOM(文档对象模型)
4个重要的额借口:
Document:整个XML文档,根节点
Node:每一个Node代表一个节点
NodeList:节点的集合
NamedNodeMap:一组节点和其唯一名称对应关系,属性节点
NodeList getElementByTagNsme();取指定节点名
Element createElement(String tagName):创建指定名节点
Dom4J:利用工具来读写文件
Document doc = DocumentHelper.createDocument();
Element addresslist = doc.addElement("addresslist");
Element linkman = addresslist.addElement("linkman");
Element name = linkman.addElement("name");
name.setText("吕峰涛");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
2016-09-11 星期日
1.创建目录--> WEB_INFO--> 复制WEBapps/ROOT/web.xml到虚拟目录下
Tomcat修改端口:conf/server.xml
虚拟目录:复制web.xml
<content path="/mldn" docBase="虚拟目录地址"/>
修改conf/web.xml listings的false修改为true;
2xx:请求成功
3xx:重定向
403:禁止
404:找不到文件
500:服务器内部错误
Tomcat是个Web容器
2.JSP学习
JSP的命名采用小写,且最终都是以*.class完成
request.getParameter()方法接受输入内容。
2016-09-11
1. JavaBean;一个类只包含属性,setter,getter方法
POJO: 简单的Java对象
VO: 专门传递值
TO: 传递对象
2. 数据库操作:
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, tid);
(注意顺序,一定是先执行语句,然后设置变量)
2016-09-18
1.抽象类的使用: Person per = new Student("lvfengtao", 12o, 99.9f);
抽象类中定义抽象方法为public, 不用写方法体 public abstract void say();即可;
2.工厂模式中在工厂类中定义了一个静态方法来获取接口的实例;
public static Fruit getInstance(String name)
3.代理模式; Network net = new Proxy(new Real());
}
2016-10-02 星期日
1. 使用Dom4J 生成XML文件,XML主要是用于数据交换
Document创建一个DOC文档,一个文档只有一个根节点
Element添加元素,
OutputFormat完成格式化,设置为中文格式。
XMLWriter完成数据的写入
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(
new FileOutputStream(
"G:" + File.separator + "new2016.xml"), format );
writer.write(doc);
writer.close();2. JS操作XML
JS点击显示文字:
document.getElementById("info").innerHTML = "<h2>www.MLDNJAVA.cn</h2>" ;
JSP注释:
1.<!--注释内容--> 显示注释客户端可以看见
2.<%--注释内容--%>; /* */ // 隐式注释
Scriptlet:3种方式
1.<% %> : 定义局部变量
<%!%>: 全局变量,类,方法
<%=%>: 输出一个变量
2.标签:<jsp:scriptlet> 代码块 </jsp:scriptlet>
Page: langua="Java" contentType="text/html" pageEncoding="GBK"
必须是text/html 因为conf/web.xml写了这个
2.错误页面显示:
<%@ page isErrorPage = "true"%> isErrorPage (注意大小写)
<%@ page errorPage="error.jsp"%>
属于服务器端的跳转
Include:包含指令:
1.静态包含: <%@ include file= "" %>
2.动态包含:<jsp:include>:自动区分页面静态还是动态
<jsp:include page = "{包含文件路径 | <%=表达式%>}" flush = "true/false"/>
<jsp:param name="参数名称" value="参数内容"/>
</jsp:include>
静态是先包含后处理,动态是先处理后包含
跳转: <jsp:forward page = {""}>
2016-10-04 星期二 JSP
中文问题:
HTML:<meta http-equiv="Content-Type" content="text/html;
charset= utf-8 "/>
REQUEST:如果获取返回的值,可以设置
request.setCharacterEncoding("utf-8");
1.JSP内置对象 (9个,out, request, session(保存用户信息), application(所有用户的共享信息), response, pageContext(JSP页面容器))
4个属性:page(一个页面保存,调整失效),
request(只在一次 请求保持),
session(再一次会话范围内,任何跳转都行,新开浏览器失效),
application(服务器保持)
公共方法: setAttribute(), getAttribute(), removeAttribute(),
2.
page:
pageContext.setAttribute("name", "吕锋涛");
String name = (String)pageContext.getAttribute("name");
取得属性后要记得想下转型
HTTPServletRequest && ServerletRequest
request: 表示跳转后属性继续保存,换成超链接之后失效,一次情况下服务器只会给予回应一次
getParametervalues(String name): 取得客户端发来的一组请求
String method = request.getMethod();
String ip = request.getRemoteAddr();
String path = request.getServletPath();
String contextPath = request.getContextPath();
Enumeration enu = request.getHeaderNames();
角色验证
HTTPServletResponse && ServerletResponse
response:对客户的的请求回应(HTML跳转 && sendRedirectict)
addCookie(Cookie cookie)
setHeader(String name, String value) //
response.setHeader("refresh",2) 2秒刷新一次
response.setHeader("refresh",2; URL="hello.html") 2秒刷新后跳转页面,客户端跳转
<META HTTP-EQUIV="refresh" CONTNT="3";URL="hello.html">
sendRedirectict(String location)客户端调整
<jsp:forward> && sendRedirectict:
JSP是服务器段跳转,跳抓后地址不变,客户端跳转会导致地址变化
服务器端跳转时立刻的,客户端是执行万页面后跳转
操作Cookie:让服务器端的技术保存在客户端,火灾客户端执行数据处理,提高了网页的速率,减少了服务器的运载,安全性差。
javax.servlet.http.HttpSession
session: 一次设置,与设置页面相关就保存属性,可以通过超链接。新打开浏览器失效
主要用于登陆和注销操作,每一个session对象都表示不同的访问用户
getId(),
getCreation():
getLastAccessedTime():
isNew():
invalidate()://让session失效
Enumeration getAttributeNames():
获取用户时间:getCurrentTIme();
登陆程序:通过sessio保存方法; 使用Cookie保存信息; 通过表单隐藏域保存信息; 通过地址重写保存信息
application:保存属性到服务器
getRealPath():
getContextPath():取得当前虚拟路径名称
配置虚拟目录:<Context path="/mldn" docBase="D:/mldn">
总结一下:
1. request.setCharacterEncoding("GBK"); 设置为中文格式。
<meta http-equiv="Content-Type" content="text/html;
charset= utf-8 "/>
2. this.getServletContext().getRealPath("/"); 后去虚拟目录对应的真是目录
request.getContextPath(); //获取虚拟目录对应目录
3. PrintStream ps = new PrintStream(new FileOutputStream(file)); 设置输出流 ,输出到文件
ps.println(content);
ps.close();
//但凡IO操作必然涉及异常处理以及IO流的关闭
4. Scanner scanner = new Scanner(new FileInputStream(file)); 不明到底有多少的时候用StringBuffer;
scanner.useDelimiter("\n");
StringBuffer buf = new StringBuffer();
5. response.setHeader("refresh", "2;URL=login.jsp"); 定时跳转
<META HTTP-EQUIV="refresh" CONTENT="3";URL="request_demo_02.html">HTML定时跳转
session.invalidate(); 用户失效
session.getAttribute("userid"); 获取属性
session.getId(); 和Cookie一样
6. Cookie c[] = request.getCookies(); 至少1个
<%=c[i].getName()%> ---> <%=c[i].getValue()%>
**inst: getParametervalues用星号其区别;
7. <jsp:param name="uname" value="<%=name%>"/> 传递参数:
get && post区别:
get:提交后的内容会显示在地址栏,post不会
pageContext: response等设置的都可以在pageContext完成。
pageContext.forward("hello.jsp"?info="hell0"); 传递参数可以直接传递
String info = pageContext.getRequest().getParameter("info");
config的配置需要在web.xml文件中配置
2016-10-05 星期三 JavaBean;
1. JavaBean;一个类只包含属性,setter,getter方法
POJO: 简单的Java对象
VO: 专门传递值
TO: 传递对象,远程传输时必须继承Serialization
所有的类放入一个包,声明为public class, 属性封装,至少有一个无参构造方法
<jsp:useBean id = "sim" scope="page" class="com.huawei.ftl.SimpleBean"/>
<jsp:setProperty property="*" name="sim"/> name是实例化对象名称,pro="*" 自动匹配
2. 三目运算: return value == null?"":value;
3. MVC:
Model:完成独立的业务操作,JAVABEAN
Control :负责所有的用户请求,判断是否合法,根据请求类型调用JavaBean,显示给View
View:接受Servlet传递的内容,调研JavaBean显示给用户
RequDispatcher(): request属性传递内容2016-10-09 星期日 小雨
1. JSTL1.2标准库开发
c: 核心开发库
sql:查询数据库操作
xml:XML数据
fn: 函数操作
H&N:fmt.tld 格式化数据
2. c:out :输出属性
c:set: 设置属性
<jsp:useBean id="login" class = "com.huawei.mvc.servlet.LoginServlet" scope = "request"/>
<% request.setAttribute("simple", login); %>
<c:set var = "world" value = "hello world" target = "${simple}" property = "content" />
var:属性名称 value: 属性内容 scope: 保存范围 target:存储的目标属性 property:制定target属性
c: remove : 删除指定属性
c: catch:异常处理
c: choose:多条件判断,可以结合c:when c:otherwise
<c:choose>
<c:when test="${num==20}">
<h3>输入的nuam的值为: 20</h3>
</c:when>
</c:choose>
c: foreach :输出数组,集合
<c:forEach items="${ref}" var = "m">
${m}
</c:forEach>
注意items里写的是一个集合,一个变量,要用${}表示
c: url : 根据路径和参数生成一个新的URL
c: redirect: 客户端跳转
c: if :
<c:if test="${10 > 1}" var = "res" scope = "request">
test制定比较大小内容, var保存判断结果
c:forToken: 拆分数组
c:import 可以讲其他页面导入进来,类似<jsp include>
2016-10-10 Struts开发
1. Struts 中的Action相当于Servlet
ActionForm == JavaBean
所有的输入从ActionForm取得,Servlet中由request取得
Action 中完成跳转,需要在Struts-config中配置,每个Action配置也给跳转路径
2016-07-23 周六
利用键盘输入的时候需要抛出异常 ,直接快捷键 ctrl + 1 ;
定义数组 int score[] = new int[4] ; 只有4个数字
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
String str = br.readLine() ;//直接输入,直接输出
score[i] = Integer.parseInt( str) ; //转换Str 为 Int
int temp = Integer.parseInt(str); //字符串变为int型
String str = new String(b); byte变字符串
Scanner scan = new Scanner(System.in) ;
冒泡排序: i=1;j=0 ;
for (int i = 1 ; i < 3 ;i++ ){
for(int j = 0 ; j< 3 ; j++){
if(score[i] < score[j]){
int temp = score[i] ;
score[i] = score[j] ;
score[j] = temp ;
}
方法的定义: public static 返回值 方法名(类型 参数 , 类型 参数,){
程序体 ;
(return) //可省略
}
类名定义: ArrayDemo (单词首字母大写)
方法定义: printInfo (第一个单词小写,后面的单词首字母大写 )定义的时候 char c[] = {'','','',''} ; 字符串都是单引号,字符都是双引号
float型的参数都是 3.2f,
使用 break 可以结束一层循环
使用 return 可以结束一个方法
方法的递归 ; return x + sum(temp) ;
栈中存放的是堆空间的地址; 中放的是名字,堆内存是实际数字
2016-07-24 周日
Java 的直接数组排序 java.util.ARRAY.sort() ;
Java 的直接复制数组 System.arraycopy(源数组,源数组开始位置,目标数组,目标数组开始位置,数组长度 ) ;
(说是复制,其实就是目标位置的数组的替换,将源数组的数字复制到目标数组的位置,目标数组的长度不变)
Java 新特性:foreach(数据类型 变量名: 数组名称) ; foreach (int x ; temp) ;
Java 新特性:可变参数:返回类型 方法名(类型... 参数) public void fun (int... arg)
例: fun(new int[]{1,1,1,1,1}); // 传递参数可以直接传递
Java的多态性:方法的重载 ; 方法名同但是参数类型和参数的个数不同 ; System.out.println 也属于重载
对象的多肽 : 子类对象可以和父类对象进行相互转换,而且根据子类的不同,完成的功能也不同
Java的封装性:对象的属性和行为看成整体,即对象;
信息的隐蔽
private 声明的属性或者方法只能被类的内部进行访问,而不能在外部被访问;
this的使用:
this.表示当前对象,this必须发放到构造方法的首行
this调用构造方法时一定要保留一个构造方法作为出口,也就是有一个构造方法不调用this();
this.方法名() 强调是本类中的方法;
this.属性 强调是本类中的属性;
Java的继承性:拥有一般特性的事物,在基础上 派生其他;
类 : 成员变量声明 + 方法定义:
构造方法: 在实例化的时候就可以进行赋值,而不是调用setter 和 getter 方法 //也即是说,只是一个赋值的过程,没有返回值
方法名与主类同; 不能有返回值类型声明; 不能有return语句;默认 default 类型
匿名对象:没有明确给出名称的对象;一般只使用一次,而且直接开启堆空间,不存在栈空间的索引;
new Person("zhangsan",12).tell() ;
String 本身就是一个类,但是我们一般用的String没有开辟栈空间,比较的只是堆空间的值;
一个字符串本身就是一个String的匿名对象;
“==” 比较的是开辟的空间,而不是内容;
equal() 比较内容是否一致;
String 里面indexOf本身就可以比较内容 是否相等, 他是找到内容,然后返回字符所在位置, !(indexOf("hello"))!= -1 表示找到
一个String对象内容的改变实际上是通过内存地址的更新完成的,本身的字符串内容不会变;
char[] toCharArray() ;//转换为字符数组 charAt() //特定的位置取值 String split()//按照指定的字符串分割
String subString()指定字段取值 equals(), equalsIgnoreCase()
split 和 raplaxeAll() 支持正则表达式;,返回时一个 String s[] =
indexOf : 从指定位置开始查找字符串位置,没有找到就返回 -1 ;
charAt : 取出指定位置的字符 trim() :去掉左右的空额
length 和 length() 在数组中,length是长度,String操作中是函数,需要length() ;
引用传递: 就是将一个堆内存空间的使用权交给多个栈内存空间
接受本类的对象: public void fun(Demo d2)
2016-07-28 周四
Java的内存区域:
栈内存:保存所有对象的名称(堆地址的内存空间)
堆内存:保存每个对象的属性内容
全局变量: static类型属性
全局代码段:保存所有的方法定义
Static关键字:堆内存保存对象,可以用static共享属性
static声明属性的又称为类属性,因为类的公共属性应该由类来修改,毕竟用户不知道到底会有多少对象产生;
static String count = "ad"; Person.count = "bc";
static声明的方法又称为类方法,可以用类名调用;
public static setName(String name) ; Person.setName("lvfengtao") ;
static应用,可以查看定义了多少给 实例化对象;
System.exit(1) ; //可以直接退出程序,设置非0数字
代码块:
普通代码块:{}括起来的,直接在方法或者语句中设置的
构造代码块:直接写在类中的代码块 //只有一行代码
静态代码块:用static声明的代码块
静态代码块优于主方法执行,类中的静态代码块优先于构造块执行,且只执行一次,不管产生几个对象
构造方法私有化: private 方法名()
构造方法一旦私有化,就不能new调用,就必须从内部调用
一种是static 属性,另一种是static 方法,返回实例,通过类.方法名调用;
单例设计模式: 无论程序怎么运行,始终只有一个实例化对象存在,只要将构造方法私有,就可以对控制实例化对象的产生;
数组一定要先开辟空间,因为是引用类型
主方法的String args[] 本身就是一个类,主方法中的参数本身就是以对象数组的形式出现的;
内部类: 在类的内部在定义一个类
缺点:类由属性和方法构成,所以会破坏类结构
唯一的好处就是可以访问外部类的私有属性;
用static声明的内部类变成了外部类,但是不能访问非static声明的外部类属性
在外部访问内部类
外部类.内部类 内部类对象 = 外部类实例.new 内部类() ;
private 定义是在一个类里面都可以访问,所以内部类可以直接访问外部类的属性;
使用statIC声明的内部类就会成外部类,使用static声明的内部类不能访问非static声明的外部类
在方法中定义一个内部类
在方法中定义的内部类不能直接访问方法中的参数,如果发放中的参数想要被内部类访问,就必须在参数前加final关键字
2016-07-30 周六
使用构造方法的时候,一定是this.setName(name); 继承的时候是,super(age,name); Getter方法中:return school;
关于输出,最好是在类中返回String方法,然后在主类中 System.out.println(实例化对象.方法名) ;6.1 继承类(派生类)
Java只允许单继承,一个子类只允许有一个父类,允许多层继承,一个父类还有一个父类;
子类是不能调用父类的私有成员,子类可以调用父类的非私有 方法,但是不能直接调用父类的私有成员,但是可以通过setter和getter;
子类实例化对象之前,先调用父类的构造方法,后调用子类的构造方法,实际上子类的构造方法中隐藏了super()方法【超类】
子类不能拥有比父类更高级的访问权限
6.2 this 和 super 区别:
1.this 只能调用本类的属性、方法,本类中没有则父类查找 super 访问父类的方法,方法
2.this 调用本类构造, supe 调用父类构造,且放在子类首行
3.this 表示当前对象
6.4 final :完结器 ,final声明的类不能有子类,声明的方法不能被覆写,声明的变量为常量,不可以修改
final声明的变量必须全部大写; public static ,final String NAME = "Lvfengtao";
6.5 Abstract 抽象类: 抽象类是一种模板,必须被继承才能用,一个子类只能继承一个抽象类
包含一个抽象方法的类是抽象类; 抽象类和抽象方法必须由abstract声明; 抽象方法只需声明,不需要具体;
抽象类必须被继承,子类必须前部复写抽象类中的全部抽象方法 public abstract void print();
抽象方法不要使用private声明,因为必须被覆写,子类不易复写;
抽象类可以定义构造函数,所以子类实例化之前必须对父类进行实例化,也就是说先必须给打印父类的构造方法然后子类的构造方法
子类可以通过super()方法调用抽象类(父类)的构造方法,也可以在子类调用父类指定参数的构造方法
子类 extends 抽象类 implements 接口A, 接口B
6.6 接口: 特殊的类,由全局常量和公共的抽象方法组成 // 接口本身已经定义,所以不需要在写 public static fianl 和 abstract ;
由于明确规定了抽象方法是public 类,所以也不需要在写;
接口与抽象方法一样需要子类的继承 implements,一个子类可以实现多个接口,摆脱继承的单继承
全局常量,在接口里定义的时候用大写
Java允许一个抽象类实现多个接口,但是一个接口不允许继承抽象类, 允许一个接口继承多个接口
接口的继承: interface A extends B, C
interface A {
public static final String INFO =, "Lvfengtao" ==== String INFO = "Lvfengtao"
public abstract void print() ========== (public)void print()
//全局常量;
抽象方法; //必须是public方法,写与不写,Java的接口方法都是pblci
}
6.7 对象的多态性
表现: 1、方法的重载和覆写
2、对象的多态性
(向上转型:子类--> 父类 ; 父类 父类对象 = 子类实类
向下转型:父类 --> 子类,且必须说明向下转型的子类类型) 子类 子类对象 = (子类)父类实例
** 对象是Object类型,需要转型 String str = (String)obj[i];
2016-08-02 星期二
6.12 包装类; Java数据分为基本数据类型和引用数据类型,
用的最多的还是讲字符串变为数据类型(int i= Interger.parseInt("1234"));
(字符串变为数组的时候需要抛出异常)
拆箱 和装箱: Interger i = new Interger(x); int x = i.intValue();
Integer i = 0 ;//自动封装 int x = i; //自动拆箱
7.1 异常的基本概念
Java的异常都是以类和对象的形式存在,Java的错误主要是语法和语义的错误,编译的时候没有报错,但是运行的时候也可能报错
Try() 找到错误后会跳转到 catch里面,一旦产生异常,则首先回产生一个异常类 的实例化对象,
Exception 和 Error 都是Java Throwable的异常类
通常用e.printStaceTrace()方法打印异常信息,所有的额子类的实例都可以用父类来接受,所以可以调转
7.2 throws 和 throw关键字
throws声明的方法,表示此方法不处理异常,而是调用方法去处理;
2016-08-03 星期三
9.1 多线程: 继承 Thread类【要覆写run()】或者实现Runnable类 // 都需要覆写run()方法
由于受到单继承的影响,所以一般多线
中程是通过
同时可以调用父类start()方法,实现多线程,说是调用start()方法,但是调用的却是run()方法的主题
一般重复调用start()方法回抛出异常,而且本质上调用 start0()这个方法,因为使用了native声明,所以需要依靠底层的操作系统支持
实现Runnable()方法,需要实现多线程,可以利用Thread类中设定的方法启动多线程
Thread类也是Runnable接口的子类,但是Thread并没有完全的实现Runnable接口的run() Thread 构造方法 Thread thread = new Thread(接受 Runnable的子类,设置线程名称 )
继承Thread类并不能实现资源共享,如果想要资源共享必须实现Runnable接口
避免单继承带来的局限性; 代码能与多个线程共享,代码与数据是分开的;
9.2 线程的状态: 创建 、就绪、 运行、 阻塞、 终止
getName: 取得线程名称; setName: 设置线程名称
main()本身也就是一个线程,每次Java运行都至少启动2个线程,一个main,一个垃圾回收
main()方法可能比其他方法更早执行;
public static Thread currentThread(): 返回当前执行的类
public final String getName(): 返回线程名称
public final int getPriority(): 返回优先级 1 5 10
public boolean isInterrupted(): 线程是否中断;
9.3 Thread类中有一个方法: 利用 构造函数可以直接命名线程 子类实例化以后就可以直接start
Runnable,需要 子类实例化对象,然后调用Thread调用start方法
9.6 解决资源同步问题:1、使用同步代码(Synchronized(同步对象 this)
2、同步方法
多线程 共享同一资源的时候需要同步,但是过多会产生死锁;
方法的完整定义:
public/default/private/protected final static syncronized 返回类型 方法名(参数类型 参数名称) throws EXCEPTION{ return [返回值/返回调用处]}
死锁: 同步可以保证资源共享的正确性,所谓死锁就是2个线程都在 等待彼此完成任务,造成程序停滞
2016-08-06 星期六
new String(bInput); //byte数组变为字符串 byte[] b = str.getBytes();
int i = Integer.parseInt(str); //字符串变整数 {\\d4}必须 数字出现4次
(^\\d+.?) 正则表达式匹配小数 ,? 表示小时代可以出现一次或0次
[a-zA-Z0-9]字母数字 \w 字母、数字、下划线 ^\\d{4}-\\d{2}-\\d{2}$:年与日
[abc]: 字符abc [^abc]: 除了abc之外的任意字符 \d :数字 \D: 非数字 \w:字母、数字、下划线 \s:所有空白字符
X?:出现0次到1次 X*:出现0次,1次,多次 X+:出现1次或多次
X|Y: 先X或Y XY:先X后Y
正则表达式需要Patter和Matcher两种类完成, Patter类主要进行正则规范Matcher主要执行验证
Patter.complie("[0-9]+").matcher(str).matches();
Patter p = Patter.compile("[0-9]+");
Matcher m = p.matcher(str);
m.matches();
12.16 序列化
实现Serializable接口,还需要依靠对象输出对象和对象输入流
对象输出流(ObjectOutputStream): 实现序列化
构造方法(传入输出对象):ObjectOutputStream(OutputStream out)
普通方法(输出对象): writeObject(Object obj)
File file = new File("E:" + File.separator + "test.txt");
ObjectOutputStream oos = null;
OutputStream os = new FileOutputStream(file);
oos = new ObjectOutputStream(os);
oos.writeObject(new People("People",21));
oos.close();
实现Externalable接口,还需要依靠对象输出对象和对象输入流
public void readExternal(ObjectInput input) // 读取需要的 内容
{
this.name = (String)input.readObject(); //需要转换
}
public void writeExternal(ObjectOutput output) // 写入需要的 内容
{
output.writeObject(this.name);
}
transient: 声明 的关键字不可以被序列化13.1 认识类集
:动态完成对象数组操作,是动态的对象数组,是对一些实现好 的数据结构的包装,不受对象数组长度限制;
特点:对基本类集(动态数组、连接表、树)实现是高效的
框架允许不同类型的类集以相同的方式和高度
Collection: 接口,存放一组单值(集合中的每个元素都是一个对象)的最大接口,
List: Collection 子类接口,堆Collection扩充,允许内容重复
Set: Collection 子类接口,没有对Collection扩充,允许内容不重复
依靠hashCode()和equals()两个方法区别
Map; 存放一对值得最大接口,Key -- > Value
Iterator:集合的输出接口,用于输出集合中的内容,胆小
ListIterator: 可以双向输出
Enumeration: 输出指定集合的内容
SortedSet: 单值的排序接口,可以使用比较器排序
SortedMap:存放一对值得排序接口,按照key值比较
Queue: 队列接口,可以实现队列操作
Map.Entry: Map.Entry的内部接口,每个Map.Entry对象都保存这一对 key --> Value的内容,每个Map接口都保存很多Map.Entry接口实例
List<String> list = new ArrayList<String>() ;
System.out.print(list);
2016-08-07 星期日
13.1
String str[] = list.toArray(new String[]{}); //后面的{}实为初始化
indexOf() 找不到返回-1 找到显示位置
ArrayList 和 Vector区别:
ArrayList是异步处理方式,性能高,非线程安全操作类,使用Iterators
LinkedList子类和Queue接口
LinkedList表示一个链表的操作类, ListedList<> l = new ListedList<>();
poll()方法找到首字母并回删除首节点, peak() 找到首字母
Queue表示的是队列操作接口,采用FIFO方式操作,for(int i; i< list.size()+1
set:
散列存放:HashSet:
set<String/也可以是个类名> s = new HashSet<String/也可以是类名>();
System.out.println(set); //自主调用toString()方法
有序存放:TresSet 类中的每一个对象所在的类都必须实现Comparable接口才可以使用;
TreeSet自定义排序是一定要继承Comparable类,复写Comparto()方法,
public int compareTo(Person per)
但是比较器比较的时候,如果某个属性没有进行比较的指定,也会认为是同一个对象,所以应该增加按照姓名比较;
return this.name.compareTo(per.name);
去除重复元素: 主类不需要继承TreeSet,但是需要复写equals方法,编写hashCode方法
13.6 集合的输出
如果要输出Collection、Set集合中的内容,可以将其转换为对象数组输出,而List则可以直接使用get()方法输出;
常用的类集合为:
Iterator: 迭代输出(判断元素是否有内容,有就输出)
ListItarator: Iterator的子接口,专门用于输出List
Enumeration: 旧接口
2016-08-08 星期一
13.6.1
Iteration: Iterator是一个接口,直接使用Colletion定义的 itreator()实例化;同理List和Set也实现了此方法
hasNext(): 返回boolean,判断元素是否有内容,
next():输出,取出内容
ListIterator: 只能通过List实现实例化,只能输List内容
hasPrevious(): 判断是否有上一个元素
pervious(): 取出当前元素
nextIndex(): 返回下一个元素的索引
previousIndex(): 返回上一个元素的索引
set(): 替换元素
实现ListIterator接口双向输出时,如果想完成右后向前输出,则一定要先右前向后输出;
forEach: for (String str: list)//(类 对象:集合){}
13.7 Map接口
Map<K,V>:
clear(): 清空cler()
containKey(): 判断指定key是否存在
set<May.Entry><K,V> entrySet(): 将Map对象变为Set集合
Map.Entry是Map内部定义的一个接口,专门保存key->va
可以由外部通过“外部类.内部类”直接调用
Map内容是K-V形式保存,实际上K-V是把数据保存在M.E之后
Map输出数据的时候必须使用M.Entry接口
V get(OBJECT key): 根据key 取得Value
set<K> keySet(): 取得所有key
Set<String> set = map.keySet();
Collection<V> value(): 取出全部value
V put(K kye, V value): 向集合中加入元素
putAll<Map<? extends K, ? extends V>t> 一个Map集合加入到另一个
13.7.1 Map接口常用的类
HashMap: 无序存放,新的操作类,key不能重复
HashTable: 无序存放,旧类操作,key不能重复
TreeMap:有序Map集合,按key排序,不允许重复
WeakHashMap: 不再用的内容青岛湖
IdenHashM: key可以重复
Map接口的使用注意事项:
1.不能直接使用迭代输出Map内容,因为Map 存放一对值,Iterator只能输出一个
2.Map很少作为直接输出的额,只是用作查询
3.直接使用非系统类作为key
2016-08-28 星期日
//利用indexOf判断某个字符是否存在 也可以用
//replaceAll (源数字 , 目标数字) 直接替换
//System.out.println(str.charAt(8)); 取出第8个字符
继承父类以后调用父类的构造方法:super(name, address, sex, age);
输出父类的属性: super.toString()
代理模式: 代理和真实主题均要实现接口,在代理中实现真实主题实例化(构造方法中实现)
工厂模式: 其他了均实现接口,定义一个类专门获取实例,不是构造方法获得
适配器模式:接口定义方法, 构造方法实现此接口,方法体为空,后子类继承抽象类,有选择的复写方法
观察者模式: 要被关注的继承Obserable类,调用父类方法 super.setChanged(); super.nosuper.notifyObservers() 观察着实现 Observer接口,在update类中,判断是否是一个类,输出即可
//这些接口呢都需要用到多态性,都是 接口 接口对象 = new 子类对象(),实现向上转型,转型后可以调用子类复写父类的方法
如果需要向下转型,则调用子类自己的方法,但是需要先向上转型后, instanceof 比较对象;//如果要进行字符串的拆分,利用split方法
Pattern p = Pattern.compile("[a-zA-Z]");
String s[] = p.split(str);
//如果需要正则表达式来进行字符的替换,
String str = "123231m3m123m123m123m12";
Pattern p = Pattern.compile("[a-zA-Z]");
Matcher m = p.matcher(str);
String ss = m.replaceAll("_");
、、以上方法String都有支持的 boolean matches(String regex); String[] split(); String replaceAll(String regex, s)
2016-08-30 星期三
时间类: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
sdf.format(new Date()) ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date temp = sdf.parse(str);
字符串拆分:
String str = "<html xmlns=\"http://www.w3.org/1999/xhtml\">";
str = str.substring(str.indexOf(" ")+1, str.indexOf(">")).replaceAll("\"", " ").replaceAll("\\.", " ").replaceAll("/", " ");
字符串内输入双引号: \"
定时调度:
Timer类: 是一种线程设施,可以定时安排一个时间,与TimerTask(实现由TImer安排的一次或重复执行的某一个任务)配合使用
IO操作:
File打开文件--> 字节流制定位置-->读写--> 关闭流
FIle类:文件本身操作
boolean createNewFile();
boolean exists();
boolean isDirectory();
String[] list();
File[] listFiles();
boolean mkdir();
boolean renameTo(File dest); //已有文件重新命名
RandomAccessFile类:随机读取类(一般不用)
RandomAccessFile(File file, String mode) //file路径
RandomAccessFile(String path, String mode)//固定路径
close(): 关闭操作
void writeBytes(String s): 字符串写入文件
void writeInt(jint v)
int read(byte[] b): 将内容读取到一个byte数组
byte readByte(): 读取一个字节
int readInt(): 读取整数型
int skipBytes(int n):指针跳过多少字节
void seek(long pos): 指针位置
所有数据都是已流的方式传输或保存,分字节和字符
字节流:以byte为准,需要将字符串转为Byte数组
OutputStream
OutputStream out = new FileOutputStream(file);
OutputStream out = new FileOutputStream(file, true);追加内容
String str = "\r\nHEllo world"; 文件需换行,可以加\r\n
byte[] b = str.getBytes();
out.write(b);
out.close();
InputStream:
int avaliable(); //取得文件大小
int read();//以数字的方式读取
int read(byte[] b) ;内容读取到byte数组
InputStream input = new FileInputStream(file);
byte[] bb = new byte [(int)f.length()]
//byte[] bb = new byte[1212];
//int len = input.read(b); //取出内容到byte数组,确定输出多少
while(input.read()!=-1)
{
b[len] = (byte) temp;
len++;
}
input.close();
System.out.println(new String(b, 0, len));
一个字符2个字节;
字符流: Writer 子类: FileWriter
可以添加对象, Writer writer = new FileWriter(new File(), true);
write(String str) 字符串输出
write(char[] c) 字符数组输出
flush() 强制清空缓存
Reader 子类 FileReader
int read()
int read(char[] c): 内容读取到字符数组,返回长度
字符的输出: new String(c, 0 ,len)
读取字符串有2中方法: 直接从文件读取
for循环 读取一个字节 int len = 0;
int temp = 0; //接收每一个内容
while((temp = reader.read())!=-1)
{
c[len] = (char)temp;
len++;
}
字符流使用了缓冲区,字节流没有使用缓冲区(内存区域);
不关闭时也将字符内容输出,可以使用Writer类的flush()方法打印流: PrintStream() 和 字符打印流()
2016-09-03 星期六
1.Serializable(Serializable)
一个类的对象要想被序列化(一个对象变为2进制,方便存储和传输),就必须实现Serialiable接口,依靠ObjectOutputStream()和ObjectInputStream()
Java序列化的时候会产生一个序列化ID,通过JVM实现
File file = new File("F:" + File.separator + "hello.txt");
OutputStream out = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(new Person("lisi"));
ObjectInputStream ois = new ObjectInputStream()
oos.close();
InputStream input = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(input);
Object obj = ois.readObject();
ois.close();
2. Externalizable是Serializable子类,实现此接口的可以用户自己制定被序列化的内容
writeExternal(ObjectOutput ot): 指定要保存的属性信息,对象序列化时调用
readExternal(ObjectInput in): 读取被保存的信息,反序列化用
以上2个方法都是DataOutput 和 DataInput接口的子类
public Person(){};
public Person(String name)
{ this.name = name; }
//读取属性,有一个强制转换的要求
public void readExternal(ObjectInput input)
{ this.name = (String) input.readObject();}
//保存name属性
public void writeExternal(ObjectOutput output)
{ output.writeObject(this.name); }
一个类要使用Externalizable实现序列化,此类必须有一个无参构造方法,因为在反序列化的时候会默认调用无参构造实例对象
3. transient:关键字表示对象的某一个属性不希望被序列化
4. 序列化一组对象:
对象输出时只提供了writeObject(Object obj)),并没有多对象输出,所以要实现同时序列化多个对象,就可以使用对象数组操作。
因为数组属于引用类型,可以用Object类型接收
5. List Set(重复内容依靠hashCode() 和 equals()方法区别) Queue SortSet(对集合中的数据进行排序)
List:接口
add(int index, E element)
addAll(int index, Collection<? extends E> c) 添加一组元素
E get(int index)
ListIterator<E> listIterator()
E remove(int index)
E removeAll(Collection<?> arg0)
List<E> subList(int fronIndex, int toIndex)
E set(int index, E element)
toArray(): 集合变为对象
size(): 返回集合的长度
get(int index): 返回当前的位置的数字
for(int i = 0; i < allList.size(); i++)
{
System.out.print(allList.get[i] + "、");
}
LinkedLis:链表操作类
addFirst(E e );
addList(E e);
boolean offer();
E removeFirst()
Queue:先进先出
E element(): 找到表头
E peek() 找到不删除;
E pool() 找到后删除; 利用此方法先进先出输出数字
E remove() 检索并移除表头
Set:HashSet && TreeSet
HashSet:
无规律可循
TreeSet:
有规律
如果是比较对象,则需要继承Comparable接口,实现CompareTo()方法
class Person implements Comparable<Person>//接口处定义泛型类型
public int compareTo(Person per) {
if ( this.age > per.age)
{
return 1;
}
else if (this.age < per.age)
{
return -1;
}
else
{
return 0;
}
比较器操作时如果某个实现没有进行比较,则默认为是一个对象
如果实现了HashSet,则所有的重复对象也会继续出现,就需要复写Object类的equals()方法和hashCode()方法,一个对象编码表示一个对象
SortedSet: TreeSet继承SortedSet
SortedSet<String> set = new TreeSet<String>();
first(); last();
SortedSet<E> headSet(E element):开始到指定位置
SortedSet<E> tailSet(E element):指定到最后
//可以用get()方法输出数字
Iterator:
Iterator iter = list.iterator();
ListIterator:
由前向后: hasNext() && next()
有后向前: 利用hasPrevious()方法由前向后判断,用previous取出元素
set() 和 add() 可以更改和添加元素
foreach输出:
for (类 对象: 集合) {}; for(String str: all)
Map:HashMap && TreeMap
put(Object key, Object obj): 添加数据
get(): 根据key值取得value的值
Map<String, String> map = new HashMap<String, String>();
Set<String> keys = map.keySet();
Iteration key = keys.iterator();
while(key.hasNext())
{
String str = key.next();
System.out.println(map.get(str));//根据key 取值
}
map.get(iter.next())
containKey(): 判断指定的key是否存在
keySet(): 将一个Map中的key变为Set集合,然后利用Iterator输出
values(): 返回Collection,注意定义泛型类型
Collection<String> col = map.values();
Iteration valus = col.iterator;
while(values.hasNext()){};
Map接口注意事项:
1. 不能直接使用迭代输出Map中的全部内容,因为Map存放的是一对值,Iterate只能每次找到一个值,如果非要迭代输出,则必须:
1> Map实例通过entrySet()方法变为Set接口对象
2> 通过Set接口实例化Iterator、
3> Iterator迭代输出,每一个ie内容都是Map.Entry的对象
4> 通过Map.Entry进行 key --> value分离
(Map中的每对数据都是通过Map.Entry保存的,所以也是Map.Entry输出)
Map<String ,String> map = null;
map = new HashMap<String, String>();
map.put("04122077", "吕峰涛");
map.put("04122076", "吕峰");
` Set<Map.Entry<String, String>> set = map.entrySet();
Iterator<Map.Entry<String, String>> iter = set.iterator();
while(iter.hasNext())
{
Map.Entry<String, String> me = iter.next();
System.out.print( me.getKey() + "--> " + me.getValue() + "\t");
}
SortedMap: 排序接口,实现此类都是排序的子类,例如TreeMap
Comparator<? super K> comparator();
K firstKey(); K lastKey();
SortedMap<k, V> subMap(K fromKey, K endKey)
SortedMap<K, V> tailMap<K fromKey): 返回大于指定key的部分集合
Collection:
addAll(): 为一个集合增加内容 Collection.addAll("ARRAY", "BufferedReader");
reserve():
binarySearch(): 返回内容位置
sort(); 排序
swap(): 交换我ie之
Stack: 先进先出
push: 进站
pop: 出战
int search(Object o): 在战中查找
Properties:
new Property().setProperty("key", "value");
store(OutputStream out, String comment, String encoding);
list(PrintStream out):
loadFromXML(InputStream in):
storeToXML(OutputStream out)
2016-09-05 星期一
1. Class类方法
Class<?> forName(String Name): 传入完整"包.类", 实例化Class对象
c1 = Class.forName("com.huawei.ftl.X");
System.out.println("类名称: " + c1.getName());
也可以通过类.class或者对象.getClass()实力化Class类
实例化后可以通过newInstance()实例化对象,注意转换类型
per = (Person) c.newInstance();
(以上注意一点,就是类中必须由无参构造方法)
Construtor[] getConstructor: 得到类中所有的构造方法
Field[] getDeclaredFields(): 得到继承来的类
Class[] getInte
2016-09-10 星期六 JavaWeb
HTML注释语句: <!-注释语言->
1. JS的事件处理: body (onLoad()="start()" onUnload()="stop()" onClick="fun()")
onSubmint():事件在提交之前先验证
onCHange(): 变化
文本处理: var value = document.form.content.value;
//精确到具体的name值,然后取值,否则为空
2.3.3Window对象
window.location: 定位到对应网页
window.open: 打开网页设置
HTML: 表达式完成交互的收到,表单元素写在《form>里面
JavaScript是基于对象的语言,function是函数,又返回值直接返回return即可。
3.1 XML: 可扩展性标志语言,实现数据交换,系统配置,内容管理。
XML语言是以<? ?> 开始和结束的
version:
encoding:编码
standalone: 是否独立运行, XML声导固定格式
<?xml-stylesheet type="text/css" href = "attri.css"?>
<![CADATA[里面的内容不解析]]>
3.2 XML解析:SAX && DOM(文档对象模型)
4个重要的额借口:
Document:整个XML文档,根节点
Node:每一个Node代表一个节点
NodeList:节点的集合
NamedNodeMap:一组节点和其唯一名称对应关系,属性节点
NodeList getElementByTagNsme();取指定节点名
Element createElement(String tagName):创建指定名节点
Dom4J:利用工具来读写文件
Document doc = DocumentHelper.createDocument();
Element addresslist = doc.addElement("addresslist");
Element linkman = addresslist.addElement("linkman");
Element name = linkman.addElement("name");
name.setText("吕峰涛");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
2016-09-11 星期日
1.创建目录--> WEB_INFO--> 复制WEBapps/ROOT/web.xml到虚拟目录下
Tomcat修改端口:conf/server.xml
虚拟目录:复制web.xml
<content path="/mldn" docBase="虚拟目录地址"/>
修改conf/web.xml listings的false修改为true;
2xx:请求成功
3xx:重定向
403:禁止
404:找不到文件
500:服务器内部错误
Tomcat是个Web容器
2.JSP学习
JSP的命名采用小写,且最终都是以*.class完成
request.getParameter()方法接受输入内容。
2016-09-11
1. JavaBean;一个类只包含属性,setter,getter方法
POJO: 简单的Java对象
VO: 专门传递值
TO: 传递对象
2. 数据库操作:
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, tid);
(注意顺序,一定是先执行语句,然后设置变量)
2016-09-18
1.抽象类的使用: Person per = new Student("lvfengtao", 12o, 99.9f);
抽象类中定义抽象方法为public, 不用写方法体 public abstract void say();即可;
2.工厂模式中在工厂类中定义了一个静态方法来获取接口的实例;
public static Fruit getInstance(String name)
3.代理模式; Network net = new Proxy(new Real());
}
2016-10-02 星期日
1. 使用Dom4J 生成XML文件,XML主要是用于数据交换
Document创建一个DOC文档,一个文档只有一个根节点
Element添加元素,
OutputFormat完成格式化,设置为中文格式。
XMLWriter完成数据的写入
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(
new FileOutputStream(
"G:" + File.separator + "new2016.xml"), format );
writer.write(doc);
writer.close();2. JS操作XML
JS点击显示文字:
document.getElementById("info").innerHTML = "<h2>www.MLDNJAVA.cn</h2>" ;
JSP注释:
1.<!--注释内容--> 显示注释客户端可以看见
2.<%--注释内容--%>; /* */ // 隐式注释
Scriptlet:3种方式
1.<% %> : 定义局部变量
<%!%>: 全局变量,类,方法
<%=%>: 输出一个变量
2.标签:<jsp:scriptlet> 代码块 </jsp:scriptlet>
Page: langua="Java" contentType="text/html" pageEncoding="GBK"
必须是text/html 因为conf/web.xml写了这个
2.错误页面显示:
<%@ page isErrorPage = "true"%> isErrorPage (注意大小写)
<%@ page errorPage="error.jsp"%>
属于服务器端的跳转
Include:包含指令:
1.静态包含: <%@ include file= "" %>
2.动态包含:<jsp:include>:自动区分页面静态还是动态
<jsp:include page = "{包含文件路径 | <%=表达式%>}" flush = "true/false"/>
<jsp:param name="参数名称" value="参数内容"/>
</jsp:include>
静态是先包含后处理,动态是先处理后包含
跳转: <jsp:forward page = {""}>
2016-10-04 星期二 JSP
中文问题:
HTML:<meta http-equiv="Content-Type" content="text/html;
charset= utf-8 "/>
REQUEST:如果获取返回的值,可以设置
request.setCharacterEncoding("utf-8");
1.JSP内置对象 (9个,out, request, session(保存用户信息), application(所有用户的共享信息), response, pageContext(JSP页面容器))
4个属性:page(一个页面保存,调整失效),
request(只在一次 请求保持),
session(再一次会话范围内,任何跳转都行,新开浏览器失效),
application(服务器保持)
公共方法: setAttribute(), getAttribute(), removeAttribute(),
2.
page:
pageContext.setAttribute("name", "吕锋涛");
String name = (String)pageContext.getAttribute("name");
取得属性后要记得想下转型
HTTPServletRequest && ServerletRequest
request: 表示跳转后属性继续保存,换成超链接之后失效,一次情况下服务器只会给予回应一次
getParametervalues(String name): 取得客户端发来的一组请求
String method = request.getMethod();
String ip = request.getRemoteAddr();
String path = request.getServletPath();
String contextPath = request.getContextPath();
Enumeration enu = request.getHeaderNames();
角色验证
HTTPServletResponse && ServerletResponse
response:对客户的的请求回应(HTML跳转 && sendRedirectict)
addCookie(Cookie cookie)
setHeader(String name, String value) //
response.setHeader("refresh",2) 2秒刷新一次
response.setHeader("refresh",2; URL="hello.html") 2秒刷新后跳转页面,客户端跳转
<META HTTP-EQUIV="refresh" CONTNT="3";URL="hello.html">
sendRedirectict(String location)客户端调整
<jsp:forward> && sendRedirectict:
JSP是服务器段跳转,跳抓后地址不变,客户端跳转会导致地址变化
服务器端跳转时立刻的,客户端是执行万页面后跳转
操作Cookie:让服务器端的技术保存在客户端,火灾客户端执行数据处理,提高了网页的速率,减少了服务器的运载,安全性差。
javax.servlet.http.HttpSession
session: 一次设置,与设置页面相关就保存属性,可以通过超链接。新打开浏览器失效
主要用于登陆和注销操作,每一个session对象都表示不同的访问用户
getId(),
getCreation():
getLastAccessedTime():
isNew():
invalidate()://让session失效
Enumeration getAttributeNames():
获取用户时间:getCurrentTIme();
登陆程序:通过sessio保存方法; 使用Cookie保存信息; 通过表单隐藏域保存信息; 通过地址重写保存信息
application:保存属性到服务器
getRealPath():
getContextPath():取得当前虚拟路径名称
配置虚拟目录:<Context path="/mldn" docBase="D:/mldn">
总结一下:
1. request.setCharacterEncoding("GBK"); 设置为中文格式。
<meta http-equiv="Content-Type" content="text/html;
charset= utf-8 "/>
2. this.getServletContext().getRealPath("/"); 后去虚拟目录对应的真是目录
request.getContextPath(); //获取虚拟目录对应目录
3. PrintStream ps = new PrintStream(new FileOutputStream(file)); 设置输出流 ,输出到文件
ps.println(content);
ps.close();
//但凡IO操作必然涉及异常处理以及IO流的关闭
4. Scanner scanner = new Scanner(new FileInputStream(file)); 不明到底有多少的时候用StringBuffer;
scanner.useDelimiter("\n");
StringBuffer buf = new StringBuffer();
5. response.setHeader("refresh", "2;URL=login.jsp"); 定时跳转
<META HTTP-EQUIV="refresh" CONTENT="3";URL="request_demo_02.html">HTML定时跳转
session.invalidate(); 用户失效
session.getAttribute("userid"); 获取属性
session.getId(); 和Cookie一样
6. Cookie c[] = request.getCookies(); 至少1个
<%=c[i].getName()%> ---> <%=c[i].getValue()%>
**inst: getParametervalues用星号其区别;
7. <jsp:param name="uname" value="<%=name%>"/> 传递参数:
get && post区别:
get:提交后的内容会显示在地址栏,post不会
pageContext: response等设置的都可以在pageContext完成。
pageContext.forward("hello.jsp"?info="hell0"); 传递参数可以直接传递
String info = pageContext.getRequest().getParameter("info");
config的配置需要在web.xml文件中配置
2016-10-05 星期三 JavaBean;
1. JavaBean;一个类只包含属性,setter,getter方法
POJO: 简单的Java对象
VO: 专门传递值
TO: 传递对象,远程传输时必须继承Serialization
所有的类放入一个包,声明为public class, 属性封装,至少有一个无参构造方法
<jsp:useBean id = "sim" scope="page" class="com.huawei.ftl.SimpleBean"/>
<jsp:setProperty property="*" name="sim"/> name是实例化对象名称,pro="*" 自动匹配
2. 三目运算: return value == null?"":value;
2016-10-22 星期六
1. <script language = "javascript"> js 是小写
用onsubmit()方法的时候一定是 return validate(this)
JS 中 判断值得方法是:
DOM4J XMLWriter 和SAXReader解读
2017-01-01 星期日
1. Java中sleep和wait的区别
① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。
sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。
② 锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
③ 使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。
synchronized(x){
x.notify()
//或者wait()
}
-------------------------------------------
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!