JavaWeb基础加强.ppt

上传人:sccc 文档编号:5598393 上传时间:2023-07-31 格式:PPT 页数:47 大小:3.92MB
返回 下载 相关 举报
JavaWeb基础加强.ppt_第1页
第1页 / 共47页
JavaWeb基础加强.ppt_第2页
第2页 / 共47页
JavaWeb基础加强.ppt_第3页
第3页 / 共47页
JavaWeb基础加强.ppt_第4页
第4页 / 共47页
JavaWeb基础加强.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《JavaWeb基础加强.ppt》由会员分享,可在线阅读,更多相关《JavaWeb基础加强.ppt(47页珍藏版)》请在三一办公上搜索。

1、北京传智播客教育,Java基础加强,方立勋,JavaEE就业班课程介绍,什么是WEB开发、WEB开发能干什么WEB涉及到的相关技术WEB开发学习需要注意的问题WEB开发、Android开发的市场行情,什么是WEB开发、WEB开发前景,Web开发简单的说,就是开发供浏览器访问的程序。换句话说,web开发就是教大家怎么做网站。,WEB涉及到的相关技术,IE,WEB服务器,Service,DAO,DB,HTTP请求,Controller,Pages,Beans,HTTP响应,Http协议Tomcat服务器Servlet技术Jsp技术HtmlCssJavaScriptJDBC技术MySQL、Oracl

2、eSQL语言JavaBean,XML技术AjaxStruts1Struts2Spring MVCDbUtilsHibernateSpring技术JBPM OA技术EJB技术.,常用开源组件:Dom4j、C3po、Dbcp、log4j、Velocity、OsCache.,Java语言,WEB学习需要注意的问题,一天一门技术,知识量太大,根本消化不过来,学后面的忘了前面的。技术是用来做东西的,做东西时能想得起来有这么一门技术能够解决这个问题,能够快速捡起来就行了。上课都听得明白,下课自己就是写不出来,没思路、一写就报错。,Eclipse的使用,工作空间(workspace)、工程(project)

3、在eclipse下Java程序的编写和运行,及java运行环境的配置。快捷键的配置,常用快捷键:内容提示:Alt+/快速修复:Ctrl+1导包:Ctrl+shift+O格式化代码块:ctrl+shift+F向前向后:Alt+方向键添加注释 Ctrl+Shift+/除去注释 Ctrl+Shift+程序的调试和运行F5(跳入)F6(跳过)F7(跳出)Junit,JDK 5.0 新特性,JDK5中新增了很多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效、清晰,安全的代码。静态导入自动装箱/拆箱增强for循环可变参数枚举泛型元数据,静态导入,静态导入用于简化程序对类静态属性和方法的调用

4、。语法:Import static 包名.类名.静态属性|静态方法|*例如:import static java.lang.System.outimport static java.lang.Math.*,Jdk5自动装箱/拆箱,自动装箱:指开发人员可以把一个基本数据类型直接赋给对应的包装类。自动拆箱:指开发人员可以把一个包装类对象直接赋给对应的基本数据类型。典型应用:List list=new ArrayList();list.add(1);int j=(Integer)list.get(0);,增强for循环,引入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需先获

