java基础知识总结

tanlin 贡献于2016-11-16

作者 Administrator  创建于2014-10-29 12:08:00   修改者Administrator  修改于2016-11-16 12:23:01字数26835

文档摘要:
关键词:

cmd控制台: cd 换目录 cd.. 回退 del 删除文件 dir 列出所有文档及文件夹 java中的名称规范: 包名:xxxyyyzzz 类名:XxxYyyZzz 接口名:IXxxYyyZzz 变量名函数名:xxxYyyZzz 常量名:xxx_yyy_zzz 数据类型: 整数 byte(8位) short(16位) int(32位) long(64位) 小数 float(32位) double(64位) 布尔型 boolean(true false)(2位) 字符 char(16位) 类型转换优先级:byte short(char) int long float double 进制: 八进制:0 12 十六进制:0x 6ac63 一字节=八个二进制数 负数的二进制:取反+1 字符串与任何数据使用+,最终结果都是字符串 运算符:+、-、*、/、%、++、-- print:不换行 换行:\n 退格:\b 按下回车键:\r 制表符(tab)\t \\:\ \":" 赋值运算符:+=、-=、*=、/=、%=、 比较运算符:==、!=、<、>、<=、>= 逻辑运算符:&(与)、|(或)、^(异或:两边不同为true)、!(非)、&&(短路与:为false,则不计算右边)、||(短路或:为true,不计算右边) 位运算符:<<(乘2的位数次幂)、>>、>>>(最高位补0)、&、|、~、 最简无限循环: for(;;){} while(true){} 结构: ① if( 条件判断1){ // 功能执行语句; }else if( 条件判断2){ // 功能执行语句; }else{ 如果上面的所有条件都不满足,则执行此处的代码 } ② switch( 变量){ case 变量可能的值1 : 功能执行语句; break; case 变量可能的值2: 功能执行语句; break; case 变量可能的值3 : 功能执行语句; break; default : 功能执行语句; break; } 需要的单词: switch(判断) case(条件) break(结束) default(其他) continue(继续) short s = 3 ;s=s+2;与s+=2有什么区别 java中的三大循环: ① while(表达式){ 执行语句 } ② do{ 执行语句 //先执行后判断 }while(表达式); ③ for(初始化语句;判断语句;循环后语句){ 执行语句 } 循环流程控制语句: ① break 跳出当前循环 ② continue 跳出本次循环 ③ return 跳出当前方法 方法: ① 有什么功能 ② 需要什么参数 ③ 通过这个方法要得到什么效果 方法结构: 修饰符(可交换) 返回值 方法名(参数列表){ 方法体 return a;//返回值 } 方法重载: 方法名相同,参数列表不同,与返回值、修饰符无关 数组: arr.length 数组长度 索引脚标从0开始 数组越界(找不到这个脚标所对应的数组):java.lang.ArrayIndexOutOfBoundsException int[] arr = new int[2]; arr[2]; 空指针(空对象上访问其中的成员):java.lang.NullPointerException int[] arr = null; arr.length; arr[i]; 排序方法: ①冒泡排序:从第一位开始一边比大小,一边换位置 ②选择排序:从第一位开始比大小,用第三方变量把最小值的脚标保存下来,在比较完之后再换位置 ③插入排序:想像为两个数组,把后面无序的数插入到前面已排好的数组中 二分搜索法: ①只能搜索已排序好的方法 数组 Arrays 工具类的使用 调用方法:java.util.Arrays.方法名 常用方法: 排序:java.util.Arrays.sort(arr); 转化为字符串:java.util.Arrays.toString(arr); 二分搜索法:java.util.Arrays.binarySearth(arr,valus); 增强for循环: for(数组中元素类型 变量 : 数组名){ System.out.println(变量名); } 可变参数: void test(int...arr){} ① int...arr 可传入0及以上个int变量 ② int...arr 是一个参数 ③ int...arr 只能在参数列表的最后 ④ 可传入一个int数组,在方法中也是当做一个数组处理 面向对象: ① 面向对象是一种编程思想,用具体的个体去调用个体的功能,将过程封装 构造方法: ① 方法名和类名相同 ② 没有返回值类型 ③ 在每一个对象创建时都会自动运行一次 ④ 在类中没有声明构造方法,JVM会自动为类创建一个空的构造方法 Student(){} ⑤ 作用:为对象赋初值 static 修饰: 可以修饰 变量和方法 变量: ① static 修饰的变量被所有对象所共享 ② 一般用 public static final 修饰全局常量 方法: ① 一般使用在工具方法中,如 Arrays 中的 sort() 方法 变量分类: 局部变量:在方法中、代码块中、形参等中的变量 类变量:被 static 所修饰的变量 实例变量:没有被 static 修饰的变量 类成员、实例成员 生命周期: 开始 结束 对象: 创建对象 失去所有的引用 类: 加载类 没有被调用为止 类变量: 加载类 没有被调用为止 包的使用: 基本语法: java文件中: package 公司域名反写.项目名.模块名 编译: javac -d . 文件名.java 运行: java 公司域名反写.项目名.模块名.文件名 导入包: import 包目录(如: import java.util.Arrays; ) 或大量类导入: import java.util.*; 封装: private 修饰符: ① 权限控制,可以修饰成员变量、方法、构造方法等 ② 私有的,用 private 修饰的成员只可以在本类中访问 ③ private 修饰的变量要写两个方法,get() set() ④ public 公共的,可以在其他包访问此方法 ⑤ 修饰符为空,只可以在当前包中调用些方法 this : ① 指向调用的本类对象,如: this.name = name; return this; ② 构造方法之间的调用: this(); 必须写在构造方法中的第一排 继承(extends): ① java 类之间只支持单继承,可多重继承 ② 子类继承了父类中的 除了 private 修饰之外的东西 ③ 方法覆写:子类可以覆写父类中的方法(private 与 static 除外),子类覆写的方法权限必须大于或等于父类中的方法 ④ Object 是所有未继承其他类的父类 Object 类中方法: equals(): 比较两个对象,比较的是对象在内存中的地址 toString():将对象转化为 String 类型的值,输出的是地址:类型@地址.输出语句在输出的时候会自动调用此方法 这两个方法在实际开发中一般会将之覆写,再使用 super: 与this用法类似 ① 指向调用的父类对象 ② 子类构造方法调用父类构造方法 多态: Animal an = new Person(); 父类对象指向子类的引用 ① 编译时看左边,编译器把对象当作是Animal的 ② 运行时看右边,虚拟机会把对象当作子类的来运行 ③ 若父类中的方法是 static 的,编译时会把对象编译为父类的类名 final : 最终的 ① 可修饰类、变量、方法 ② final 修饰的类不可被继承 ③ final 修饰的变量,只能赋值一次 final 修饰的字段必须定义时赋值 ④ final 修饰的方法,不可被覆写 单例模式:(一个类只有一个对象) 饿汉模式:在加载类的时候就创建一个对象,类的加载很慢 ① class A{ private static A a = new A(); private A(){} public static A getInstance(){ return a; } } ② class A{ public static final A INSTANCE = new A(); private A(){} } 懒汉模式:在调用方法时再创建对象 ① class A{ private static A a; private A(){} public static A getInstance(){ if(a == null){ a = new A(); } return A; } } ② class A{ private static A a; private A(){} static{ a = new A(); } public static A getInstance(){ return A; } } ③ enum A{ INSTANCE; } 代码块(用花括号括起来的代码): ① 普通代码块:在方法中或局部都可,只有作用域的问题 ② 构造代码块:是类的一个成员,编译时会写到每一个构造方法的前面 ③ 静态代码块:是类的一个成员,在加载类的同时,运行静态代码块 static { } 组合关系: 一个类用到另一个类中的功能就叫做组合关系 内部类: 将B类放到A类中,B就是A的一个实例成员,可用 static 修饰 匿名内部类:没有名字的内部类,一般内部类中的方法在3个或以下时使用,看作A的子类 A a = new A(){ void eat(){} }.eat(); 非静态内部类中不能有静态方法和静态变量,可以有常量(需定义时赋值),如: static void eat(){} 错 static int i ; 错 static final int i = 10; 对 枚举(java1.5开始支持,可以用在 switch语句中): ① 什么时候用枚举:类的对象个数固定,如:季节、星期、性别 ② 枚举语法:与类类似,构造函数默认私有化,覆写toString() enum Season{ ONE("春季"),TWO("夏季"),THREE("秋季"),FORE("冬季"); private Season(){} public static String toString(String name){ return name; } } ③ switch 中 enum 用法: switch(枚举对象){ case 枚举对象 :。。。 。。。 } 抽象方法: abstract 修饰,没有方法主体,以;结束 抽象类: ① abstract 修饰的类,类不可创建对象,可以作为多态中的父类 ② 类中可以有抽象方法,也可以没有 ③ 子类必须覆写所有的抽象方法,否则子类也必须是抽象的 ④ 类中的成员抽象类中都可以有,只是多了抽象方法 语法: abstract A{ abstract eat(); } 接口: 特点: ① 接口没有构造方法 ② 接口中的方法全是抽象的,默认修饰词: public abstract ③ 接口中的字段全是全局常量,默认修饰词: public static final ④ 类只能实现接口,可以实现多个接口,继承写在实现之前 ⑤ 接口之间是继承关系,可以多继承 ⑥ 接口命名规则:以大写字母I开头,之后和类的命名方式相同 接口定义语法: interface IB{ public abstract void eat(); } 接口 - 类: class A implements IB{ } 接口 - 接口: interface IC extends IA,ID{ } 常用类: 一、基本数据类型的包装类 Byte Short Integer Long Character Float Double Boolean String BigInteger BigDecimal StringBuffer StringBuilder 基本数据类型中除了 Character 与 Boolean ,其他都是 Number 类的子类 ① 基本数据类型不可以调用方法,默认值为 具体的数值 包装类类型可以调用相应的方法,默认值为 null ② 自动装箱、自动拆箱:基本数据类型和包装类之前可以自动转换 ③ 两个 byte 范围内的数,包装类数据地址值相同 注意:两个NaN不相等 二、 System 类 不能被实例化 常用方法: arraycopy() 拷贝数组 exit() 退出JVM currentTimeMillis() 获取系统当前毫秒时间的long值 getProperties() 获取当前系统的属性 exec() 在单独的进程中执行指定的字符串命令 三、 StringBuffer 线程安全的 四、 Math 类 数学相关算法类 abs() 求绝对值 max() 求最大值 min() 求最小值 pow() 返回第一个参数的第一个参数次幂的值 五、 随机数的获取 ① Math.random() 返回0.0 到 1.0 之间的 double 值 ② new Random().nextInt(10) 获取[0,10)之间的int值 ③ Random 的一个子类 ④ UUID 六、日期时间类 获取当前时间的 long 值: System.currentTimeMillis() Date ① 获取时间的long值 long getTime() ② 用long值设置时间 void setTime(long time) DateFormat SimpleDateFormat new 的时候可设置格式 "yyyy年MM月dd日" ① 把 Date 转为 String : format(Date date) ② 把 String 转为 Date : parse(String source) Calendar 抽象类 ① 获取对象: Calendar.getInstance() Calendar time = Calendar.getInstance(); ②年、月、日 int year = time.get(Calendar.YEAR); int month = time.get(Calendar.MONTH); int day = time.get(Calendar.DAY_OF_MONTH); ③给日历对象中指定的字段设置值 time.set(int field,int value); ④一次性获取日期 time.getTime(); GUI: Frame JFrame Button Panel(面板) Text两个类 EventListener(监听) MouseListener(鼠标监听) KeyListener(键盘监听) WindowListener(窗口监听) ActionListener(操作监听) //创建一个窗口 JFrame frame = new JFrame("记事本"); //窗口大小 frame.setSize(500, 500); //窗口初始位置 frame.setLocation(400,100); //创建菜单栏 MenuBar me = new MenuBar(); //创建菜单 Menu begin = new Menu("开始"); //菜单明细 MenuItem m1 = new MenuItem("打开"); //创建多行文本框 final TextArea text = new TextArea(); //添加文本框 frame.add(text); //创建监听 m1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //创建文件选择窗口 FileDialog fd = new FileDialog(frame); //显示文件选择窗口 fd.setVisible(true); filename = new File(fd.getDirectory(), fd.getFile()); //创建一个输入流 FileInputStream file = new FileInputStream(filename); //读取数据 byte[] by = new byte[10]; int len; while((len=file.read(by)) != -1){ text.append(new String(by,0,len)); } //关闭流资源 file.close(); } }); //添加组件到菜单中 begin.add(m1); //添加菜单到菜单栏 me.add(begin); //添加菜单栏到窗口 frame.setMenuBar(me); //窗口显示 frame.setVisible(true); 异常: 一、异常体系 Throwable 所有错误或异常的超类 |--Error 错误:发生后无法处理,如内存溢出 |--Exception 异常 |--RuntimeException 运行时异常 二、常见异常: ArithmeticException 算术异常 NullPointerException 空指针 对象未赋值,调用字段或方法 ArrayIndexOutOfBoundsException 数组角标越界 三、异常处理 ① try-catch 捕获异常 try{ 可能出现异常的代码 }catch (异常类型 变量名){ 处理异常代码 }finally{ 一定会执行的代码(System.exit()除外) } ② Throws 抛出异常 写在(){}之间 四、 Throwable 常见方法 String getMessage(); 返回此异常的详细消息字符串 String toString(); 返回此异常的简单描述 void printStackTrace(); 把异常信息指印到控制台 五、自定义异常 继承 Exception 、 方法中 throw 抛出 自定义类名 继承 RuntimeException 运行时异常,可以不抛出 线程: 一、两种方法 继承 Thread 类,覆写run(),创建本类对象,调用start() 实现 Runnable 接口,覆写run(),创建本类对象,用本类对象创建Thread对象,用线程调用start() 二、常用方法 ① 线程休眠 void sleep(); ② 获取线程名称 String getName(); ③ 正在执行的线程名称: Thread.currentThread().getName(); ④ 设置线程名称 setName() 或 构造方法 ⑤ 等待该线程终止,才继续执行 main() join(); ⑥ 返回线程的优先级 int getPriority(); ⑦ 更改线程的优先级 void setPriority(); 三、同步 synchronized (三种方法) ① 同步代码块 synchronized(同步监听对象){ 需要同步的代码 } ② 同步方法 synchronized void eat(){} 普通方法同步监听对象为 this 静态方法同步监听对象为 *.class ③ 锁 private final ReentrantLock test = new ReentrantLock(); test.lock(); 上锁 try{ 同步的代码 }finally{ test.unlock(); 解锁 } 四、等待唤醒机制 ① 线程等待 this.wait(); ② 唤醒正在等待的线程 this.notify(); 五、 Timer 类 java.util.timer 下 定时器对象,具有设定时间,时间到了再执行任务的功能 Timer test = new Timer(); ①常用方法 指定延迟时间后执行指定的任务 void schedule(TimeTask task,long delay); 集合(容器) 一、基于数组的集合 ArrayList 常用方法: ① 获取元素个数 int size(); ② 添加元素 boolean add(E e); ③ 添加集合到集合中 boolean addAll(int index,E e); ④ 移除所有元素 void clear(); ⑤ 是否包含此元素 boolean contains(Object o); ⑥ 索引查找元素 E get(int index); ⑦ 元素首次出现的索引 int indexOf(Object o); ⑧ 列表中是否有元素,没有返回true boolean isEmptY(); ⑨ 移除指定索引的元素 E remove(int index); ⑩ 移除首次出现的元素 boolean remove(Object o); ① 移除一个集合中另一个集合有的元素 removeAll(Collection o); ② 替换指定索引的元素 E set(int index,E element); ③ 手动扩容 void ensureCapacity(int minCapacity); ④ 去除空(减容) void trimToSize(); 遍历: ① for 循环 for(int i = 0 ;i < test.size();i++){ System.out.println(test.get(i));//通过索引拿到元素 } ② foreach 增强for for(Object obj : ages){ System.out.println(obj); } 迭代器: 所有Iterable接口的实现 可以调用它的iterator()方法得到一个iterator迭代器, 实现这个接口允许对象成为 Foreach 语句的目标。 因此如果创建了任何实现Iterable接口的类,都可以将它用于foreach语句中。 iterator接口的方法: hasNext() 如果仍有元素可以迭代,则返回 true。 E next() 返回迭代的下一个元素。 void remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。 ()可以传一个需要删除的对象 ① 单向迭代器 Iterator test1 = test.iterator(); while(test1.hasNaxt()){ System.out.println(test1.next()); } ② 双向迭代器 ListIterator test1 = test.listIterator(); while(test1.hasNaxt()){ System.out.println(test1.next()); } while(test1.hasPrevious()){ System.out.println(test.previous()); } 二、基于链表的集合 LinkedList 方法(与 ArrayList 相似)特有方法: ① 插入到此列表的开头 addFirst(E e); ② 获取但不移除第一个元素 element()、peek() ③ 获取并移除第一个元素 poll(); ④ 弹出第一个元素 pop(); Vector List中的集合 Collections Collection 中的工具类 三、 HashSet 无序,无重复的集合 以hashCode()与equals()方法判断是否相同 一般来说要覆写Object中的hashCode()与equals()方法 四、 TreeSet 自动排序, 自然排序:对象类实现 Comparable 接口,覆写compareTo() 定制排序:写一个比较类,实现 Comparator 接口,覆写compare() 并在创建 TreeSet 对象时,调用构造方法 五、集合(Collection 体系) 六、 Map Map 中不能有重复的键 |---HashMap 判断重复的标准和HashSet一致,通过键的hashcode和equals; |---TreeMap 判断重复的标准和TreeSet一致,1通过自然排序(Comparable接口),2定制排序(Compartor比较器) ① 添加 put();如果key相同,value值使用最新的值替换老值. ② 是否包含指定的键 containsKey() ③ 是否包含指定的值 containsValue() ④ 返回指定键的值,返回Collection get(); ⑤ 将一个 Map 添加到现有的 Map 中去 putAll() ⑥ 通过键删除元素 remove() ⑦ 返回 Set entrySet() ⑧ 返回Map当中所有的key,存储到一个Set集合当中。 keySet() ⑨ 返回所有的values,存储到一个Collection。 values() 遍历方式: 方式一: ①通过keySet方法取到所有key ②然后遍历keySet,依次通过key来查找value。 通过Object get(Object key)方法; 方式二: ①先得到所有的Entry对象,Entry对象就包装了key,values, ②遍历Entry对象的集合,然后依次从Entry对象中调用方法: getKey(),getValue() 七、 Collections 工具类 IO流 一、 File 类 常用方法: ① 是否是一个目录 boolean isDirectory() ② 是否是一个文件 boolean isFile() ③ 文件或目录是否存在 boolean exists() ④ 列出可用的文件系统根(操作系统上面的盘符) static File[] listRoots() ⑤ 文件夹中所有的文件(文件夹)的名字 String[] list() ⑥ 文件夹中所有的文件(文件夹)的名字(File对象的形式) File[] listFiles() --------------以下是带有过滤效果的方法-------------------------- ⑦ String[] list(FilenameFilter filter) ⑧ File[] listFiles(FileFilter filter) ⑨ File[] listFiles(FilenameFilter filter) 二、四大IO抽象类 字节流 字符流 关键方法 输入流 InputStream Reader read() 输出流 OutputStream Writer write() 三、 FileInputStream 文件输入流 构造方法: FileInputStream(File file) 表示从file指向的文件中读取 FileInputStream(String name) name表示文件的路径名(路径+文件名) 读取的方法: int read() 调用一次读到一个数据字节,返回的int值就是读到的数据 int read(byte[] b) 读到的内容保存传入的byte数组b中,返回的是本次调用方法读到的数据字节个数 InputStream test = new FileInputStream("D:/a"); byte[] by = new byte[5]; int len; while((len=test.read(by)) != -1){ System.out.print(new String(by,0,len)); } 四、字节流与字符流之间的转换 字节流转字符流: InputStreamReader 字符流转字节流: OutputStreamWriter 五、IO流中的异常处理 自动关闭IO流(java7开始) try( 打开流的语句 InputStream is = new FileInputStream(); ){ 操作语句 }catch(Exception e){ 处理问题 } 六、内存流 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter 内存流关闭close()方法无效 ByteArrayOutputStream bos = new ByteArrayOutputStream(); bos.write("你好".getBytes()); byte[] arr = bos.toByteArray(); ByteArrayInputStream bis = new ByteArrayInputStream(buf); 七、缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter ① BufferedReader 一次读一行的方法 String readLine(); 如果没有数据,返回 null ② BufferedReader 一个行分隔符的方法 void newLine(); BufferedReader test = new BufferedReader("D:/a.txt"); String line; while((line=br.readLine()) != null){ System.out.println(line); } 八、打印流 PrintStream 字节打印流 PrintWriter 字符打印流 可以输出任何数据 PrintStream test = new PrintStream("D:/1.txt"); test.println(123); test.println("adfasdfwere"); test.println(true); ① 标准输入输出流 a) System.out 是一个特殊的 PrintStream “标准”输出流 : 输出结果到控制台 b) System.err 是一个特殊的 PrintStream "标准"错误输出流 : 输出到控制台,在Eclipse中显示红色的 c) System.in 是一个特殊的InputStream "标准"输入流 : 数据源来至控制台输入 重定向:写在所有输出语句之前 System.setOut(new PrintStream("D:/1.txt")); 九、文本扫描器 Scanner 相当于一个输入流 没有拓展至IO流的4个基本的抽象类,实现了 Iterator(迭代器)接口 仅仅从一个字符串中读取: Scanner(String source) next() hasNext() 以空格为分隔符 nextLine() hasNextLine() ① Scanner test = new Scanner(new File("D:/1.txt")); while(test.hasNextLine()){ System.out.println(test.nextLine()); } ② Scanner test = new Scanner(System.in); System.out.println(test.next()); ③ Scanner test = new Scanner("中华人民共和国"); 正则表达式:"[0-9]" 十、对象流 ObjectInputStream Object readObject(); ObjectOutputStream void WriteObject(Object obj); 使用对象流必须是实现了 Serializable 接口的 十一、随机访问文件 RandomAccessFile 同时具有读取和写入 RandomAccessFile(File file, String mode) RandomAccessFile(String name, String mode) mode 指定是模式 : 读r 或者 写w 或者读写rm 重要方法: long getFilePointer() 获得偏移量 void seek(long pos) 设置文件指针 long length() 返回此文件的长度 void setLength(long newLength) 设置此文件的长度 正则表达式: ① "abc" ② [0-9] [a-z] [3578] ③ [0-9]{11} 表示任意的11位数字 [0-9]{6,18} 表示一个范围 网络编程: InetAddress 类表示IP地址 |--Inet4Address |--Inet6Address static InetAddress getLocalHost() 返回本地主机 static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址 查找局部网内部存在的一个IP地址,如果没有知道到跑出异常 static InetAddress getByAddress(byte[] addr) 根据一个ip地址获得一个IP地址对象,没有进行查找的 static InetAddress getByAddress(String host, byte[] addr) 根据提供的主机名和 IP 地址创建 InetAddress。 static InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。 byte[] getAddress() 返回此 InetAddress 对象的原始 IP 地址 boolean isReachable(int timeout)测试是否可以达到该地址 URL: URL(String protocol, String host, int port, String file); 方法: InputStream openStream() 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 URI toURI() 返回与此 URL 等效的 URI TCP: Socket ServerSocket HTML 源代码官网 超链接 图片
  • 无序列表
    1. 有序列表
      自定义列表
      表格 colspan : 跨列 跨n列 rowspan : 跨行 跨n行
      表单 输入框 类型 名称 特点 text 普通文本框 password 密码框 内容显示为*号 submit 提交按钮 点击后就提示表单 button 普通按钮 reset 重置按钮 回到最初状态(注:不是清空) radio 单选 一组单选必需name相同 checkbox 多选 一组多选必需name相同 file 附件 可以选择文件进行提交 hidden 隐藏域 不显示控件;这个在以后做数据修改时会有用 image 图片按钮 必需配合src属性来展示 多行文本域 style="resize:none" 不可拖动大小 下拉框: CSS style Java Script function login(){ //获得输入框中的值 var username = document.getElementById("username").value; //判断是否是字母和数字组成 var str = /^[0-9a-zA-Z]*$/; if(username.trim().length == 0){} //手动提交 document.getElementById("form").submit(); }
      反射: 一、获得Class类的实例 普通类: ① 对象.getClass() ② 类名.class ③ Class.forName(全限定名); 八种基本类型(以 int 为例): ① int.class ② Integer.TYPE 数组(以 String[]为例): ① String[].class 创建无参对象:Class实例.newInstance(); 二、获得构造方法 Constructor con = Class实例.getConstructor(参数类型.class); getDeclaredConstructor(参数类型.class); 创建对象: con.newInstance(实参); 三、获得方法 Method me = Class实例.getMethod(对象,参数类型.class); getDeclaredMethod(对象,参数类型.class); 设置访问权限: me.setAccessible(true); 调用方法: me.invoke(对象,new Object[]{实参}); 静态方法调用对象可以传入 null 传入的实参用Object的数组包装起来 四、工具类 工具类取名(XxxUtil/XxxUtils,XxxHelper,XxxTools) 写工具类的两种方式: 第一种:使用静态方式 第二种:使用单例 五、properties 配置文件 创建一个ProPerties对象 Properties pro1 = new Properties(); 得到key.properties文件的内容 pro1.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("key.properties")); 获取打印password String password = pro1.getProperty("password"); 注释 @Target 使用范围 CONSTRUCTOR 构造方法 FLELD 字段 LOCAL_VARIABLE 局部变量 METHOD 方法 RACKAGE 包 PARAMETER 参数 TYPE 类、接口、枚举 @Retention 生命存在范围 SOURCE 只保留在编译期,不会写入class文件 CLASS 会写入class文件中,不会加载到JVM RUNTIME 会加载到JVM中,可以通过反射得到(最常用到) @Documented 文档 @Inherited 继承 一、自定义注解 @Retention(RetentionPolicy.RUNTIME) //加载到JVM中还保留 @Target({ TYPE,METHOD })//存在于类、方法中等 public @interface Vip { String value() default "vvv"; } Junit4.X 测试 类 > new > Junit test case 断言: assertEquals(断言失败的提示信息,断言的值,方法返回值); assertTrue(方法返回值);断言结果为true XML Node Document Element Attr Text 一、API 文件全部加载,读大文件时慢 1.拿到document对象 File file = new File(""); DocumentBuilderFactory factory = DocumentBuilderFactory.new Instance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(file); 2.同步doc对象 TransformerFactory factory = TransformerFactory.newInstance(); Transformer former = factory.newTransformer(); Source source = new DOMSource(doc); Result result = new StreamResult(file); former.transform(source,result); 二、Dom4J 只加载当前那一层Node,缺点:必须一层一层的拿对象 1.拿到document对象 File file = new File(""); SAXReader reader = new SAXReader(); Document doc = reader.read(file); 2.同步doc对象 FileWriter out = new FileWriter(file); doc.write(out); out.close(); 数据库: 一、数据库的操作 show databases 查看所有数据库 use database ** 选择数据库 create database ** 创建数据库 drop database ** 删除数据库 show tables 查看所有表 create table **(id char(*),name int(*) auto_); desc ** 查看表结构 show create table ** 查看表的详细定义 drop table ** 删除表 二、表的查询 单表查询 select * from ** 查看表中所有数据 select distinct * from ** 避免重复数据 select *,字段*字段 别名 from ** 数学运算查询 select concat(**,'adfas',**) from ** 设置显示格式 比较运算符( >、<、=、<=、>=、!=(<>) ) select * from ** where * > 123; 逻辑运算符(and(&&)、or(||)、not(!)) select * from ** where *>123 and *<200; 优先级规则 from >> where >> group by >> select >> having >> order by 范围查询 between * and * select * from ** where ** between 100 and 123; 集合查询 in select * from ** where ** in(1,2,3); 空值查询 is null select * from ** where ** is null; 模糊查询 like %(任意值) _(单个字符) select * from ** where ** like '%M%'; 结果排序 order by asc(升序) desc(降序) select * from ** where ** order by desc; 分页查询 limit 3,3; select * from ** where ** limit (n-1)*s; 聚集函数 count(次数) avg(平均) sum min max select count(*) from ** ; 分组 group by 分组一般和聚集一起使用 select count(*) from ** group by **; 分组后查询 having select count(*) from ** group by ** having 条件; 多表查询 外键约束 select * from ** join ** on ** select * from ** join ** using (**) select * from **,** where ** 内连接 A表的一个字段与B表的主键关连 外连接 左外连接 将左边的表数据全部查询出来 left join ** on ** 右外连接 将右边的表数据全部查询出来 right join ** on ** 自连接 表中有一个字段存储了此表的主键 子查询 查询语句中包含另一个查询语句 select * from ** where select ** from ** where **; select * from ** where (**,**) = (select ** from ** where **); 二、操作数据 1.插入数据 insert into 表 (字段,字段) values (值,值) where ** insert into 表 * values (值,值) where ** insert into 表 (字段,字段) values (select ** from **) insert into 表 (字段,字段) values (**),(**),(**) 插入多条 2.修改数据 update 表 set 字段 = 值 where ** update 表 set 字段 = 值,字段 = 值,字段 = 值 where ** 3.删除数据 delete from 表 where ** 三、数据备份和恢复 四、索引 JDBC : 一、 加载驱动 Class.forName("com.mysql.jdbc.Driver"); 连接数据库 Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbcwork","root","123456"); 得到语句对象 推荐第一种,速度快 ① PreparedStatement pst = con.prepareStatement(sql); String sql = "select * from where id = ?"; pst.set***(1,"**"); ② Statement st = con.createStatement(); 执行语句 ① 增、删、改 ResultSet rs = pst.executeUpdate(); ② 查 ResultSet rs = pst.executeQuery(); 得到结果 while(rs.next()){ rs.getStirng***("username"); } 关闭连接 rs.close(); pst.close(); con.close(); 二、登录方式 ① 同时查询 username 和 password ,不知道是用户名还是密码错误 String sql = "select * from user where username = ? and password = ?"; if(rs.next()){ System.out.println("登录成功"); }else{ System.out.println("登录失败"); } ② 查询 username 得到 password 再比较,可以知道用户名或密码错误,用户体验更好 三、事务 转账的案例 //取消自动提交,写在事务语句之前 con.setAutoCommit(false); //手动提交资源,写在事务语句之后 con.commit(); //回滚,写在 catch 中 con.rollback(); 四、拿到主键 ① PreparedStatement pst = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); ResultSet rs = pst.getGeneratedKeys(); while(rs.next()){ rs.getLong(1); } 五、连接池 导入两个jar: commons-dbcp-1.3.jar commons-pool-1.5.6.jar 查阅文档: commons-dbcp-1.3-src\doc\BasicDataSourceExample.java(例子) javaweb servlet BS:浏览器/服务器 CS:客户端/服务器 一、常见的服务器: Tomcat、IIS、红帽、Jboss 二、项目的基本结构: |--day11 项目名 |--webapps 可以随便写,但是建议取这个名字 |--WEB-INF 在此文件夹中的数据不能直接访问 |--classes 放class文件的地方,记得修改路径 |--lib 放jar包 |--web.xml 配置文件,从Tomcat中复制 |--index.html 页面文件 三、创建项目的步骤: ① 创建一个项目包 ② 修改项目编码 :项目右键-properties-Resource ③ 照着项目的基本结构写 ④ 修改class文件位置:项目右键-BuildPath-ConfigureBuildPath-Browse选择classes-OK ⑤ 修改Tomcat配置文件:conf-server.xml 将webapps的路径配置到文件中 四、Tomcat配置的三种方式: ① 将项目直接拷贝到webapps中 ② 配置conf-server.xml文件,添加一句 ③ 在\conf\Catalina\localhost文件夹中创建一个xml文件,文件名为path中的值(上下文路径)文件中的内容 五、配置eclipse window-Preferenes: Version 7.x Browse: tomcat 路径(bin上面那个) 六、创建运行一个Servlet 1、拷贝jar包 servlet-api.jar 2、实现 Servlet接口 3、配置web.xml文件 每一个Servlet都需要单独配置 hello cn.itsource.word.LoginServlet hello /login 4、运行Servlet http://ip地址[:端口]/上下文路径/暴露的路径 上下文路径:server.xml -> Context -> path路径 暴露的路径:web.xml -> servlet-mapping-> url-pattern 5、ServletConfig(初始信息) getServletContext() : 获取上下文对象(先不管) getServletName() : 拿到当前Servlet的名字 getInitParameter(String name) :根据名字拿到初始化的信息 getInitParameterNames() :拿到初始化信息的所有名字 6、HttpServlet ① doGet中调用doPost,或doPost中调用doGet ② 直接覆写serice方法 7、HttpServletRequest 常用方法: String getContextPath():获取上下文路径, String getHeader(String headName):根据指定的请求头获取对应的请求头的值. String getRequestURI():返回当期请求的资源名称. 上下文路径/资源名 StringBuffer getRequestURL():返回浏览器地址栏的内容 String getRemoteAddr():返回请求服务器的客户端的IP 重要(非常重要): String getParameter(String name):根据参数名称,获取对应参数的值. String[] getParameterValues(String name):根据参数名称,获取该参数的多个值. Enumeration getParameterNames():获取所有请求参数的名字 Map getParameterMap():返回请求参数组成的Map集合. key:参数名称 value:参数值,封装在String数组中. 8、HttpServletResponse OutputStream out = resp.getOutputStream(); 获取字节输出流(以后做上传下载的时候使用) PrintWriter out = resp.getWriter(); 获取字符输出流 处理乱码问题(有三种方式): 请求: 第一种:request.setCharacterEncoding("UTF-8"); 只支持POST请求 第二种:修改tomcat配置文件,端口那个位置,加上URIEncoding="UTF-8" 只支持GET请求 第三种:先通过ISO-8859-1解码,再通过UTF-8编码 String name = new String(乱码的字符串.getBytes("ISO-8859-1"),"UTF-8"); GET与POST都支持 第一种与第二种可以结合使用(都支持了) 第一种与第三种也可以结合使用 响应: resp.setContentType("text/html;charset=UTF-8"); Servlet 配置 web.xml中的 可以有多个 也可以有多个name相同的 通配符: ① /servlet/ * 以servlet开头的路径都会访问此servlet ② / * 所有页面都可以访问这个Sevlet ③ *.servlet 以servlet结尾的路径都会访问此servlet 不能用conf web.xml中用过的路径,否则找不到servlet 注解配置: web.xml中:metadata-complete="false" 写在类上面 @WebSession("/servlet"); @Websession({"/a","/b"}); 9、Cookie 是浏览器的技术,由服务端创建,保存到浏览器中 存在时间可以设置: cookie.setMaxAge(秒);>0;<0存在浏览器进程中,=0表示删除 ① 缺点: 个数有限制,一个浏览器300个,一个服务器20个,大小在4kb内 不安全,保存在客户端的文件中 只能保存字符串 不支持中文,需要在创建时编码,接收时解码 编码 String name = URLEncoder.encoder(str,"UTF-8"); 解码 String name = URLDecoder.decoder(str,"UTF-8"); ② Cookie 操作 创建: Cookie cookie = new Cookie(name,value); 修改: cookie.setvalue(value); 创建和修改后要保存到浏览器中:request.addCookie(cookie); 删除: cookie.setMaxAge(0); 得到: Cookie[] cookies = request.getCookies(); for(Cookie cookie : cookies){ if("".equels(cookie.getName())){ str = cookie.getvalue(); } } 设置路径(默认上一层目录下): cookie.setPath("/"); cookie.setPath("/cookie"); cookie.setPath("*/cookie"); 10、Session HttpSession 是服务端的技术,保存在服务端,自动生成一个地址放到Cookie中 可以保存对象,但关闭浏览器就消失了 创建、得到: HttpSession session = request.getSession(); 添加修改值:session.setAttribute(name,value); 删除值: session.removeAttribute(name); 不请求后默认30分钟(一般20分钟)清除,可以设置 session.setMaxInactiveInterval(分钟); 当浏览器Cookie被禁用后,URL重写可以解决问题 得到session地址: String url = response.encodeURL("/session/list"); 跳转的地址:"/list?jsessionid="+url; 11、Servlet 三大职责 ① 接收封装数据 ② 调用业务层处理请求 ③ 跳转 12、Servlet 跳转 ① 请求转发 Forward req.getRequestDispatcher("/forward/b").forward(req, resp); 1.地址不变 2.可以访问WEB-INF中的内容(重要) 3.显示最终结果 4.只发送一个请求 5.共享同一个请求,共享数据(重要) 6.不能跨域访问(重要) ② 重定向 Redirect resp.sendRedirect("/counter.jsp"); 1.地址会变,相当于重新输入一个地址 2.不可以访问WEB-INF中的内容 3.显示最终结果 4.发送多个请求 5.不共享数据 6.能跨域访问 ③ 请求包含 include req.getRequestDispatcher(String path).include(request, response); 显示多个结果,包含关系 13、四大作用域对象 ① pageContext(page) PageContext 一个页面 ② request HttpServletRequest 一次请求 ③ session HttpSession 一次会话(浏览器) ④ application ServletContext 服务器关闭 操作: 添加修改: 作用域对象.setAttribute(name,value); 获取:作用域对象.getAttribute(name); 删除:作用域对象.removeAttribute(name); 14、ServletContext //第一种:父类提供:工具类用不到 ServletContext app1 = super.getServletContext(); //第二种:从ServletConfig中去拿 ServletContext app2 = super.getServletConfig().getServletContext(); //第三种:从request对象中去获取:不兼容低版本 ServletContext app3 =req.getServletContext(); //第四种:从session中去获取 ServletContext app4 = req.getSession().getServletContext(); //拿到全局配置初始化参数(查看下面的web.xml配置) encoding UTF-8 String encoding = servletContet.getInitParameter("encoding"); 下面两种方式的区别: request.getParameter(String name); ://获取用户输入的参数信息 request.getAtribute(String name); : //获取开发人员设置的共享信息 它们的区别: ServletConfig对象.getInitParameter(String name); //当前servlet的初始值 ServletContext对象.getInitParameter(String name); //全局初始值 JSP jsp是java动态网页语言,是以html为主+java程序,jsp其实就是Servlet <%-- 注释 --%> <% java代码 %> <%=表达式 %> <%! 定义类成员 %> ① jsp 三大指令 page: 定义JSP页面的各种属性 include:(静态包含指令,开发中能用静的不用动的) taglib: 引入外部的标签(属于后面的内容) Page指令 language="java" contentType="text/html; charset=UTF-8" errorPage="/myerror.jsp" :如果当前页面出错,就跳转到对应的页面 isErrorPage:指示当前页面是否产生Exception对象。 扩展:配置全局错误跳转页面 java.lang.Exception /error.jsp 404 /404.jsp ① jsp 九大内置对象 内置对象 数据类型 描述 pageContext PageContext 当前JSP作用域对象. request HttpServletRequest 请求对象 session HttpSession 会话对象必须设置JSP: session="true". application ServletContext 当前应用对象 response HttpServletResponse 响应对象 config ServletConfig 当前JSP的配置对象 out JspWriter 输出流对象 page Object 当前JSP/Servlet对象,没有实际意义. exception Throwable 异常对象,必须设置当前JSP. isErrorPage="true" ② 静态包含 先合并: <%@ include file="被包含文件"%> 动态包含 先翻译: javabean 按照一定规范具有公共无参的构造类方法的Java类 ①Javabean的规范 类是公共的由public修饰 类中所有的字段必须封装 private 修饰提供 必须为字段提供getter setter 方法 ②JavaBean的属性(重要) 属性以方法的形式出现(setter,getter) Getter与Setter只要有一个,这个属性就存在 一个类只有Getter/Setter方法,没有相应的字段,它也是一个属性 例:String getName() -> 属性就是name setSex(Boolean sex) -> 属性就是sex ③Java的自省机制:这个javaBean去拿到自己的方法,属性等(主要就是拿属性) 拿到属性: 示例代码:(注意:后面一个参数是断点,到这个类的时候就不继续向上找了-不包含自己) 拿到属性描述器: BeanInfo userBean = Introspector.getBeanInfo(User.class,Object.class); PropertyDescriptor[] pds = userBean.getPropertyDescriptors(); for (PropertyDescriptor pd : pds) { //System.out.println(pd); //拿到属性的名称 System.out.println(pd.getName()); //拿到属性的可读方法 System.out.println(pd.getReadMethod()); //拿到属性的可写方法 System.out.println(pd.getWriteMethod()); } ④BeanUtil:主要用于复制属性 使用BeanUtil先要倒包 commons-beanutils-1.9.2.jar :JavaBean的工具包 commons-logging-1.2.jar :日志包(依赖包) commons-collections-3.1.jar : 集合工具包(依赖包) a.相同的类型的复制(属性) BeanUtils.copyProperties(user1, user2) b.不同类型的复制(属性) BeanUtils.copyProperties(user, student) c.将map的值复制到对象上面: BeanUtils.copyProperties(String 目标对象, String 原对象); EL表达式 ①到四个作用域中去拿值 ②语法:${xxx} ③查找作用域值的顺序是由小到大 : pageContext -> request->session->application ④想要确定拿到某一个作用域里的值:pageScope/requestScope/sessionScope/applicationScope 例:${sessionScope.msg} ${sessionScope["msg"]} ⑤命令规范:XX_IN_SESSION 例 KEY_IN_SESSION/KEY_IN_APP ⑥调用JavaBean 例: ${user.name} 就是用户的名称(去调用的就是getName()方法 ) ⑦el在tomcat7.0之后才可以执行方法 ⑧条件运算符:${student.sex?"男":"女"}三目运算 EL的使用细节: ①拿到上下文路径 ****=${pageContext.request.contextPa ### 解决修改超链接路径时,逐一更改的尴尬局面 ②特殊的Key处理 session.setAttribute("KEY.IN.SESSION", "你是session"); 错误写法: ${KEY.IN.SESSION} 正确写法:${sessionScope["KEY.IN.SESSION"]} 注意:[]与.是一样的效果 ③判断为空 ${empty user.name} 结果为 true false 作用:可以判断是否存在该属性 可以判断该属性对应的集合是否为空 三.JSTL标签库 JSTL:标准标签库,用于消除JSP页面上的Java代码 由标签库与EL表达式组成 ①使用JSTL 第一步:导入jstl的jar包 在tomcat中的example例子中找这两个包 standard.jar/jstl.jar 这两个包都必需导入 第二步:使用taglib引入标签库 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 可以直接用Alt+/ 提醒输入属性里面的值 prefix这名称注意,规范要求都是:c ②if条件标签 :用于条件判断,使用格式: if的使用案例: <% Integer age = 69; request.setAttribute("age", age); %> 好好培养,以后来学JAVA!!! 来学Java吧,我看好你!!!! Java已经不适合你了,你还有子孙... ③choose,when,otherwise的使用 哈哈哈。。。 呵呵呵。。。 啦啦啦。。。 ④foreach的使用 begin:从几开始 end:到几结束(包含) step:每次循环的步长 var:给变量取的名称 第一种: ${i} items:要遍历的集合是一个EL表达式 varStatus:当前遍历的一个状态(当前是第几个了) var:给变量取的名称 第二种: ${stu.name}|${stu.age}|${stu.sex }
      ⑤JSTL转换日期的方法 引入标签:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 放入作用域: <% Date date = new Date(); request.setAttribute("date",date); %> JSTL转换: MVC模式的认识 MVC (Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式 M(Model):模型 - > JavaBean V(View):视图 -> JSP(html) C(Controller):控制器 -> Servlet 经典的MVC模式:JSP+JavaBean+Servlet

      下载文档到电脑,查找使用更方便

      文档的实际排版效果,会与网站的显示效果略有不同!!

      需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

      下载文档