文章标题

来源:互联网 发布:base64decoder 源码 编辑:程序博客网 时间:2024/05/19 21:17

JavaWeb基础

第一天:

1.Eclipse详解:

(1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合。高的JRE版本兼容低版本的编译器版本。

(2).当程序有错误的时候,使用Debug as 运行程序。双击语句设置断点。程序运行到此处停止。点击跳入方法的内部代码。点击跳过,执行下一条代码,点击跳出,跳出方法。观察变量的值,选中变量右击选择watch. 跳入下一个断点。查看断点,调试完后一定要清除断点。结束运行断点的jvm.

2.HashSet和hashCode和equals方法

java系统首先调用对象的hashCode()方法获得该对象的哈希吗,然后根据哈希吗找到相应的存储区域,最后取出该存储区域内的每个元素与该元素进行比较.两个equals相等,hashCode()相等。需要重写equals,hashCode()方法.更改数据的值,hashCode()的值也更改了,并未删除.内存泄露.有个东西不在被用,但是未被删除,导致内存泄露.

3.Junit测试框架

(1).在测试类,方法前加注解:@Test,不然出现初始化异常。

(2).方法before,after前加@Before,@After注解。在测试方法之前和之后运行方法。

(3).静态方法beforeClass,afterClass方法前加上注解@BeforeClass,@AfterClass,类加载的时候运行

(4).Assert断言。判断两个对象是否相等。期望值和实际值相等。

4.得到配置文件的路径

通过类加载器 reflect.class.getClassLoader.getResourceAsStream();在class指定目录下查找指定的类文件进行加载.编译器把src中的.java文件编译成class文件,所有非.java文件,原封不动的搬过去.但是这种方法是只读的.
通过类的信息reflect.class.getResourceAsStream();相对路径
一般用绝对路径,使用配置文件告诉用户路径.
一定要记住要用完整的路径,但是完整的路径不是硬编码的,是计算出来的.

5.反射

(1).反射主要用于框架开发

(2).一个类有多个组成部分,例如:成员变量,方法,构造方法等,反射就是加载类,并解析类的各个组成部分。

(3).加载类使用Class.forName()静态方法,给类的完整名称,包名和类名。

(4).Class提供了解析public的构造方法,方法,字段等方法以及private。字段封装数据,方法执行功能

(5).静态方法无需传递对象,method.invoke()

(6).升级时保持兼容性,main函数的解析有点麻烦,反射解析数组参变量的时候的问题。启动Java程序的main方法的参数是一个字符串数组,即public static void main(String[] args),通过反射方式来调用这个main方法时,如何为invoke方法传递参数呢?按照jdk1.5的语法,整个数组是一个参数,而按照jdk1.4的语法,数组中的每个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会到底按照哪种语法进行处理呢?jdk1.5肯定要兼容jdk1.4的语法,会按jdk1.4的语法进行处理,即把数组打散成若干个单独的参数。所以,在给main方法传递参数时,不能使用代码mainMethod.invoke(null,newString[]{“xxx”}),javac只把它当做jdk1.4的语法进行理解,而不把它当做jdk1.5的语法解释,因此会出现参数类型不对的问题。解决的方法:
mainMethod.invoke(null,newObject[]{new String[]{“xxx”}});
mainMethod.invoke(null,(Object)newString[]{“xxx”});编译器会做特殊处理,编译时不把参数当做数组看待,也就不会把数组打散成若干个参数了.

(7).对数组进行反射:相同的维数(不是数组元素的个数,例如都是一维数组,不关心数组的大小),相同的8种基本数据类型时数组有相同的字节码.

6. 泛型

(1).泛型是对象类型,不能是基本类型,泛型存在源代码级别上,给编译器看的,生成class文件就不存在泛型了

(2).参数类型变量,实际类型变量,泛型类型,参数化的类型

(3).自定义泛型方法:public void method(T args){};public

7.可变参数

(1).可变参数就看成数组,可以使用增强for循环

(2).可变参数列表为最后一个参数

(3).可以给可变参数传递一个数组

(4).可变参数的类型是基本类型还是对象类型

8.课程介绍

(1).在谷歌心目中,“云”必须具备以下条件:数据都存在网上,而非终端里,软件最终消失,只要你的“云”设备拥有浏览器就可以运行现在的一切,“云”时代的互联网终端设备将不仅仅是PC,手机,汽车,甚至手表,只要有简单的操作系统加个浏览器就完全可以实现,由于数据都在“云”端,企业的IT管理越来越简单,企业和个人用户也不同在担心病毒,数据丢失等问题。

(2).李开复描述了这样一个场景,只要你的PC或手机等终端里安装了一个简单的操作系统和完整功能的浏览器,开机后输入自己的用户名和密码,你存在“云”中的应用软件和数据就会同步到终端里。

9.快捷键

(1).配置快捷键:window->preferences->key
(2).Alt+/ :内容提示
Ctrl+1 :快速修复
Ctrl+Shift+O :快速导入包
Ctrl+Shift+F :格式化代码
Alt+方向键 :跟踪代码
Ctrl+Shift+/ :添加注释
Ctrl+Shift+\ :取消注释
Ctrl+Shift+X :更改为大写
Ctrl+Shift+Y :更改为小写
Ctrl+Shift+向下键 :复制代码
Ctrl+Shift+向上,向下 :改变代码行的顺序
Ctrl+T :查看继承关系
Ctrl+Shift+T :查看源代码
Ctrl+Shift+L :查看所有的快捷键

10.类加载器及其委托机制的深入分析

(1).Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader

(2).类加载器也是Java类,因为其他java类的加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这正是BootStrap(内嵌到JVM的内核中,使用C++语言编写的)

(3).Java虚拟机中的所有类装载器采用具有父子关系的属性结构进行组织,在实例化每个类转载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载器
(4).
public class ClassLoaderTest{
public static void main(String[] args){
System.out.println(ClassLoaderTest.class.getClassLoader().getClass().getName());
//输出为sun.misc.Lanuncher$AppClassLoader;
System.out.println(System.class.getClassLoader());
//输出为null,因为类System是由BootStrap加载的;
}
}

(5).BootStrap->ExtClassLoader->AppClassLoader
ClassLoader loader= ClassLoaderTest.class.getClassLoader();
while(loader!=null){
System.out.println(loader.getClass().getName());
loader = loader.getParent();//往上顺序打印
}
System.out.println(loader);//最后打印老祖宗

(6).
BootStrap——>JRE/lib/rt.jar
ExtClassLoader—–>JRE/lib/ext/*.jar
AppClassLoader——>ClassPath指定的所有jar或目录
用Eclipse的打包工具将ClassLoaderTest打包成itcast.jar,然后放在jre/lib/ext目录下,在eclipse中运行这个类,运行结果显示为ExtClassLoader,此时的环境状态是classpath目录有ClassLoaderTest.class,ext/itcast.jar包中也有ClassLoaderTest.class,这时我们在打印ClassLoaderTest类的类加载名称,发现是ExtClassLoader,而不是AppClassLoader.

(7).类加载的委托机制:
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢:
首先当前线程的类加载器去加载线程中的第一个类
如果类A中引用了类B,Java虚拟机将使用加载类A的类加载器来加载类B
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类
每个类加载器加载类时,又先委托给其上级类加载器
当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即使有,那么多个儿子,找哪一个呢?
对着类加载器的层次结构图和委托加载原理

(8).Thread类有一个方法setContextClassLoader(ClassLoader classLoader)//加载当前的类.

(9).每个类加载都首先会委托送到BootStrap,那么BootStrap很累,这样,那为什么不多搞几个BootStrap呢,之所以不这样做,是因为,便于统一管理,因为所有的类都会找BootStrap,可能这时有几个相同的类进行加载,那么BootStrap,不会多次将他们的class文件加载内存中,只会加载一份即可.这样效率就高了.

(10).
public class MyClassLoader{
public static void main(String[]args){
String srcPath=args[0];
String destDir=args[1];//得到目录
String destFileName =srcPath.substring(srcPath.lastIndexOf(‘/’)+1);//得到文件名
String destFilePath=destDir+”\”+destFileName;
FileInputStream fis = newFileInputStream(srcPath);
FileOutputStream fos=new FileOutputStream(destPath);
cypher(fis,fos);
fis.close();
fos.close();
}
private static void cyp(InputStreamips,OutputStream ops){
int b =-1;
while((b=ips.read())!=-1){
ops.write(b^0xff);//对内容进行异或处理
}
}
}
class ClassLoader extends Date{
public String toString(){
return “hello,itcast”;
}
}
args[0]:ClassLoader.class的绝对路径
args[1]:itcastlib
有包名的类不能调用无包名的类.

(11).编写自己的类加载器:
知识讲解:
自定义的类加载器必须继承ClassLoader(抽象类)
覆盖findClass方法
defineClass方法:得到class文件转换成字节码
编程步棸:
编写一个文件内容进行简单加密的程序
编写了一个自己的类加载器,可实现对加密过的类进行装载和解密
编写一个程序调用类加载器加载类,在源程序中不能用该类名定义引用变量,因为编译器无法识别这个类,程序中可以出了使用ClassLoader.load方法之外,还可以使用设置线程的上下文类加载器或者系统类加载器,然后再使用Class.forName

(12).
模板设计模式:
父类—>loadClass(相同的)
子类1(自己干的)
子类2(自己干的)
覆盖findClass方法(自己干)

(13).
public class MyClassLoader extendsClassLoader{
public MyClassLoader(){
}
public MyClassLoader(String classDir){
this.classDir = classDir;
}
@Override
protected Class

11. 枚举

(1).枚举的作用限定指定的值,没有枚举前设计一个类,将构造函数设置成私有的,变量设置成静态常量

(2).枚举可以有构造函数(私有的),字段,方法

(3).可以定义set,get方法,获取变量的值。
(4).带有抽象方法的枚举,不能new出新的对象了。在new对象的时候就重写抽象方法,使用匿名内部类

(5).枚举中的每个枚举值代表枚举类的一个对象。

(6).枚举也可以实现接口,或继承抽象类

(7).JDK5中的switch拓展为除了接受int,short,char,byte外,也可以接受枚举类型。

(8).枚举的方法,name,ordial,valueOf,将字符串转换成枚举值。表单提交数据的时候。values返回枚举的所有的枚举值

12.内省

(1).内省:Introspector,专门操作Bean的属性。

(2).Bean的属性:只有字段提供了set/get方法,就是属性。只要有get/set的方法,就有一个属性,所以属性是有get/set方法决定的

(3).任何类都继承了Object类,又因为Object中有一个class属性

(4).内省的入口类:Introspector,方法getPropertyDescriptors()获取Bean的属性

(5).操作Bean的指定属性

(6).BeanUtils框架操作Bean

(7).在工程中新建一个文件夹,将架包复制到文件夹中,还需另外的架包loging,选中架包,右击build path加入到工程的环境中

(8).BeanUtils使用方便,类型自动转化,只支持8中基本数据类型

(9).给BeanUtils注册类型转换器,ConvertUtils.register()

(10).将Map中的数据整合到对象中,BeanUtils.populate()方法

13.配置Java模板代码
window->preferences->java->Editor->Template:编辑模板代码:line_selection,光标cursor,右击选择source with

14.享元模式
相同的对象只实例化一个,实例:桌面上的图标,word中字符,有很多小的对象,有很多相同的属性,不同的属性叫做外部行为,相同的属性叫做内部行为integer的缓冲池

15.注解
(1).@SuppressWarning(“deprecation”)过时注解

(2).@Deprecated注解,表示该方法是否过时,架包升级时添加的注解

(3).注解相当于一种标记,通过反射了解你的类及各种元素上有无何种标记

(4).注解相当于一个类:@interface Annotation{};注解类,应用注解类的类,对应用了注解类的类进行反射操作的类

(5).AnnotationTest.class.getAnnotation(ItcastAnnotation.class)得到类AnnotationTest上的注解ItcastAnnotation,注解上使用注解叫做元注解,元数据,元信息

(6).@Retention(RetentionPolicy.RUNTIME)(保持到运行阶段),@Retention(RetentionPolicy.SOURCE)(保持在源文件阶段),@Retention(RetentionPolicy.CLASS)(保持在class文件中):源代码->class文件->(类加载)内存中的文件(字节码)

(7).@Override注解保持到SOURCE,@SuppressWarning注解保持到SOURCE,@Deprecated注解保持到RUNTIME(只有将该类调到内存中才知道该类中的方法是否过时了)

(8).@Target({ElementType.METHOD,ElementType.TYPE})注解只能标记到方法上或类,接口等类型上 (9).注解的属性:String color();类有个color属性,还有一个特殊的属性value,属性的默认值default,数组的属性值,枚举的属性值,注解的属性值
第二天:
1.dom4j解析XML文档
(1).Dom4j是一个简单、灵活的开放源代码的库,Dom4j是由早期开发JDOM的人分离出来而后独立开发的,与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的api相对要复杂一些,但是他提供了比JDOM更好的灵活性

(2).Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点,现在很多软件采用的Dom4j,例如hibernate,包括sun公司自己的JAXM也使用了Dom4j

(3).使用Dom4j开发,需要下载dom4j相应的jar文件

  1. XML语法
    (1).编写XML文档时,需要先使用文档声明,声明XML文档的类型,使用IE校验XML文档的正确性.

(2).XML文档中的”中国”保存为本地的码表的”中国”

(3).在XML文档中,空格和换行都作为原始内容被处理

(4).XML区分大小写,一个标签可以有多个属性,每个属性都有它自己的名称和取值,在XML技术中,
标签属性所代表的信息也可以被表示子标签表示

(5).XML文件中的注释采用:”

#son1{float:left;}#son2{float:left;}#son3{float:left;}

myurl

http://www.foshanshop.net

(5).表单标签checkboxlist复选框
如果集合为list





如果集合为MAP

生成如下html代码:


当然集合里面存放的也可以是对象类型

(6).单选框

6.struts2的处理流程与Action的管理方式
(1).用户请求->(查看web.xml文件)StrutsPrepareAndExecuteFilter->Interceptor(struts2内置的一些拦截器或用户自定义拦截器)->Action(用户编写的Action类,类似Struts1中的action,针对每一次请求,都创建一个Action)->Result(类似struts1中的forward)->Jsp/html(响应)

(2).StrutsPrepareAndExecuteFilter是struts2框架的核心控制器,它负责拦截由/”指定的所有用户请求,当用户请求到达时,该fileter会过滤用户的请求,默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入到struts2框架处理,否则struts2框架将略过该请求的处理,当请求转入struts2框架处理时会先经过一系列的拦截器,然后再到Action,与struts1不同,struts2对用户的每一次请求都会创建一个Action,所以struts2中的action是线程安全的.

7.XML配置方式实现对action的所有方法进行校验
(1).基于XML配置方式实现对action的所有方法进行输入校验:
使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml,其中,ActionClassName为action的简单类名,-validation为固定写法,如果Action类为cn.itcast.UserAction,那么该文件的取名应为:UserAction-validation.xml,下面是校验文件的模板:


原创粉丝点击