00544-方立勋《30天轻松掌握JavaWeb视频》笔记 源码.docx
1 eclipse运用和程序的断点调试11.1 Eclipse的运用11.2 调试程序11.3 DebUg窗口11.4 Breakpoints窗口11.5 断点留意问题12 eclipse常用快捷键13 junit测试框架24 java5的静态导入和自动装箱拆箱.avi34.1 静态导入34.2 自动装箱/拆箱35 增加for循环45.1 增加for循环46 可变参数(相当于动态的数组)57 枚举类67.1 枚举类68 反射技术88.1 反射什么一Class类88.2 Constructor类88.3 FiHd类88.4 MethOd类98.5 用反射方式反射类中的main方法99 内省技术129.1 用内省技术反省JavaBean129.2 内省一beanutils工具包1410 泛型技术(GeneriC)1610.1 泛形的作用1610.2 泛型典型应用1710.3 自定义泛形一一泛型方法1810.4 自定义泛形一一泛型类1810.5 泛型的高级应用一一通配符1910.6 泛型的高级应用一一有限制的通配符1911 Annotation(SW)概述1911.1 自定义AnnotatiOn2011.2 JDK的元Annotation2011.3 提取Annotation信息2011.4 Tip:动态代理2011.5 Tip:动态代理应用2111.6 类加载器2111.7 bootstrapclassloader2211.8 extensionclassloader2211.9 systemclassloader2211.10 全盘负责托付机制2311.11 Tip:DTD的语法细微环节:元素定义12311.12 Tip:属性定义2311.13 Tip:常用属性值类型2411.14 Tip:属性值类型ENUMERATED2411.15 Tip:属性值类型ID2411.16 Tip:实体定义2411.17 Tip:实体定义引用实体2411.18 Tip:实体定义参数实体2511.19 Tip:XM1.解析技术概述2511.20 Tip:JAXP2511.21 Tip:运用JAXP进行DoM解析2511.22 Tip:获得JAXP中的DOM解析器2611.23 调虚拟机内存大小3011.24 Tip:DoM编程3011.25 Tip:DoM方式解析XM1.文件3011.26 Tip:更新XM1.文档3111.27 Tip:SAX解析3111.28 Tip:SAX方式解析XM1.文档3111.29 Tip:DoM4J解析XM1.文档3611.30 Tip:DoCUment对象3711.31 Tip:节点对象3811.32 Tip:节点对象属性3811.33 Tip:将文档写入XM1.文件3911.34 Tip:Dom4j在指定位置插入节点3911.35 Tip:字符串与XM1.的转换3911.36 XM1.Schema4011.37 Sehema约束快速入门4011.38 Schema入门案例4011.39 名称空间的概念4111.40 运用名称空间引入Schema4111.41 运用默认名称空间4111.42 运用名称空间引入多个XM1.SChema文档4211.43 不运用名称空间引入XM1.SChema文档4211.44 在XM1.SChema文档中声明名称空间4212 协议4212.1 什么是协议4212.2 Tip:配置虚拟书目4312.3 Tip2:协议简介4412.4 Tip3:1.0和1.1的区分4412.5 Tip4:恳求4412.6 Tip5:恳求的细微环节一一恳求行4412.7 Tip9:响应细微环节一一常用响应头4512.8 TiplO:恳求的细微环节一通用信息头4612.9 Tipll:作业4613 SerVIet开发4813.1 Tip:SerVIet简介4813.2 Servlet在web应用中的位置4913.3 Tip:SerVlet的运行过程(课后看)4913.4 Tip:在EdiPSe中开发SerVlet5013.5 Tip:SerVlet接口实现类5013.6 Tip:SerVlet的一些细微环节5113.7 Tip:SerVlet的一些细微环节一线程平安5213.8 Tip:SerVIetConfig对象5213.9 Tip:ServIetContext5313.10 Tip:SerVletConteXt应用5413.11 Tip:SerVlet高级应用一Servlet与缓存5613.12 Tip:get1.astModified方法与缓存5713.13 Tip:缓存的应用5713.14 response'request对象5813.15 文件下载5913.16 发送头,限制阅读器定时刷新网页(REFRESH)6013.17 发送头,限制阅读器缓存当前文档内容6013.18 通过response实现恳求重定向。6013.19 Tip:response细微环节6013.20 ServIetRequest6013.21 获得头相关数据6213.22 各种表单输入项数据的获得6313.23 恳求参数的中文乱码问题6413.24 Tip:恳求转发的细微环节6513.25 Tip:恳求重定向和恳求转发的区分6513.26 Tip:RequestDispatcher6613.27 会话管理6613.28 Tip:保存会话数据的两种技术:6713.29 Tip:COokie技术6713.30 Tip:session6713.31 Tip:CookieAPI6713.32 Tip:CoOkie应用6813.33 Tip:COokie细微环节6813.34 Tip:Cookie应用6813.35 Tip:显示上次阅读商品的实现过程7213.36 Tip:session7213.37 Tip:SeSSiOn案例7313.38 Tip:SeSSion实现原理7413.39 Tip:IE禁用Cookie后的session处理7513.40 Tip:SeSSion案例7513.41 Tip:SeSSiOn案例一防止表单重复提交7513.42 Tip:SeSSion案例一次性校验码7713.43 应用Session+Cookie技术完成用户自动登陆功能7814 JavaServerPages7814.1 Tip:JSP最佳实践7814.2 Tip:JSP原理7814.3 Tip:JSP语法7814.4 Tip:JSP模版元素7914.5 Tip:JSP脚本表达式7914.6 Tip:JSP脚本片断(1)7914.7 Tip:JSP声明8014.8 Tip:JSP声明案例8014.9 Tip:JSP注释8014.10 Tip:JSP指令8014.11 Tip:JSP指令简介8114.12 Tip:Page指令8114.13 Tip:运用Page指令解决JSP中文乱码8114.14 Tip:include指令8214.15 Tip:taglib指令8214.16 Tip:JSP运行原理和九大隐式对象8214.17 Tip:JSP九大隐式对象对应关系8214.18 Tip:out隐式对象8314.19 Tip:out隐式对象的工作原理图8314.20 Tip:OUt隐式对象的留意事项8314.21 Tip:PageConteXt对象8314.22 Tip:通过PageCOnteXt获得其他对象8414.23 Tip:PageConteXt作为域对象8414.24 Tip:重点8414.25 Tip:引入和跳转到其他资源8414.26 Tip:JSP标签8514.27 Tip:JSP常用标签8514.28 Tip:<jsp:include>标签8514.29 Tip:<jsp:include>与include指令的比较8514.30 Tip:<jsp:forward>标签8514.31 Tip:<jsp:Param>标签8614.32 Tip:映射JSP8614.33 Tip:如何查找JSP页面中的错误8614.34 Div与css8614.35 JavaBean与Jsp8714.36 Tip:JaVaBean的属性8714.37 Tip:在JSP中运用JavaBean8714.38 Tip:<jsp:USeBean>标签8714.39 Tip:<jsp:USeBean执行原理8714.40 Tip:带标签体的<jsp:USeBean>标签8814.41 Tip:<jsp:SetPrOPerty>标签8814.42 Tip:<jsp:getProperty>标签8814.43 Tip:JSP开发模式8914.44 Tip:E1.表达式和JST1.标签快速入门11515 自定义标签库开发11615.1 快速入门:运用自定义标签输出客户机IP11615.2 Tip:Tag接口的执行流程11815.3 Tip:自定义标签功能扩展11815.4 通过自定义标签可以限制jsp页面某一部分内容重复执行。11915.5 通过自定义标签可以修改jsp页面内容输出。11916 Tip:简洁标签12016.1 Tip:SimpIeTag方法介绍(课后阅读API)12016.2 Tip:SimPIeTag接口方法的执行依次12116.3 Tip:JSPFragment类12116.4 Tip:invoke方法详解12316.5 Tip:开发带属性的标签12316.6 Tip:在T1.D中描述标签属性12316.7 12316.8 Tip:案例12516.9 开发防盗链标签12516.10 开发<uif>标签12716.11 开发<c:if>«:else>标签12716.12 开发迭代标签12916.13 开发html转义标签13316.14 打包标签库13417 Tip:JST1.标签库13517.1 Tip:c:OUt标签13517.2 Tip:c:set标签13517.3 Tip:c:remove标签13617.4 Tip:c:CatCh标签13617.5 Tip:c:if标签13617.6 Tip:c:ChooSe标签13717.7 Tip:c:forEach标签13717.8 Tip:vc:Param标签13817.9 Tip:c:url标签13818 E1.表达式13918.1 Tip:E1.Function开发步骤14018.2 开发E1.Function留意事项14018.3 Tip:E1.留意事项14018.4 Tip:E1.表达式保留关键字14118.5 Tip:JST1.中的常用E1.函数14119 Tip:FiIter简介14219.1 Tip:FiIter是如何实现拦截的?14219.2 Tip:Filter开发入门14319.3 Tip:Filter的生命周期14319.4 Tip:FiIterConfig接口14319.5 Tip:FiIter常见应用14319.6 Tip:Filter的部署一注册FiIter14419.7 Tip:Filter的部署一映射Filter14419.8 Tip:Filter的部署一映射Filter示例14519.9 Tip:FiIter高级开发14519.10 Tip:DeCorator设计模式14519.11 Tip:request对象的增加14519.12 Tip:response对象的增加14619.13 Tip:response增力口案例压缩响应14619.14 Tip:好用案例一缓存数据到内存14620 Tip:动态代理14620.1 Tip:动态代理应用14720.2 Filter039张龙1471eclipse运用和程序的断点调试1.1 Edipse的运用工作空间书目是纯英文不带空格的路径在eclipse下Java程序的编写和运行,及java运行环境的配置。新建java工程dayl,在弹出窗口中可配置jre工程右键属性可配置编辑器的版本1.2 调试程序1.3 Debug窗口ReSUme(F8)到下一个断点Stepinto(F5)进入到函数等里面StePoVer(F6)到下一行代码Stepreturn(F7)返回到调用的下一行DroptoFrame返回到当前方法的第一行,Terminate(F12)终止虚拟机,程序就结束了。(调试完后用)右键watch视察变量的值1.4 Breakpoints窗口移除所以断点1.5 断点留意问题1 .调完后,移除所以断点2 .调完后,确定要结束断点的JVM。2eclipse常用快捷键MyEcIipse设置工作空间默认编码utf-8等,使新建工程运用默认编码菜单栏Window/Preferences/General/Workspace。内容提示:Alt+/ContentAssist选中多行代码,按Tab键是整块向右推动,按Shift+Tab是整块向左缩进快速修复:Ctrl+1导包:Ctrl+shift+0格式化代码块:Ctrl+shift+F向前向后:Alt+方向键(leftrightarrow)查看源代码时添加注释Ctrl+Shift+/除去注释Ctrl+Shift+查看源代码Ctrl+单击ctrl+shift+t查看方法说明:F2重置透视图WindOWmenU下更改为大写Ctrl+Shift+X更改为小写Ctrl+Shift+Y复制行CtH+Alt+向下键(有些不能用)查看类的继承关系Ctrl÷T查看快捷键Ctrl+shift+1.3junit测试框架在Outline窗口方法上右键RunAs/JUnitTest测试某一个方法,类上右键runas/JUnitTest测试这个类的全部方法1、用junit进行单元测试的时候,在每个被测试的方法中必需加上TeSt注解2、用Before注解是在每个被测试的方法前执行。3、用After注解是在每个被测试的方法后执行。4、用BefOreClaSS注解的静态方法是在全部方法被测试之前执行的方法,就像类里面的构造方法一样。用来初始化一些要用到的变量等资源。5、用AterClaSS注解的静态方法是在全部被测试的方法之后执行。相当于C+中析构函数。用来释放一些资源。6、运用断言类Assert可以推断被测试的方法的返回值是否跟你预期的相同。/person.javapackagecn.itcast.elclipse;/demo4.javapackagecn.itcast.elclipse;publicclassPersonimportorg.junit.After;publicvoideat()importorg.junit.Before;(importorgJunit.Test;System.out.println("eating.H);)publicclassDemo4publicStringrun()Before(publicvoidbefore()System.out.println("runing.");System.out.println("before");return"1")TestpublicvoidtestRun()(Personp=newPerson();P-run();)TestpublicvoidtestEat()Personp=newPerson();Peat();)Afterpublicvoidafter()System.out.println("after");)/Demo5.java/Demo6.javapackagecn.itcast.elclipse;packagecn.itcast.elclipse;importOrgJunit.AfterCIass;importjunit.framework.Assert;importOrgjunit.BeforeCIass;importorg.junit.Test;importorg.junit.Test;publicclassDemo5(三)BeforeCIasspublicclassDemo6publicvoidbeforeClass()TestSystem.out.println(,beforeclass");publicvoidtestRun()(Personp=newPerson();TestAssert.assertEquals("2",p.run();publicvoidtestRun()(Personp=newPerson();Prun();)TestpublicvoidtestEat()Personp=newPerson();Peat();)AfterCIaSSpublicvoidafterClass()System.out.println(,afterclass");)4java5的静态导入和自动装箱拆箱aviJDK5中新增了许多新的java特性,利用这些新语法可以帮助开发人员编写出更加高效、清晰,平安的代码。静态导入自动装箱/拆箱增加for循环可变参数枚举反射内省泛型元数据4.1 静态导入JDK1.5增加的静态导入语法用于导入类的某个静态属性或方法。运用静态导入可以简化程序对类静态属性和方法的调用。语法:Importstatic包名.类名.静态属性|静态方法*例如:4.2 自动装箱/拆箱JDK5.0的语法允许开发人员把一个基本数据类型干脆赋给对应的包装类变量,或者赋给ObjeCt类型的变量,这个过程称之为自动装箱。自动拆箱与自动装箱与之相反,即把包装类对象干脆赋给一个对应的基本类型变量。典型应用:静态导入自动装箱/拆箱importstaticjava.lang.System.outimportstaticjava.lang.Math.*/Demolpackagecn.itcast.demo;importjava.Uti1.Array1.ist;packagecn.itcast.demo;importstaticjava.lang.System.out;importstaticjava.Uti1.Arrays.*;publicclassDemolpublicstaticvoidmain(Stringargs)out.print("main");inta=newint6z5z3;sort(八);for(inti:a)out.print(i);)/main356importjava.util.Iterator;importjava.util.1.ist;publicclassDemo2publicstaticvoidmain(Stringargs)Integeri=lffiintj=i;拆箱典型应用1.istlist=newArray1.ist();list.add(l);intk=(Integer)Iis1.get(O);Iteratorit=list.iterator();while(it.hasNext()(intm=(lntegejit.next();拆箱)5增加for循环5.1增加for循环引入增加for循环的缘由:在JDK5以前的版本中,遍历数组或集合中的元素,需先获得数组的长度或集合的迭代器,比较麻烦!因此JDK5中定义了一种新的语法一一增加for循环,以简化此类操作。增加for循环只能用在数组、或实现Iterator接口的集合类I:语法格式:for(变量类型变量:需迭代的数组或集合)Mapmap=newHashMap();/Mapm叩2=new1.inkedHashMap<K,V>();map.put("l,aaa");map.put(,2,'bbb");map.put("3","ccc");传统方式1Setset=map.keySet();Iteratorit=set.iterator();while(it.hasNe×t()Stringkey=(String)it.next();StringVaIue=(String)map.get(key);System.out.println("key="+key+",value="+value);)增加for循环的1种方式for(Objectobj:map.keySet()Stringkey2=(String)obj;Stringvalue2=(String)map.get(key2);System.out.println("key2=,+key2+"zvalue2="+value2)/)传统方式2增加for循环的2种方式Setset2=map.entrySet();Iteratorit2=set2.iterator();while(it2.hasNext()Map.Entryentry=(Entry)it2.next();System.out.println("key="+entry.getKey()+"zvalue="+entry.getValue();)for(Objectobj:map.entrySet()Map.Entryentry3=(Entry)obj;Stringkey3=(String)entry3.getKey();Stringvalue3=(String)entry3.getValue();System.out.println(',key3="+key3+"zvalue3=,+value3)/增加for循环须要留意的问题:只适合取数据itarr=lz2z3);for(inti:arr)i=10;)System.out.println(arr0);/11.istli=newArray1.istf);li.add("l");for(Objectobj:li)obj="888"System.out.println(li.get(0);/16可变参数(相当于动态的数组)测试JDK中具有可变参数的类ArrayS.as1.ist()方法。分别传多个参数、传数组,传数组又传参的状况。留意:传入基本数据类型数组的问题。从JDK5起先,Java允许为方法定义长度可变的参数。语法:publicvoidfoo(int.args)留意事项:调用可变参数的方法时,编译器将自动创建一个数组保存传递给方法的可变参数,因此,程序员可以在方法体中以数组的形式访问可变参数可变参数只能处于参数列表的最终,所以一个方法最多只能有一个长度可变的参数publicvoidtestSum()SUm(1,2,3,4);intarr=5z6J;sum(arr);)publicvoidsum(int.nums)可变参数当成数组intsum=0;for(inti:nums)sum+=i;System.out.println(sum);)publicvoidbb()/publicstatic<T>1.ist<T>as1.ist(T.a)1.istlist=Arrays.as1.ist("l"z"2'7,3");System.out.println(list)l,2,3Stringarr="l'7,2,7,3,7,4,;list=Arrays.as1.ist(arr);System.out.println(list)l,2,3,4intnums=l,2,3,4,5;IiSt=ArTayS.as1.ist(nums);存储只是一个对象System.out.println(list);/l120d62bIntegernums2=l,2,3,4,5;list=Arrays.as1.ist(nums2);System.out.println(list)lz2,3,4,5)可变参数留意的问题/publicvoidaa(int.nums,ints)不行以/publicvoidbb(intS,intnums)可以7枚举类为什么须要枚举?一些方法在运行时,它须要的数据不能是随意的,而必需是确定范围内的值,此类问题在JDK5以前采纳自定义带有枚举功能的类解决,Java5以后可以干脆运用枚举予以解决。JDK5新增的enum关键字用于定义一个枚举类。7.1枚举类枚举类具有如下特性:1.枚举类也是一种特殊形式的Java类。2 .枚举类中声明的每一个枚举值代表枚举类的一个实例对象。A,B,C,D3 .与java中的一般类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必需为私有的(PriVate这点不难理解)。为什么?防止其他类初始化对象4 .枚举类也可以实现接口、或继承抽象类。5 .JDK5中扩展了swith语句,它除了可以接收intzbyte,char,short夕卜,还可以接收一个枚举类型。6 .若枚举类只有一个枚举值,则可以当作单态设计模式运用。7Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了EnUm类的全部方法。常用方法:name()OrdinaI()返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。valueof(ClassenumClasszStringname)返回带指定名称的指定枚举类型的枚举常量。/Stringstr="B"Gradeg=Grade.valueOf(Grade.class,str);values()此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的全部枚举值特别便利。练习:请编写一个关于星期儿的枚举WeekDay,要求:枚举值:Mon、Tue、Wed、Thu、Fri、Sat、Sun该枚举要有一个方法,调用该方法返回中文格式的星期。packagecn.itcast.enumeration;packagecn.itcast.enumeration2;importorg.junit.Test;importorg.junit.Test;publicclassDemolpublicclassDemolTestTestpublicvoidtest()publicvoidtest()print(Grade.B);)publicvoidprint(Gradeg)/ABCDE(Stringvalue=g.getValue();System.out.println(value);)* classGradeprivateGrade()* publicstaticfinalGradeA=newGrade();* publicstaticfinalGradeB=newGrade();* publicstaticfinalGradeC=newGrade();* publicstaticfinalGradeD=newGrade();* publicstaticfinalGradeE=newGrade();* )* /如何定义枚举的构造函数、方法、字段enumGrade/classA100-90B89-80C79-70D69-60E59-0A(,100-90")zB("89-80"),C("79-70"),D("69-60")zE("59-0");/objectprivateStringvalue;privateGrade(Stringvalue)this.value=value;)publicStringgetValue()returnthis.value;)实际开法中,把客服端传过来的SeX字符串,转换成枚举对象Gradeg=Grade.valueOf(str);Gradegs=Grade.values();For(Grade)print(Grade.B);/89-80,良publicvoidprint(Gradeg)/ABCDE(Stringvalue=g.getValue();Stringvalue2=g.localeValue();System.out.println(value+",+value2);带抽象方法的枚举enumGrade/classA100-90优B89-80良C79-70一般D69-60差E59-0不及格/A.boCoD就是对象A(,100-90,)publicStringlocaleValue()return,f",B(,-89-80,)publicStringlocaleValue()return,",C(,79-70,)publicStringlocaleValue()return“一般”;,D("69-60,)publicStringlocaleValue()return“差”;),E(,59-0,)publicStringlocaleValue()return"不及格”;/objectprivateStringVaIUe;封装每个对象对应的分数privateGradefStringvalue)this.value=value;publicStringgetValue()returnthis.value;publicabstractStringIocaIeVaIueO;)8反射技术8.1 反射什么一Class类1 .反射就是把JaVa类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。2 .Class类用于表示.class文件,画图演示一个对象的创建过程。3 .如何得到某个class文件对应的class对象。类名.class,对象.getClass()CIaSS.forName(“类名”)以上三种方式,JVM都会把相应class文件装载到一个class对象中(只装载一次)创建类的实例:Classmewlnstance方法数组类型的CIaSS实例对象Class.isArray()总之,只要是在源程序中出现的类型,都有各自的ClaSS实例对象,例如,int,Void反射就是把JaVa类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。驾驭反射技术的要点在于:如何从一个class中反射出各个组成部分。反射出来的对象怎么用。8.2 Constructor(1) ConStrUCtOr类代表某个类中的一个构造方法得到某个类全部的构造方法:例子:Constructorconstructors=Class.forName(,java.lang.String").getConstructors();得到某一个构造方法:例子:获得方法时要用到类型Constructorconstructor=Class.forName(rtjava.Iang.Stringw).getConstructor(StringBuffer.class);(2)创建实例对象:通常方式:Stringstr=newString(newStringBufferCabc");反射方式:Stringstr=(String)constructor.newlnstance(newStringBuffer("abc");ClaSS.newlnstance()方法:例子:Stringobj=(String)Class.forName(',java.lang.String").newlnstance();该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。8.3 Field类Field类代表某个类中的一个成员变量问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,假如是与对象关联,哪关联的是哪个对象呢?所以字段fieldX代表的是X的定义,而不是具体的X变量。(留意访问权限的问题)示例代码:RefI