5、得数组的长度或集合的迭代器,比较麻烦!JDK5中定义了一种新的语法增强for循环,以简化此类操作。增强for循环只能用在数组、或实现Iterable接口的集合类上。语法格式:for(变量类型 变量:需迭代的数组或集合),增强for循环,使用增强for循环的几个注意事项(以下程序的输出结果?),int arr=new int5;for(int num:arr)num=1;System.out.println(arr0);,List list=new ArrayList();list.add(xxx);for(String str:list)str=yyy;System.out.println(l

6、ist.get(0);,可变参数,测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组,传数组又传参的情况。注意:传入基本数据类型数组的问题。从JDK 5开始,Java 允许为方法定义长度可变的参数。语法:public void foo(int args)注意事项:调用可变参数的方法时,编译器将自动创建一个数组保存传递给方法的可变参数,因此,程序员可以在方法体中以数组的形式访问可变参数可变参数只能处于参数列表的最后,所以一个方法最多只能有一个长度可变的参数,枚举类,为什么需要枚举?一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JD

7、K5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。JDK 5新增的 enum 关键字用于定义一个枚举类。,枚举类,枚举类具有如下特性:枚举类也是一种特殊形式的Java类。枚举类中声明的每一个枚举值代表枚举类的一个实例对象。与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的(这点不难理解)。枚举类也可以实现接口、或继承抽象类。JDK5中扩展了swith语句,它除了可以接收int,byte,char,short外,还可以接收一个枚举类型。若枚举类只有一个枚举值,则可以当作单态设计模式使用。,枚举类,Java中声明的

8、枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:name()ordinal()valueof(Class enumClass,String name)values()此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。练习:请编写一个关于星期几的枚举WeekDay,要求:枚举值:MON,TUE,WED,THU,FRI,SAT,SUN 该枚举要有一个方法,调用该方法返回中文格式的星期。,反射,一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。编程时什么情况下才需要加

9、载类,并解剖出类的各个组成部分呢?,加载类,Java中有一个Class类用于代表某一个类的字节码。Class类即然代表某个类的字节码,它当然就要提供加载某个类字节码的方法:forName()。forName方法用于加载某个类的字节码到内存中,并使用class对象进行封装另外两种得到class对象的方式类名.class对象.getClass(),解剖类,Class对象提供了如下常用方法:Public Constructor getConstructor(Class.parameterTypes)Public Method getMethod(Stringname,Class.parameterT

10、ypes)Public Field getField(Stringname)publicpublic Constructor getDeclaredConstructor(Class.parameterTypes)public Method getDeclaredMethod(String name,Class.parameterTypes)public Field getDeclaredField(String name)这些方法分别用于从类中解剖出构造函数、方法和成员变量(属性)。解剖出的成员分别使用Constructor、Method、Field 对象表示。思考:假设你是一个框架的设计者

11、,解剖出这些成员后你会干什么?,利用Constructor创建对象,Constructor类提供了如下方法,用于创建类的对象:public Object newInstance(Object.initargs)initargs用于指定构造函数接收的参数练习:反射类无参、有参、私有的构造函数,创建类的对象。多学一招:sun公司为简化开发人员创建对象,它在class对象中也提供了一个newInstance方法,用于创建类的对象。这样开发人员可以避免每次都需要去反射Constructor 类以创建对象。不过需要注意的是:class.newInstance方法内部是反射类无参的构造函数创建的对象,所以

12、利用此种方式创建类对象时,类必须有一个无参的构造函数。,利用Method执行方法,Method对象提供了如下方法,用于执行它所代表的方法:public Object invoke(Object obj,Object.args)练习:使用Method分别执行无参、有参、多个参(带数组和基本数据类型)、静态、私有的方法。jdk1.4和jdk1.5的invoke方法的区别:Jdk1.5:public Object invoke(Object obj,Object.args)Jdk1.4:public Object invoke(Object obj,Object args),,练习:利用Method

13、执行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.invok

14、e(null,new String“xxx”),javac只把它当作jdk1.4的语法进行理解,而不把它当作jdk1.5的语法解释,因此会出现参数类型不对的问题。解决办法:mainMethod.invoke(null,new Objectnew Stringxxx);mainMethod.invoke(null,(Object)new Stringxxx);,编译器会作特殊处理,编译时不把参数当作数组看待,也就不会数组打散成若干个参数了,利用Field访问属性,Field对象提供了如下方法,用于设置、获取对象属性的值:public void set(Object obj,Object valu

15、e)public Object get(Object obj)练习:利用Field分别设置和获取公有、私有的属性。,内省(Introspector),为什么要学内省?开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性。什么是Java对象的属性和属性的读写方法?内省访问JavaBean属性的两种方式:通过PropertyDescriptor类操作Bean的属性通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器(Proper

16、tyDescriptor),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。,内省beanutils工具包,Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性BeanUtilsBeanutils工具包的常用类:BeanUtilsPropertyUtilsConvertUtils.regsiter(Converter convert,Class clazz)自定义转换器,泛型(Generic)泛形的作用,JDK5以前,对象保存到集合中就会失去其特性,取出时通常

17、要程序员手工进行类型的强制转换,这样不可避免就会引发程序的一些安全性问题。例如:,ArrayList list=new ArrayList();list.add(abc);Integer num=(Integer)list.get(0);/运行时会出错,但编码时发现不了list.add(new Random();list.add(new ArrayList();for(int i=0;ilist.size();i+)(?)list.get(i);/此处取出来的对象应转换成什么类型,泛型(Generic)泛形的作用,JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序

18、运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。泛形的基本术语,以ArrayList为例:念着typeofArrayList中的E称为类型参数变量ArrayList中的Integer称为实际类型参数整个称为ArrayList泛型类型整个ArrayList称为参数化的类型Parameterize

19、dType,泛型典型应用,使用迭代器迭代泛形集合中的元素。使用增强for循环迭代泛形集合中的元素。存取HashMap中的元素。使用泛形时的几个常见问题:使用泛形时,泛形类型须为引用类型,不能是基本数据类型ArrayList list=new ArrayList();ArrayList list=new ArrayList();ArrayList list=new ArrayList();ArrayList list=new ArrayList();,自定义泛形泛型方法,Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声明,语法:,T可以是任意字母,但

20、通常必须要大写。通常需放在方法的返回值声明之前。例如:public static void doxx(T t);练习:编写一个泛形方法,实现数组元素的交换。编写一个泛形方法,接收一个任意数组,并颠倒数组中的所有元素。注意:只有对象类型才能作为泛型方法的实际参数。在泛型中可以同时有多个类型,例如:public static V getValue(K key)return map.get(key);,自定义泛形泛型类和反射泛形,如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如下:public class GenericDao private T field1

21、;public void save(T obj)public T getId(int id)注意,静态方法不能使用类定义的泛形,而应单独定义泛形。泛形的典型应用:BaseDao和反射泛型,泛型的高级应用?通配符,当接收的类型不确定时,可以使用?通配符,?可以指向任何类型,如下所示:,void print(Collection c)/Collection(发音为:collection of unknown)for(Object e:c)System.out.println(e);,此种形式下需要注意的是:由于?指向的是一种不确定的类型,因此不能调用与类型相关的方法,例如add()方法。总结:使用

22、?通配符主要用于引用对象,使用了?通配符,就只能调对象与类型无关的方法,不能调用对象与类型有关的方法。,泛型的高级应用有限制的通配符,限定通配符的上边界:,正确:Vector x=new Vector();错误:Vector x=new Vector();,限定通配符的下边界:,正确:Vector x=new Vector();错误:Vector x=new Vector();,public void add(List list)list.add(1000);/只要有?就不能调用与类型相关的方法,问题:以下代码行不行?,Annotation(注解)概述,Annotation 其实就是代码里的特

23、殊标记,它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行。三个基本的 Annotation:Override:限定重写父类方法,该注解只能用于方法Deprecated:用于表示某个程序元素(类,方法等)已过时SuppressWarnings:抑制编译器警告.开发人员应该掌握什么:编写注解解析注解,并根据注解信息去运行程序。,自定义 Annotation,自定义注解的目标:原来写在配置文件中的信息,可以通过注解描述定义Annotation 使用 interface 关键字配置文件的信息,在注解中采用属性描述例:String na

24、me();带默认值的方式:String name()default“xxx”注解属性的类型只能是如下类型:String类型8大基本数据类型Class类型枚举类型注解类型以上类型的一维数组特殊属性value:如果注解中有一个名称value的属性,那么使用注解时可以省略value=部分,如MyAnnotation(“xxx)特殊属性value;,JDK 的元 Annotation,元 Annotation指修饰Annotation的Annotation。JDK中定义了如下元Annotation:Retention:只能用于修饰一个 Annotation 定义,用于指定该 Annotation 可以

25、保留的域,Rentention 包含一个 RetentionPolicy 类型的成员变量,通过这个变量指定域。RetentionPolicy.CLASS:编译器将把注解记录在 class 文件中.当运行 Java 程序时,JVM 不会保留注解.这是默认值RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中.当运行 Java 程序时,JVM 会保留注解.程序可以通过反射获取该注释RetentionPolicy.SOURCE:编译器直接丢弃这种策略的注释,JDK 的元 Annotation 2,Target:指定注解用于修饰类的哪个成员.Target 包含了一个

26、名为 value,类型为ElementType的成员变量。Documented:用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.Inherited:被它修饰的 Annotation 将具有继承性.如果某个类使用了被 Inherited 修饰的 Annotation,则其子类将自动具有该注解,解析Annotation 信息,JDK 5.0 在 java.lang.reflect 包下新增了 Annotation 接口,该接口代表程序中可以接受注解。当一个 Annotation 类型被定义为运行时 Annotation 后,该注释才是运行

27、时可见,当 class 文件被载入时保存在 class 文件中的 Annotation 才会被虚拟机读取程序可以调用 AnnotationElement 对象的如下方法来访问 Annotation 信息,北京传智播客教育,Tip:动态代理,明确两个概念:代理对象存在的价值:主要用于拦截对真实业务对象的访问。代理对象有什么方法?如何生成代理对象?,北京传智播客教育,Tip:动态代理,Java提供了一个Proxy类,调用它的newInstance方法可以生成某个对象的代理对象,使用该方法生成代理对象时,需要三个参数:1.生成代理对象使用哪个类装载器2.生成哪个对象的代理对象,通过接口指定3.生成的

28、代理对象的方法里干什么事,由开发人员编写handler接口的实现来指定。初学者必须理解,或不理解必须记住的2件事情:Proxy类负责创建代理对象时,如果指定了handler(处理器),那么不管用户调用代理对象的什么方法,该方法都是调用处理器的invoke方法。由于invoke方法被调用需要三个参数:代理对象、方法、方法的参数,因此不管代理对象哪个方法调用处理器的invoke方法,都必须把自己所在的对象、自己(调用invoke方法的方法)、方法的参数传递进来。,北京传智播客教育,Tip:动态代理,代理类,public Object invoke(Object proxy,Method metho

29、d,Object args)doSomething.,void run(“aaa”)void eat(“bbb”),invoke(this,run,”aaa”),invoke(this,eat,”bbb”),处理器,代理对象,void run(“aaa”)void eat(“bbb”)被代理对象,北京传智播客教育,Tip:动态代理应用,在动态代理技术里,由于不管用户调用代理对象的什么方法,都是调用开发人员编写的处理器的invoke方法(这相当于invoke方法拦截到了代理对象的方法调用)。并且,开发人员通过invoke方法的参数,还可以在拦截的同时,知道用户调用的是什么方法,因此利用这两个特性

30、,就可以实现一些特殊需求,例如:拦截用户的访问请求,以检查用户是否有访问权限、动态为某个对象添加额外的功能。,类加载器,类加载器负责将.class 文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的 java.lang.Class 对象当 JVM 启动时,会形成由三个类加载器组成的初始类加载器层次结构:,类加载器之间的父子关系和管辖范围图,BootStrap,ExtClassLoader,AppClassLoader,ItcastClassLoader,MyClassLoader,SystemclassLoader,JRE/lib/rt.jar,JRE/lib/ext/*.ja

31、r,CLASSPATH指定的所有jar或目录,传智播客指定的特殊目录,bootstrap classloader,bootstrap classloader:引导(也称为原始)类加载器,它负责加载Java的核心类。这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。可以通过执行以下代码来获得bootstrap classloader加载了那些核心类库:因为JVM在启动的时候就自动加载它们,所以不需要在系统属性CLASSPATH中指定这些类库,URL urls=sun.misc.Launcher.getBootstrapClassPa

32、th().getURLs();for(int i=0;i urls.length;i+)System.out.println(urlsi.toExternalForm();,extension classloader,extension classloader 扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中的JAR包。这为引入除Java核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的,所以放入这个目录的 JAR类包对所有的JVM和system classl

33、oader都是可见的。,system classloader,system classloader 系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径。可以通过静态方法ClassLoader.getSystemClassLoader()找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。,父类委托机制,classloader 加载类用的是父类委托机制。父类委托机制:先让parent(父)类加载器 寻找,只有在parent找不到的时候才从自己的类路径中去寻找。类加载还采用了cache机制:如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么修改了Class但是必须重新启动JVM才能生效,并且类只加载一次的原因。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号