当前位置:首页 >> 学科竞赛 >>

方立勋JavaWeb视频前十一天笔记word版本


1

2 3 4

5 6 7

Day01 02-eclipse 使用和程序的断点调试 ......................................................................................... 1 1.1 Eclipse 的使用.........

................................................................................................................ 1 1.2 调试程序................................................................................................................................. 1 1.3 Debug 窗口 ............................................................................................................................. 1 1.4 Breakpoints 窗口 .................................................................................................................... 1 1.5 断点注意问题......................................................................................................................... 1 03-eclipse 常用快捷键 ........................................................................................................................... 1 04-junit 测试框架 ................................................................................................................................... 2 java5 的静态导入和自动装箱拆箱.avi.................................................................................................. 3 4.1 静态导入................................................................................................................................. 3 4.2 自动装箱/拆箱 ....................................................................................................................... 4 06-增强 for 循环..................................................................................................................................... 4 5.1 增强 for 循环 .......................................................................................................................... 4 可变参数 ................................................................................................................................................ 5 枚举类 .................................................................................................................................................... 6 7.1 枚举类 .................................................................................................................................... 6 7.2 反射什么—Class 类................................................................................................................ 8 7.3 Constructor 类 ........................................................................................................................ 8 7.4 Field 类.................................................................................................................................... 9 7.5 Method 类 .............................................................................................................................. 9 7.6 用反射方式执行某个类中的 main 方法............................................................................... 9 7.7 用反射技术实现一个简单的 web 服务器 .......................................................................... 12 7.8 内省—beanutils 工具包 ....................................................................................................... 14 7.9 泛型(Generic)—泛形的作用 ................................................................................................ 16 7.10 泛型典型应用....................................................................................................................... 17 7.11 自定义泛形——泛型方法 ................................................................................................... 18 7.12 自定义泛形——泛型类 ....................................................................................................... 18 7.13 泛型的高级应用——通配符 ............................................................................................... 19 7.14 泛型的高级应用——有限制的通配符................................................................................ 19 7.15 Annotation(注解) 概述 ........................................................................................................ 20 7.16 自定义 Annotation ............................................................................................................... 20 7.17 JDK 的元 Annotation............................................................................................................ 20 7.18 提取 Annotation 信息 ......................................................................................................... 20 7.19 Tip:动态代理 ..................................................................................................................... 21 7.20 Tip:动态代理应用 ............................................................................................................. 22 7.21 类加载器............................................................................................................................... 22 7.22 bootstrap classloader ............................................................................................................ 22 7.23 extension classloader ............................................................................................................ 23 7.24 system classloader ................................................................................................................ 23 7.25 全盘负责委托机制............................................................................................................... 23 7.26 Tip: DTD 的语法细节:元素定义 1 ................................................................................ 23 7.27 Tip:属性定义 ..................................................................................................................... 24 7.28 Tip:常用属性值类型 ......................................................................................................... 24 7.29 Tip:属性值类型? ENUMERATED ...................................................................................... 24 7.30 Tip:属性值类型? ID ......................................................................................................... 25 7.31 Tip:实体定义 ..................................................................................................................... 25
1

8

9

7.32 Tip:实体定义?引用实体 ..................................................................................................25 7.33 Tip:实体定义?参数实体 ..................................................................................................25 7.34 Tip:XML 解析技术概述 ......................................................................................................26 7.35 Tip:JAXP ..............................................................................................................................26 7.36 Tip:使用 JAXP 进行 DOM 解析 ..........................................................................................26 7.37 Tip:获得 JAXP 中的 DOM 解析器 ......................................................................................26 7.38 调虚拟机内存大小 ...............................................................................................................31 7.39 Tip:DOM 编程.....................................................................................................................31 7.40 Tip:DOM 方式解析 XML 文件............................................................................................31 7.41 Tip:更新 XML 文档 .............................................................................................................31 7.42 Tip:SAX 解析 .......................................................................................................................32 7.43 Tip:SAX 方式解析 XML 文档 ..............................................................................................32 7.44 Tip:DOM4J 解析 XML 文档 ................................................................................................37 7.45 Tip:Document 对象 ............................................................................................................39 7.46 Tip:节点对象 ......................................................................................................................39 7.47 Tip:节点对象属性 ..............................................................................................................40 7.48 Tip:将文档写入 XML 文件 .................................................................................................40 7.49 Tip:Dom4j 在指定位置插入节点.......................................................................................40 7.50 Tip:字符串与 XML 的转换 .................................................................................................41 7.51 XML Schema...........................................................................................................................41 7.52 Schema 约束快速入门 ..........................................................................................................41 7.53 Schema 入门案例..................................................................................................................42 7.54 名称空间的概念 ...................................................................................................................42 7.55 使用名称空间引入 Schema ..................................................................................................43 7.56 使用默认名称空间 ...............................................................................................................43 7.57 使用名称空间引入多个 XML Schema 文档 .........................................................................43 7.58 不使用名称空间引入 XML Schema 文档 .............................................................................44 7.59 在 XML Schema 文档中声明名称空间 .................................................................................44 HTTP 协议 ..............................................................................................................................................44 8.1 什么是 HTTP 协议 .................................................................................................................44 8.2 Tip:配置虚拟目录 ..............................................................................................................45 8.3 Tip2:HTTP 协议简介...........................................................................................................45 8.4 Tip3:HTTP1.0 和 HTTP1.1 的区别 ......................................................................................45 8.5 Tip4:HTTP 请求...................................................................................................................46 8.6 Tip5:HTTP 请求的细节——请求行....................................................................................46 8.7 Tip9:HTTP 响应细节——常用响应头................................................................................47 8.8 Tip10:HTTP 请求的细节—通用信息头 .............................................................................48 8.9 Tip11:作业 ..........................................................................................................................48 Servlet 开发 ...........................................................................................................................................50 9.1 Tip:Servlet 简介 ..................................................................................................................50 9.2 Servlet 在 web 应用中的位置 ..............................................................................................51 9.3 Tip:Servlet 的运行过程(课后看)........................................................................................51 9.4 Tip:在 Eclipse 中开发 Servlet .............................................................................................52 9.5 Tip:Servlet 接口实现类 ......................................................................................................53 9.6 Tip:Servlet 的一些细节(1) .................................................................................................53 9.7 Tip:Servlet 的一些细节(7)—线程安全 ..............................................................................55 9.8 Tip:ServletConfig 对象........................................................................................................55

Tip:ServletContext ............................................................................................................. 55 Tip:ServletContext 应用..................................................................................................... 56 Tip:Servlet 高级应用—Servlet 与缓存 ............................................................................. 59 Tip:getLastModified 方法与缓存 ...................................................................................... 60 Tip:缓存的应用 ................................................................................................................. 60 response、request 对象....................................................................................................... 60 文件下载............................................................................................................................... 62 发送 http 头,控制浏览器定时刷新网页(REFRESH) ......................................................... 62 发送 http 头,控制浏览器缓存当前文档内容 .................................................................. 63 通过 response 实现请求重定向。 ...................................................................................... 63 Tip: response 细节 ............................................................................................................ 63 HttpServletRequest ............................................................................................................... 63 //获取头相关数据................................................................................................................ 65 各种表单输入项数据的获取 ............................................................................................... 66 请求参数的中文乱码问题................................................................................................... 67 Tip: 请求转发的细节 ....................................................................................................... 68 Tip:请求重定向和请求转发的区别.................................................................................. 68 Tip: RequestDispatcher ..................................................................................................... 69 会话管理............................................................................................................................... 70 Tip:保存会话数据的两种技术:...................................................................................... 70 Tip:Cookie 技术 ................................................................................................................. 70 Tip:session.......................................................................................................................... 71 Tip:Cookie API .................................................................................................................... 71 Tip:Cookie 应用 ................................................................................................................. 71 Tip:Cookie 细节 ................................................................................................................. 72 Tip:Cookie 应用 ................................................................................................................. 72 Tip:显示上次浏览商品的实现过程.................................................................................. 76 Tip:session.......................................................................................................................... 76 Tip:session 案例................................................................................................................. 77 Tip:session 实现原理......................................................................................................... 78 Tip:IE 禁用 Cookie 后的 session 处理 ............................................................................... 78 Tip:session 案例................................................................................................................. 79 Tip:session 案例-防止表单重复提交 ............................................................................. 79 Tip:session 案例一次性校验码 ......................................................................................... 81 应用 Session+Cookie 技术完成用户自动登陆功能 ............................................................ 82 10 Java Server Pages .......................................................................................................................... 82 10.1 Tip:JSP 最佳实践 ............................................................................................................... 82 10.2 Tip:JSP 原理 ....................................................................................................................... 82 10.3 Tip:JSP 语法 ....................................................................................................................... 83 10.4 Tip: JSP 模版元素 ............................................................................................................. 83 10.5 Tip: JSP 脚本表达式 ......................................................................................................... 83 10.6 Tip: JSP 脚本片断(1) ................................................................................................... 83 10.7 Tip: JSP 声明 ..................................................................................................................... 84 10.8 Tip: JSP 声明?案例 ......................................................................................................... 84 10.9 Tip: JSP 注释 ..................................................................................................................... 84 10.10 Tip: JSP 指令 ..................................................................................................................... 85 9.9 9.10 9.11 9.12 9.13 9.14 9.15 9.16 9.17 9.18 9.19 9.20 9.21 9.22 9.23 9.24 9.25 9.26 9.27 9.28 9.29 9.30 9.31 9.32 9.33 9.34 9.35 9.36 9.37 9.38 9.39 9.40 9.41 9.42 9.43
3

10.11 Tip: JSP 指令简介 ..............................................................................................................85 10.12 Tip: Page 指令 ...................................................................................................................85 10.13 Tip:使用 page 指令解决 JSP 中文乱码 .............................................................................86 10.14 Tip: include 指令 ...............................................................................................................86 10.15 Tip: taglib 指令 ..................................................................................................................87 10.16 Tip:JSP 运行原理和九大隐式对象 ....................................................................................87 10.17 Tip:JSP 九大隐式对象对应关系 ........................................................................................87 10.18 Tip: out 隐式对象..............................................................................................................87 10.19 Tip: out 隐式对象的工作原理图 ......................................................................................88 10.20 Tip: out 隐式对象的注意事项 ..........................................................................................88 10.21 Tip: pageContext 对象 .......................................................................................................88 10.22 Tip:通过 pageContext 获得其他对象 ................................................................................88 10.23 Tip:pageContext 作为域对象 .............................................................................................88 10.24 Tip:重点 ..............................................................................................................................89 10.25 Tip:引入和跳转到其他资源 ..............................................................................................89 10.26 Tip: JSP 标签 ......................................................................................................................89 10.27 Tip: JSP 常用标签 ..............................................................................................................89 10.28 Tip: <jsp:include>标签 .......................................................................................................90 10.29 Tip: <jsp:include>与 include 指令的比较 .........................................................................90 10.30 Tip: <jsp:forward>标签 ......................................................................................................90 10.31 Tip: <jsp:param>标签 ........................................................................................................90 10.32 Tip:映射 JSP ........................................................................................................................91 10.33 Tip:如何查找 JSP 页面中的错误 .......................................................................................91 10.34 Div 与 css ...............................................................................................................................91 10.35 JavaBean 与 Jsp .....................................................................................................................91 10.36 Tip: JavaBean 的属性 ........................................................................................................92 10.37 Tip:在 JSP 中使用 JavaBean ...............................................................................................92 10.38 Tip: <jsp:useBean>标签 .....................................................................................................92 10.39 Tip:<jsp:useBean>执行原理 ...............................................................................................92 10.40 Tip:带标签体的<jsp:useBean>标签 ...................................................................................93 10.41 Tip: <jsp:setProperty>标签................................................................................................93 10.42 Tip: <jsp:getProperty>标签 ...............................................................................................93 10.43 Tip: JSP 开发模式 ..............................................................................................................94 10.44 Tip: EL 表达式和 JSTL 标签快速入门 .............................................................................121 11 自定义标签库开发 .....................................................................................................................122 11.1 快速入门:使用自定义标签输出客户机 IP......................................................................122 11.2 Tip:Tag 接口的执行流程 ..................................................................................................124 11.3 Tip:自定义标签功能扩展 ................................................................................................124 11.4 通过自定义标签可以控制 jsp 页面某一部分内容重复执行。 .......................................125 11.5 通过自定义标签可以修改 jsp 页面内容输出。 ...............................................................126 12 Tip: 简单标签 ..........................................................................................................................127 12.1 Tip:SimpleTag 方法介绍(课后阅读 API) ..........................................................................127 12.2 Tip:SimpleTag 接口方法的执行顺序 ...............................................................................127 12.3 Tip:JspFragment 类 ...........................................................................................................127 12.4 Tip:invoke 方法详解.........................................................................................................129 12.5 Tip:开发带属性的标签 ....................................................................................................130 12.6 Tip:在 TLD 中描述标签属性 ............................................................................................130

12.7 ..................................................................................................................................................... 130 12.8 Tip:案例 ........................................................................................................................... 132 12.9 开发防盗链标签................................................................................................................. 132 12.10 开发<c:if>标签 .................................................................................................................... 134 12.11 开发<c:if><c:else>标签....................................................................................................... 134 12.12 开发迭代标签..................................................................................................................... 136 12.13 开发 html 转义标签 ........................................................................................................... 141 12.14 打包标签库......................................................................................................................... 142 Tip:JSTL 标签库........................................................................................................................ 142 13.1 Tip:<c:out>标签 ............................................................................................................... 142 13.2 Tip:<c:set>标签 ................................................................................................................ 143 13.3 Tip:<c:remove>标签 ........................................................................................................ 143 13.4 Tip:<c:catch>标签 ............................................................................................................ 143 13.5 Tip:<c:if>标签 .................................................................................................................. 144 13.6 Tip:<c:choose>标签 ......................................................................................................... 144 13.7 Tip:<c:forEach>标签 ........................................................................................................ 144 13.8 Tip:<c:param>标签 .......................................................................................................... 146 13.9 Tip:<c:url>标签 ................................................................................................................ 146 EL 表达式 .................................................................................................................................... 147 14.1 Tip:EL Function 开发步骤 ................................................................................................ 148 14.2 开发 EL Function 注意事项 ................................................................................................ 148 14.3 Tip:EL 注意事项 ............................................................................................................... 148 14.4 Tip: EL 表达式保留关键字 ............................................................................................. 148 14.5 Tip:JSTL 中的常用 EL 函数 .............................................................................................. 148 Tip:Filter 简介 .......................................................................................................................... 150 15.1 Tip:Filter 是如何实现拦截的? ...................................................................................... 150 15.2 Tip:Filter 开发入门 .......................................................................................................... 151 15.3 Tip: Filter 的生命周期 .................................................................................................... 151 15.4 Tip: FilterConfig 接口...................................................................................................... 151 15.5 Tip:Filter 常见应用(1) ..................................................................................................... 152 15.6 Tip:Filter 的部署—注册 Filter ........................................................................................ 152 15.7 Tip:Filter 的部署—映射 Filter ........................................................................................ 152 15.8 Tip:Filter 的部署—映射 Filter 示例 ............................................................................... 153 15.9 Tip:Filter 高级开发 .......................................................................................................... 153 15.10 Tip: Decorator 设计模式 ................................................................................................ 153 15.11 Tip:request 对象的增强 .................................................................................................. 154 15.12 Tip: response 对象的增强 .............................................................................................. 154 15.13 Tip:response 增强案例—压缩响应 ................................................................................ 154 15.14 Tip:实用案例-缓存数据到内存.................................................................................... 154 Tip:动态代理 ........................................................................................................................... 154 16.1 Tip:动态代理应用 ........................................................................................................... 155 16.2 Filter 039 张龙 .............................................................................................................. 155

13

14

15

16

5

1

Day01

02-eclipse 使用和程序的断点调试

1.1 Eclipse 的使用
工作空间目录是纯英文不带空格的路径 在 eclipse 下 Java 程序的编写和运行,及 java 运行环境的配置。 新建 java 工程 day01,在弹出窗口中可配置 jre 工程右键属性可配置编辑器的版本

1.2 调试程序 1.3 Debug 窗口
Resume(F8)到下一个断点 Step into(F5)进入到函数等里面 Step over(F6)到下一行代码 Step return(F7)返回到调用的下一行 Drop to Frame 返回到当前方法的第一行, Terminate (F12)终止虚拟机,程序就结束了。 (调试完后用) 右键 watch 观察变量的值

1.4 Breakpoints 窗口
移除所以断点

1.5 断点注意问题
1. 调完后,移除所以断点 2. 调完后,一定要结束断点的 JVM。

2

03-eclipse 常用快捷键

MyEclipse 设置工作空间默认编码 utf-8 等,使新建工程使用默认编码 菜单栏——Window / Preferences / General / Workspace 。 内容提示:Alt + / Content Assist 选中多行代码,按 Tab 键是整块向右推进,按 Shift+Tab 是整块向左缩进 快速修复:Ctrl + 1 导包:Ctrl + shift + O 格式化代码块:ctrl + shift + F 向前向后:Alt + 方向键(left right arrow)查看源代码时 添加注释 Ctrl+Shift+/ 除去注释 Ctrl+Shift+\ 查看源代码 Ctrl+单击 ctrl+shift+t 查看方法说明:F2
1

重置透视图 Window menu 下 更改为大写 Ctrl+Shift+X 更改为小写 Ctrl+Shift+Y 复制行 Ctrl+Alt+向下键(有些不能用) 查看类的继承关系 Ctrl+T 查看快捷键 Ctrl+shift+L

3

04-junit 测试框架

在 Outline 窗口方法上右键 Run As /JUnit Test 测试某一个方法,类上右键 run as /JUnit Test 测试这个 类的所有方法 1、用 junit 进行单元测试的时候,在每个被测试的方法中必须加上@Test 注解 2、用@Before 注解是在每个被测试的方法前执行。 3、用@After 注解是在每个被测试的方法后执行。 4、用@BeforeClass 注解的静态方法是在所有方法被测试之前执行的方法, 就像类里面的构造方法一 样。用来初始化一些要用到的变量等资源。 5、用@AterClass 注解的静态方法是在所有被测试的方法之后执行。相当于 c++中析构函数。用来释 放一些资源。 6、使用断言类 Assert 可以判断被测试的方法的返回值是否跟你预期的相同。 //person.java package cn.itcast.elclipse; public class Person { public void eat() { System.out.println("eating."); } public String run() { System.out.println("runing."); return "1"; } } //demo4.java package cn.itcast.elclipse; import org.junit.After; import org.junit.Before; import org.junit.Test; public class Demo4 { @Before public void before(){ System.out.println("before"); } @Test public void testRun() { Person p=new Person(); p.run(); } @Test public void testEat(){ Person p=new Person(); p.eat(); } @After public void after(){

System.out.println("after"); } } //Demo5.java package cn.itcast.elclipse; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class Demo5 { @BeforeClass public void beforeClass(){ System.out.println("beforeclass"); } @Test public void testRun() { Person p=new Person(); p.run(); } @Test public void testEat(){ Person p=new Person(); p.eat(); } @AfterClass public void afterClass(){ System.out.println("afterclass"); } } //Demo6.java package cn.itcast.elclipse; import junit.framework.Assert; import org.junit.Test; public class Demo6 { @Test public void testRun() { Person p=new Person(); Assert.assertEquals("2", p.run()); } }

4

java5 的静态导入和自动装箱拆箱.avi

JDK5 中新增了很多新的 java 特性,利用这些新语法可以帮助开发人员编写出更加高效、清晰,安全 的代码。 静态导入 自动装箱/拆箱 增强 for 循环 可变参数 枚举反射内省 泛型 元数据

4.1 静态导入
JDK 1.5 增加的静态导入语法用于导入类的某个静态属性或方法。 使用静态导入可以简化程序对类静 态属性和方法的调用。 语法: Import static 包名.类名.静态属性|静态方法|*
3

例如:

4.2 自动装箱/拆箱
JDK5.0 的语法允许开发人员把一个基本数据类型直接赋给对应的包装类对象(变量) , 或者赋给 Object 类型的变量,这个过程称之为自动装箱。 自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量。 典型应用: 静态导入 import static java.lang.System.out import static java.lang.Math.* //Demo1 package cn.itcast.demo; import static java.lang.System.out; import static java.util.Arrays.*; public class Demo1 { public static void main(String[] args) { out.print("main"); int []a=new int[]{6,5,3}; sort(a); for(int i:a) out.print(i); } } // main356 自动装箱/拆箱 package cn.itcast.demo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Demo2 { public static void main(String[] args) { Integer i=1;//装箱 int j=i;//拆箱 //典型应用 List list = new ArrayList(); list.add(1); int k = (Integer)list.get(0); Iterator it=list.iterator(); while(it.hasNext()) { int m=(Integer)it.next();//拆箱 } } }

5 06-增强 for 循环
5.1 增强 for 循环
引入增强 for 循环的原因:在 JDK5 以前的版本中,遍历数组或集合中的元素,需先获得数组的长度 或集合的迭代器,比较麻烦! 因此 JDK5 中定义了一种新的语法——增强 for 循环,以简化此类操作。增强 for 循环只能用在数组、 或实现 Iterator 接口的集合类上 语法格式: for(变量类型变量 :需迭代的数组或集合){ } Map map=new HashMap(); //Map map2=new LinkedHashMap<K, V>();

map.put("1", "aaa"); map.put("2", "bbb"); map.put("3", "ccc"); //传统方式 1 Set set=map.keySet(); Iterator it=set.iterator(); while(it.hasNext()){ String key=(String)it.next(); String value=(String) map.get(key); System.out.println("key="+key+",value= "+value); } //传统方式 2 Set set2=map.entrySet(); Iterator it2=set2.iterator(); while(it2.hasNext()){ Map.Entry entry=(Entry)it2.next(); System.out.println("key="+entry.getKey( )+",value="+entry.getValue()); } //增强 for 循环的 2 种方式 for(Object obj:map.entrySet()){ Map.Entry entry3=(Entry) obj; String key3=(String) entry3.getKey(); String value3=(String) entry3.getValue(); System.out.println("key3="+key3+",value3="+value3) ; } //增强 for 循环需要注意的问题:只适合取数据 int arr[]={1,2,3}; for(int i: arr){ i=10; } System.out.println(arr[0]); // 1 List li=new ArrayList(); li.add("1"); for(Object obj : li){ obj="888"; } System.out.println(li.get(0));// 1 //增强 for 循环的 1 种方式 for(Object obj:map.keySet()){ String key2=(String)obj; String value2=(String)map.get(key2); System.out.println("key2="+key2+",value2="+value2) ; }

6 可变参数
测试 JDK 中具有可变参数的类 Arrays.asList()方法。分别传多个参、传数组,传数组又传参的情况。 注意:传入基本数据类型数组的问题。 从 JDK 5 开始, Java 允许为方法定义长度可变的参数。语法: public void foo(int … args){ } 注意事项:
5

调用可变参数的方法时, 编译器将自动创建一个数组保存传递给方法的可变参数,因此,程序员可 以在方法体中以数组的形式访问可变参数 可变参数只能处于参数列表的最后, 所以一个方法最多只能有一个长度可变的参数 public void testSum(){ sum(1,2,3,4); int arr[]={5,6,7}; sum(arr); } public void sum(int ...nums){ //可变参数当成数组 int sum=0; for(int i:nums){ sum+=i; } System.out.println(sum); } public void bb(){ //public static <T> List<T>asList(T... a) List list=Arrays.asList("1","2","3"); System.out.println(list);//[1, 2, 3] String arr[]={"1","2","3","4"}; list=Arrays.asList(arr); System.out.println(list);//[1, 2, 3, 4] int nums[]={1,2,3,4,5}; list=Arrays.asList(nums); System.out.println(list);//[[I@120d62b] Integer nums2[]={1,2,3,4,5}; list=Arrays.asList(nums2); System.out.println(list);//[1, 2, 3, 4, 5] } //可变参数注意的问题 //public void aa(int ...nums,int s){}//不可以 //public void bb(int s ,int ...nums)//可以

7 枚举类
为什么需要枚举? 一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在 JDK5 以前 采用自定义带有枚举功能的类解决,Java5 以后可以直接使用枚举予以解决。 JDK 5 新增的 enum 关键字用于定义一个枚举类。

7.1 枚举类
枚举类具有如下特性: 枚举类也是一种特殊形式的 Java 类。 枚举类中声明的每一个枚举值代表枚举类的一个实例对象。 与 java 中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函 数必须为私有的(这点不难理解) 。 枚举类也可以实现接口、或继承抽象类。 JDK5 中扩展了 swith 语句,它除了可以接收 int, byte, char, short 外,还可以接收一个枚举类型。 若枚举类只有一个枚举值,则可以当作单态设计模式使用。 练习:请编写一个关于星期几的枚举 WeekDay,要求: 枚举值:Mon、Tue 、Wed 、Thu 、Fri 、Sat 、Sun 该枚举要有一个方法,调用该方法返回中文格式的星期。

Java 中声明的枚举类,均是 java.lang.Enum 类的孩子,它继承了 Enum 类的所有方法。常用方法: name() ordinal()//返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) 。 valueof(Class enumClass, String name) //返回带指定名称的指定枚举类型的枚举常量。 //String str=”B”;Grade g=Grade.valueOf(Grade.class,str); values() 此方法虽然在 JDK 文档中查找不到, 但每个枚举类都具有该方法, 它遍历枚举类的所有枚举 值非常方便。
package cn.itcast.enumeration; import org.junit.Test; public class Demo1 { @Test public void test() { print(Grade.B); } public void print(Grade g) // A B C D E { String value=g.getValue(); System.out.println(value); } }

package cn.itcast.enumeration2; import org.junit.Test; public class Demo1 { @Test public void test() { print(Grade.B); //89-80,良 } public void print(Grade g) // A B C D E { String value=g.getValue(); String value2=g.localeValue(); System.out.println(value+","+value2); } }

/* * class Grade{ private Grade(){ } * * * * * * */ //如何定义枚举的构造函数、方法、字段 enum Grade {// class A 100-90 B 89-80 C 79-70 D 69-60 E 59-0 A("100-90"), B("89-80"), C("79-70"), D("69-60"), E("59-0");// object private String value; private Grade(String value){ this.value=value; } public String getValue(){ return this.value; } } public static final Grade A=new Grade(); public static final Grade B=new Grade(); public static final Grade C=new Grade(); public static final Grade D=new Grade(); public static final Grade E=new Grade(); }

//带抽象方法的枚举 enum Grade {// class A 100-90 优 B 89-80 良 C 79-70 一般 D 69-60 差 E 59-0 不及格 A("100-90"){ public String localeValue(){ return "优"; } }, B("89-80"){ public String localeValue(){ return "良"; } }, C("79-70"){ public String localeValue(){ return "一般"; } }, D("69-60"){ public String localeValue(){ return "差"; }
7

}, E("59-0"){ public String localeValue(){ return "不及格"; } };// object private String value; private Grade(String value){ this.value=value; } public String getValue(){ return this.value; } public abstract String localeValue(); }

7.2 反射什么—Class 类
反射就是把 Java 类中的各种成分映射成一个个的 java 对象。例如,一个类有:成员变量,方法,构 造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。 Class 类用于表示.class 文件,画图演示一个对象的创建过程。 如何得到某个 class 文件对应的 class 对象。 类名.class, 对象.getClass() Class.forName(“类名”) 以上三种方式,JVM 都会把相应 class 文件装载到一个 class 对象中(只装载一次) 创建类的实例:Class.newInstance 方法 数组类型的 Class 实例对象 Class.isArray() 总之,只要是在源程序中出现的类型,都有各自的 Class 实例对象,例如,int,void? 反射就是把 Java 类中的各种成分映射成一个个的 java 对象。例如,一个类有:成员变量,方法,构 造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。 掌握反射技术的要点在于:如何从一个 class 中反射出各个组成部分。反射出来的对象怎么用。

7.3 Constructor 类
Constructor 类代表某个类中的一个构造方法 得到某个类所有的构造方法: 例子:Constructor [] constructors= Class.forName("java.lang.String").getConstructors(); 得到某一个构造方法: 例子: //获得方法时要用到类型 Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class); 创建实例对象: 通常方式:String str = new String(new StringBuffer("abc")); 反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc")); Class.newInstance()方法:例子:String obj = (String)Class.forName("java.lang.String").newInstance(); 该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。

7.4 Field 类
Field 类代表某个类中的一个成员变量 问题:得到的 Field 对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个, 而该类的实例对象有多个,如果是与对象关联,哪关联的是哪个对象呢?所以字段 fieldX 代表的是 x 的定义,而不是具体的 x 变量。(注意访问权限的问题) 示例代码: ReflectPoint point = new ReflectPoint(1,7); Field y = Class.forName("cn.itcast.corejava.ReflectPoint").getField("y"); System.out.println(y.get(point)); //Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getField("x"); Field x = Class.forName("cn.itcast.corejava.ReflectPoint").getDeclaredField("x"); x.setAccessible(true); System.out.println(x.get(point));

7.5 Method 类
Method 类代表某个类中的一个成员方法 得到类中的某一个方法: 例子: Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class); 调用方法: 通常方式:System.out.println(str.charAt(1)); 反射方式:System.out.println(charAt.invoke(str, 1)); 如果传递给 Method 对象的 invoke() 方法的第一个参数为 null ,这有着什么样的意义呢?说明该 Method 对象对应的是一个静态方法! jdk1.4 和 jdk1.5 的 invoke 方法的区别: Jdk1.5:public Object invoke(Object obj,Object... args) Jdk1.4:public Object invoke(Object obj,Object[] args),即按 jdk1.4 的语法,需要将一个数组作为参数 传递给 invoke 方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用 charAt 方 法的代码也可以用 Jdk1.4 改写为 charAt.invoke(“str”, new Object[]{1})形式。

7.6 用反射方式执行某个类中的 main 方法
目标:写一个程序,这个程序能够根据用户提供的类名,去执行该类中的 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,new String[]{“xxx”}),javac 只把它当作 jdk1.4 的语法进行理解,而 不把它当作 jdk1.5 的语法解释,因此会出现参数类型不对的问题。 解决办法: mainMethod.invoke(null,new Object[]{new String[]{"xxx"}}); mainMethod.invoke(null,(Object)new String[]{"xxx"}); ,编译器会作特殊处理,编译时不把参数当作数 组看待,也就不会数组打散成若干个参数了 package cn.itcast.reflect; package cn.itcast.reflect;
9

import java.io.InputStream; import java.util.List; public class Person { public String name="aaaa"; private int password; private static int age=23; public Person(){ System.out.println("person"); } public Person(String name){ this.name=name; System.out.println("person name"); } public Person(String name,int password){ this.name=name; System.out.println("person name password"); } private Person(List list){ System.out.println("list"); } public void aa1(){ System.out.println("aa1"); } public void aa1(String name,int password){ System.out.println("name= "+name+" password="+password); } public Class[] aa1(String name,int[] password){ return new Class[]{String.class}; } private void aa1(InputStream in){ System.out.println(in); } public static void aa1(int num){ System.out.println(num); } public static void main(String []args){ System.out.println("main"); } }

import java.lang.reflect.Field; import org.junit.Test; //反射类的字段 public class Demo4 { //public String name="aaaa"; @Test public void test1() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person"); Field f=clazz.getField("name"); Person p=new Person(); Object value= f.get(p);//获取字段值 Class type=f.getType();//字段类型 System.out.println(type);//class java.lang.String if(type.equals(String.class)){ String S_value=(String)value; System.out.println(S_value);//aaaa } //设置值 f.set(p, "ppppp"); System.out.println(f.get(p));//ppppp System.out.println(String.class);//class java.lang.String } //private int password; @Test public void test2() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person"); Field f=clazz.getDeclaredField("password"); f.setAccessible(true); Person p=new Person(); f.set(p, 123); System.out.println(f.get(p));//123 } //private static int age=23; @Test public void test3() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person"); Field f=clazz.getDeclaredField("age"); f.setAccessible(true); System.out.println(f.get(null));//23

} } package cn.itcast.reflect; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; import org.junit.Test; //反射类的构造函数,创建类的对象 public class Demo2 { //public Person() @Test public void test1() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person "); Constructor c=clazz.getConstructor(null); Person p=(Person) c.newInstance(null);//person System.out.println(p.name);//aaaa } //public Person(String name) @Test public void test2() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person "); Constructor c=clazz.getConstructor(String.class); Person p=(Person) c.newInstance("abc");//person name System.out.println(p.name);//abc } //public Person(String name,int password) @Test public void test3() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person "); package cn.itcast.reflect; import java.io.FileInputStream; import java.io.InputStream; import java.lang.reflect.Method; import org.junit.Test; //反射方法 public class Demo3 { // public void aa1() @Test public void test1() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person"); Method method=clazz.getMethod("aa1", null); Person p=new Person();//person method.invoke(p, null);//aa1 } //public void aa1(String name,int password) @Test public void test2() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person"); Method method=clazz.getMethod("aa1", String.class,int.class); Person p=new Person();//person method.invoke(p, "xxxx",99);//name= xxxx password=99 } //public Class[] aa1(String name,int[] password) @Test public void test3() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person"); Method method=clazz.getMethod("aa1", String.class,int[].class); Person p=new Person();//person Class cs[]=(Class[]) method.invoke(p, "xxxx",new int[]{1,2,3});//name= xxxx password=99 System.out.println(cs[0]);//class java.lang.String } //private void aa1(InputStream in) public void test4() throws Exception{
11

Constructor c=clazz.getConstructor(String.class,int.class); Person p=(Person) c.newInstance("abc",999);//person name password System.out.println(p.name);//abc } //private Person(List list) @Test public void test4() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person "); Constructor c=clazz.getDeclaredConstructor(List.class); c.setAccessible(true);//暴力反射, 统统打开访问权限 Person p=(Person) c.newInstance(new ArrayList());//list System.out.println(p.name);//aaaa } //创建对象的另外一种途径, 无参构造 方法,等效 test1 public void test5() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person "); Person p=(Person) clazz.newInstance(); System.out.println(p.name);//aaaa } }

Class clazz=Class.forName("cn.itcast.reflect.Person"); Method method=clazz.getDeclaredMethod("aa1",InputStream.clas s); method.setAccessible(true); Person p=new Person();//person method.invoke(p,new FileInputStream("C:\\1.txt"));// } //public static void aa1(int num) public void test5() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person"); Method method=clazz.getMethod("aa1",int.class); method.invoke(null,777);//777 静态方法调用 不需要对象,给对象也行 } // public static void main(String []args){ public void test6() throws Exception{ Class clazz=Class.forName("cn.itcast.reflect.Person"); Method method=clazz.getMethod("main",String [].class); //method.invoke(null,new String[]{"a","c"});//Wrong //method.invoke(null,"a","c");//Wrong String []str={"x","y","z"}; method.invoke(null, (Object)str); method.invoke(null, new Object[]{new String[]{"a","c"} }); method.invoke(null, (Object)new String[]{"a","c"}); } }

7.7 用反射技术实现一个简单的 web 服务器
内省(Introspector) — JavaBean Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、 事件和方法的知识提供了一个标 准方法。 什么是 JavaBean 和属性的读写方法? 有 get 或 set 方法就是一个属性,另外所有类继承了 Object 类的 getClass()方法,所以还有一个属 性 class。

访问 JavaBean 属性的两种方式: 直接调用 bean 的 setXXX 或 getXXX 方法。 通过内省技术访问(java.beans 包提供了内省的 API),内省技术访问也提供了两种方式。 通过 PropertyDescriptor 类操作 Bean 的属性 通 过 Introspector 类 获 得 Bean 对 象 的 BeanInfo , 然 后 通 过 BeanInfo 来 获 取 属 性 的 描 述 器 ( PropertyDescriptor ) ,通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后 通过反射机制来调用这些方法。 什么情况下用内省? package cn.itcast.introspector; //该类共有 5 个属性 public class Person { private String name; private String password; private int age; public void setAb(int a){ } public String getName() { return name; } public String getPassword() { return password; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setPassword(String password) { this.password = password; } public void setAge(int age) { this.age = age; } } package cn.itcast.introspector; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.junit.Test; public class Demo1 { //得到 bean 所有属性 public void test1() throws IntrospectionException{ BeanInfo info=Introspector.getBeanInfo(Person.class); //去掉 Object 里的属性 BeanInfo info2=Introspector.getBeanInfo(Person.class,Object.class); PropertyDescriptor[] pds=info.getPropertyDescriptors(); for(PropertyDescriptor pd:pds){ System.out.println(pd.getName()); //ab age class name password } } //操纵 bean 的指定属性:age @Test public void test2() throws Exception{ Person p=new Person(); PropertyDescriptor pd=new PropertyDescriptor("age", Person.class); //得到属性的写方法,为属性赋值 Method method=pd.getWriteMethod(); method.invoke(p, 45); System.out.println(p.getAge());//45 //获取属性的值
13

method=pd.getReadMethod(); System.out.println(method.invoke(p, null));//45 } //高级内容,获取当前操作的属性的类型 @Test public void test3() throws Exception{ Person p=new Person(); PropertyDescriptor pd=new PropertyDescriptor("age", Person.class); //得到属性的写方法,为属性赋值 Method method=pd.getWriteMethod(); System.out.println(pd.getPropertyType());//int method.invoke(p, 45); System.out.println(p.getAge());//45 //获取属性的值 method=pd.getReadMethod(); System.out.println(method.invoke(p, null));//45 } }

7.8 内省—beanutils 工具包
Apache 组织开发了一套用于操作 JavaBean 的 API,这套 API 考虑到了很多实际开发中的应用场景, 因此在实际开发中很多程序员使用这套 API 操作 JavaBean,以简化程序代码的编写。 在工程下新建 lib 目录,导入 commons-beanutils-1.8.3.jar 和支持包 commons-logging-1.1.1.jar 选中两个包,右键 build path/add to build path Beanutils 工具包的常用类: BeanUtils PropertyUtils ConvertUtils.regsiter(Converter convert, Class clazz) 自定义转换器 package cn.itcast.beanutils; package cn.itcast.beanutils; import java.util.Date; public class Person { private String name; private String password; private int age; private Date birthday; public Date getBirthday() { return birthday; } public void import java.lang.reflect.InvocationTargetException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConversionException; import org.apache.commons.beanutils.ConvertUtils;

setBirthday(Date birthday) { this.birthday = birthday; } public String getName() { return name; } public String getPassword() { return password; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setPassword(String password) { this.password = password; } public void setAge(int age) { this.age = age; } }

import org.apache.commons.beanutils.Converter; import org.apache.commons.beanutils.locale.converters.DateLocaleConverter; import org.junit.Test; //使用 beanUtils 操纵 bean 的属性 ( 第三方) public class Demo1 { @Test public void test1() throws Exception{ Person p=new Person(); BeanUtils.setProperty(p, "age", 456); System.out.println(p.getAge());//456 } @Test public void test2() throws Exception{ String name="aaaa"; String age="123"; String password="pw"; Person p=new Person(); //支持 8 种基本类型自动转换 BeanUtils.setProperty(p, "name", name); BeanUtils.setProperty(p, "age", age); BeanUtils.setProperty(p, "password", password); System.out.println(p.getName());//aaaa System.out.println(p.getAge());//123 System.out.println(p.getPassword());//pw } @Test public void test3() throws Exception{ String birthday="1983-12-1"; //为了让日期赋值到 bean 的 birthday 属性上, 给 beanUtils 注册一个日期转换器 //ConvertUtils.register(converter, clazz); ConvertUtils.register(new Converter(){ public Object convert(Class type, Object value) { if(value==null) return null; if(!(value instanceof String)){ throw new ConversionException(" 只 支 持 String 类型的转换"); } String str=(String)value; if(str.trim().equals("")) return null; SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd",Locale.US);
15

try { return df.parse(str); } catch (ParseException e) { throw new RuntimeException(e); } } }, Date.class); Person p=new Person(); BeanUtils.setProperty(p, "birthday", birthday); System.out.println(p.getBirthday());//pw System.out.println("___"+BeanUtils.getProperty(p, "birthday")); } public void test5() throws Exception { Map map=new HashMap(); map.put("name", "aaa"); map.put("password", "123"); map.put("brithday", "1980-09-09"); ConvertUtils.register(new DateLocaleConverter(), Date.class); Person p=new Person(); //用 map 集合填充 bean 属性,map 关键字和 bean 属性要一致 BeanUtils.populate(p, map); } }

7.9 泛型(Generic)—泛形的作用
JDK5 以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制 转换,这样不可避免就会引发程序的一些安全性问题。例如: 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;i<list.size();i++){ (?)list.get(i); //此处取出来的对象应转换成什么类型 } JDK5 中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能 发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。 注意:泛型是提供给 javac 编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上, 即挡住向集合中插入非法数据。但编译器编译完带有泛形的 java 程序后,生成的 class 文件中将不再 带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除” 。 泛形的基本术语,以 ArrayList<E>为例:<>念着 typeof ArrayList<E>中的 E 称为类型参数变量 ArrayList<Integer>中的 Integer 称为实际类型参数 整个称为 ArrayList<E>泛型类型 //运行时会出错,但编码时发现不了

整个 ArrayList<Integer>称为参数化的类型 ParameterizedType

7.10

泛型典型应用

使用迭代器迭代泛形集合中的元素。 使用增强 for 循环迭代泛形集合中的元素。 存取 HashMap 中的元素。 使用泛形时的几个常见问题: 使用泛形时,泛形类型须为引用类型,不能是基本数据类型 //使用泛型时,如果两边都使用到泛型,两边必须一样 ArrayList<String> list = new ArrayList<Object>(); //bad ArrayList<Object> list = new ArrayList<String>(); //bad ArrayList<String> list = new ArrayList ();//ok ArrayList list = new ArrayList<String>();//ok package cn.itcast.generic; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class Demo1 { @Test public void test1(){ List list=new ArrayList(); list.add("111"); list.add("222"); list.add("333"); //传统方式手工转换 String i=(String) list.get(0); //下面注释代码手工转换编辑不报错, 运行错误 //Integer ii=(Integer) list.get(0); System.out.println(i); } @Test public void test2(){ List <String>list=new ArrayList<String>(); list.add("111"); list.add("222"); list.add("333"); //现在不需要强制转换 String i=list.get(0); //下面注释代码编译通不过 //Integer ii=(Integer) list.get(0); System.out.println(i); }
17

package cn.itcast.generic; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.junit.Test; public class Demo2 { @Test public void test1(){ List <String>list=new ArrayList<String>(); list.add("111"); list.add("222"); list.add("333"); //传统 Iterator<String> it=list.iterator(); while(it.hasNext()){ String value=it.next(); System.out.println(value); } //增强 for for(String s:list) System.out.println(s); } @Test public void test2(){ Map<Integer,String> HashMap<Integer,String>(); map.put(1, "aaa");

map=new

}

map.put(2, "bbb"); map.put(3, "ccc"); //传统 keyset entryset Set <Map.Entry<Integer, String>> set=map.entrySet(); Iterator <Map.Entry<Integer, String>>it=set.iterator(); while(it.hasNext()){ Map.Entry<Integer, String>entry=it.next(); int key=entry.getKey(); String value=entry.getValue(); System.out.println(key+"="+value); } //增强 for(重点) for(Map.Entry<Integer, String> entry:map.entrySet()){ int key=entry.getKey(); String value=entry.getValue(); } } }

7.11

自定义泛形——泛型方法

Java 程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进 行声明,语法:<T>,T 可以是任意字母,但通常必须要大写。<T>通常需放quot;=恐 " Sys巍i制胀ǚ/();O"); //传统穏t;逑uot;ppppp"); System.out.println(f.get(p));//ppppp System.out.println(String.class);//class java.lang.Strin颓欠gtue(); Somtring纋t;T&gsetoid se
恢蒙先绻慕换涣奖); Somtring纋t;T&g式使ic Ob;逑方法传并颠倒法进行处rson如果两眎d fooetu俊;些eger&拍芑岚殆明,语防嘈图述数组秉,鳎into以同时俊(注t = neprintln(String.class);//cK," Vmpor* * * K增强 } public v set2=map.ent士1ind须对泛形进 行声明ot
d Ar獭 多处都class)弯成一bject&俜瓷溲ing蓝苑涸谀墓兀侍獯惺钡奈 什么Map<K jav莞椒ǖn p=ne转换,誅aot;); Syste0 B 89-80 Tnew Re1return passwordaveStr法|需ot;); maTmporIdst; imd鑟可 以晕榷hrows E而 不癷st 对泛时的问ew OObj),对泛形进 public class Demo1 { @Test rator; import java.util.Lisval毒倮唷P的元窃谒鵤val毒倮嗄墓厥钡奈蛅ry list.add("2ic vt;); map.put(&quaeof athod.inv绞 1 Set se鑟t;); mat;); Syster(StriStrinint getAge(t;); ,E,Kquot erson(Stri,E e,K增nint () {() { System.st =6ng> Syst vt;); map.put(&quaeof oidthod.inv绞 1 Set se鑟t;); mar(StriStrinint getAge(t;);E,Kquot erson(Stri,E e,K增nint //哪关时的瓮而 裁饩陀诙hrows Eame("cn.itg> Systr(StrcStrinint 士1操仔的元 Prolib 行赏ㄅ浞

一个枚举lt;T&g式使ic O题:传并打永闯题: 使觬son如果bad 下所矗篊 ersonintln s; lPersirtlue); } //增强 c } p然竦<Inteect c } pt;(); list.add(&quoy); Syst匦胍谎桓龀稍 int 蛴腊踩玼tin 的 ses.forN题:传瞚nt 蛴榔渲谐猓骸Mㄅ浞陀趌,(O enum 筰stp));//一个可一个程d 下行该篊 ersonintln s; lPersirtlue)?quot c } prt(ClPersirtlue)?quot(发音为:(ObjectClPersirt 个硊nknow袢∽侄沃p然竦&n 的 seect c } pt;(); list.add(&quoy); Syst此上 懈孟滦/ 1 List 是篊 由相蚷ntln 在所ac时, 盒渭(ClPersirtlue)?quot形信 对&quo不确;//t = ne导入 co在所体北鋓nt峁┝由的 c相果的lt;T&gprin /增莂va 允懈髦结:话is?通配符主clas于 lislass c话is了?通配符稳定 int调 变量傻 c无果的lt;T&g鋓nt峁受 变量傻 c椒?的lt;T枚举类当编械脑 Prolib 行捎行(拥耐ㄅ浞

a 程通配符的上边 lis正确:V┝艘籰ue)?t jends Numb涣

ass.f33&qV┝艘籰ue)发现不了

;); ;Str:V┝艘籰ue)?t jends Numb涣

ass.f33&qV┝艘籰ue)st<String&ga 程通配符的下边 lis正确:V┝艘籰ue)?suite ArrayLi

ass.f33&qV┝艘籰ue)Numb涣

;); ;Str:V┝艘籰ue)?suite ArrayLi

ass.f33&qV┝艘籰ue)B习> lis匦胍谎以下publ行tem衯ate; Person p=/增莔.out.pr? t jends n.itcast.generinin); //下面注释代 @Test publ
1;aaa士1te.Anno数据t.p康茸) 概述



调用楷这变参数的方法 语了对绦蚨岳(t paean 2,取祋uo, io.I)稟nno数据t.p康茸)te Stri)稟nno数据t.ging-翱等资悦饩?三 自动瞖anno数据t.: @O reride: a 程重写父类lt;T,一缚等譸 map=(p)); @DepreBeaed:受模 对蟘ast念着 绻(类,tp));/)已过 重@SuppressWarer; s: 抑制跋欤警告.nno数据t. 其实.I)publ纈nfage 标记,瑃 或 s Be里康茸试亍 使是篊to以蚥lic cl Berip ot;c姆椒ㄖ康茸ging决定:Co去 <毒倮鄏 类康茸 Bector 纋isot;100-9@Befoot;1c cl@Bef开发16nd须对泛nno数据t.

一个鹣 裕nno数据t.纠嘈蚿tion@tlnerfa实老蟊4 Syst康茸试w Prop裕nno数据t.臼詗 PrSyststructor.newInumCla;裕nno数据t.緒 Pr:得值Syststructde.class,strextdefaul 类不对的;for殊); BegetKe砟掣果康茸p衞n、Tue椒化String试w Pro牵ǎtio拖窭/ba传统贰翨egetKe=募ne祊rintl@MyAnno数据t.p嗖欢詐 集合堂毒倮嗟Ite.enu,如nno数据t.

如nno数据t. 指修饰裕nno数据t.臼栽no数据t.。数据类的集合d 下如nno数据t.op訞R&quon:etur翘醝on相托 饰裕相集合nno数据t. 定 义痈砳on相椭 定 vok蟦no数据t. 瓤杀 倍举簦挥蛴赋@R猯ne&quon In轰成一ot;ne&quonPoPery纠嘈捅鋁 代表的,publi下用时会eㄓ蛸类t;ne&quonPoPery.CLASS: 可变参拾裡st 记录,t道韵 Cl中. 当 <嚼吹饔谜飧参数槔嘈nput保留佐性. 这 Re旱弥掂t;ne&quonPoPery.RUNTIME: 可变参拾裡st 记录,t道韵 Cl中. 当 <嚼吹饔谜飧参数槔嘈ut保留佐性. 念着to以蚥lic clescr桓康ackt;ne&quonPoPery.SOURCE: 可变彩也潭鈛o策翽ro康ack@bean :etㄍ像儡模奘嘻.类胒leX 代.k@bean In轰Object名疭tring试X 代表的.k@Docubllned:受模瑃ū桓萌鏽no数据t. 修饰 裕nno数据t.纠嘟涣除”doc此在侍岘来蒻era.k@Inh@Tened:时涣它托 饰凿 裕nno数据t.窘 具ss。继 承椒ǎ.oot 果 某嗉 从话阉 uti被罖Inh@Tened托 饰凿 裕nno数据t.,蚱渥樱 仁荒; publ@Bef开发18

提k蟦no数据t. 例:te.enu,这,tst; //反射类的构 In bui动装k蟦no数据t.Eleblln 个枚,一父雒秅.St别上,傅拿毒佘康ack pa钭 绻 当成一ono数据t.纠嘈捅觥R逦0

泛衞no数据t.緎um(桓康ac才涑桑悍盒褪见痈车眛道韵 Cl被猎厝用蛋踩瑃道韵 Cl中 裕nno数据t.静舥t被虚拟机读k念着to以峁┝耍nno数据t.Eleblln s.forNd 下p));来峁nno数据t.纠簍e嵌1;aaTip:动态代理

,tst; <vokes.fo纾成一个竬strosp倮 Sys要幕t"e(“类铭理lass c下用代理zz=Cla液褪粜成一个来幕 通过氖紫纫器市ons于生 成代理zz=C//t 上三种拂市o幕代理zz=C//t t>个以简缓lec理谁oot;1幕代理zz=Clec理谁vatSat 成一个 Classng-皀g”).ge扩展了记住ec理类ec理eflectPo上三种纺基贝韟z=CvatSat 成一p));幕代理zz=Cvδ躳));倪程序publ幕代理zz=C)p把员ls-类醚 纋┙来调有了 Objecteanuxy纠喾瓷浞建:膄33&Class 实例对稀⒒蚣基眛&ote(“类铭理lass cio桓龀稍生 成代理zz=C/ba/ 1三 妆, j旱饔幕代理zz=Cioefle类在源on 2幽基眅flectPo械 理lass c褪粜个枚t 3幽基毙的 理lass的lt;T里涪生问事么M伞 泛型 元数 h亩詌te =new Lseto来tㄉ先初学 listll,new或不ll,nlist记住耗f2 件事情j旱anuxy纠喔涸餋las 理lass//bad Artㄗ発h亩詌te(笮统数资裁茨牵╮t ap=户射方代理zz=C//生问个类 cl个成詉st巧浞酱型呈齣nvoke(Object 接械上嗤应一个参数 Obje/ 1三 妆, j捍韟z=Cuot;89-8p));//保 ja既 rt a代理zz=Ceflep)); 射方葱统数invoke(Object @list把e约核w L载到尧e约海Except应一个参数5膌t;T&B”ot;89//保螅ńtem

2;abc量 諸ip:动态代理lib

,动态代理 Be里么M勺 At ap=户射方代理zz=C//生问个嘀 cist巧浞健 泛型 元数沮大型呈齣nvoke(Object , by相当相陀σ桓霾问拦.is了代理zz=C//t;89/cep盉”;G并且ba聪滦人 = ja应一个参数5谋, ja诩傅拿在墓.i耐鄙分纏=户射方ject生问个嘀 cterat菔疽这gt个ayListkage c Bean 些髅惰

eprintl墓.p=户赡峁请

eng-觳閜=户是否浦峁﹖cas、动态为t&ote(“添加额妥试枚举枚举类2;ab题从源onab题从源on负责将 .getClass(ean褪翘代屡盘上, io褪翘代网络ash) 从源题Z存中痈巢⑽基眗ospectst; //反射d(&quolass.当t槔嘈浞绞时煞会形成由三 滋獯釉磑nss pa //题从源on层次结构ㄌ遒类2indbootrso缘例对lo&qurndbootrso缘例对lo&qur谎引导(也法原始)题从源on形的负责从源嚼吹饔位炙/t 上下用从源onoint(id t髅泛形的型际上y = tst; //反射d(&quLo&qur游蛔樱 ew O权仙t槔嘈自身 Bea的ivao以蚥li的 m变 下publ来ingB bootrso缘例对lo&qur 从源pec切┲诵/t 縡ooeURL); urls=sun.misc.Launaparss,Obootrsod(&quPter,Los,OURL } //操 st; ims.fLising> urls.lengthisi限謢 pt;(); list.add(&quourls[i].toE jerde(p; ig key3abc因类性阡方蕂in焙蚓妄只拇釉此,ütem.ou在系统); BeCLASSPATH堇鄑ㄕ庑┨饪f开发 impt jenbirt缘例对lo&qurndt jenbirt缘例对lo&qur -雒毒题从源on形的负责从源嚼RE游祸枚/add ↗AVA_HOME/jre vob/t j P者仙tst; /t jadirs 系统); Btǚ盒┱ JAR In上下t; l入除嚼吹饔炙/t 以兔泛新枚举辛 Object 雷蓟 制。因:得到雒毒/add对rson从弯成一 JRE又袖方蕂i类衖st峭ㄓ蟹盒蔚过姆湃胂掠/add个 JAR 类包对rsonoi类械郊stest2缘例对lo&qur衖st强杉拿毒倮2北鄐test2缘例对lo&qur编stest2缘例对lo&qur -系统(也法lib )题从源on形的负责,t 类斜讳方适鄙反釉蠢醋迷诿睿ㄕ獾悴荒-道詒ter P者tst; /道=neer低); B P者tCLASSPATH蔹 co系统); B所tǚ JAR 类包簓pe路 径;Gao以蚥li秇rows Ead(&quLo&quros,Ot;(); d(&quLo&qur()找到; pu从源on。掣果胾俊特别t╠ 、p=户 class rNd魏嘻.从源on都将; pu从源on会按ǎ耗父从源on。开发 te.全盘负责委托ass

道詌o&qur 从源个感泛穏t谈涸鹞衋ss 上三谈涸穑杭ǎ┑背梢籵道詌o&qur 从源成一 d(&quooin焙 c下用 d(&quoü赖位滞 lis难冷中 d(&quo= new灿上掠 道詌o&qur 负责载扔上任衋ss yL让 purlln(父)题从源on寻找batu俊,tpurlln ; impooin焙虿糯觘约//t 路径中去寻 ; 上塞.从源还一个装kc发中篴ss 砟掣果kc发中褐邪踩玼t下用 d(&quo定 也蘟lue藃eg掣果胾俊才从 Array读tte和赡 发 d(&qu传并存buil发中 c下.I)以前 采薷淖発d(&quoo莑ist重新浞绞嚼类衝拍苌,并且塞.只从源程序,拳因倮郒ttpUrl bnersirt衝pric)yMetipse :Co去聪滦性、 右键开发 6ndTip: DTD为参数聪附表 绻R ;ab,tDTD蝝eratiptionELEMENT Syst成一 XML 绻碝ap<K jav所矗篊 g>!ELEMENT 绻椒 绻嘈退

a 绻嘈痛撤g 绻鹥ert举类pe

7如早果pert砟 騧.ouptio()括起来eg掣ng>!ELEMENT 书架 (书a 程作者 c慧价)

ag>!ELEMENT 书名 (#PCDATA)

a如早果t = ne则枚举篱写egDTD喂娣兜募蟙 下几种t = n EMPTY:的每一个空 绻磒ring>br/

ag>hr/

aANY: 对显绻鹥ert程d;逑t = 楸绻鹥ert,傅拿ptiod 下p) 数祝 ppert位譻 喂叵迭g果pertptio空白符分隔 亩韵}); 顺序胾俊凇

g>!ELEMENT MYFILE (TITLE AUTHOR EMAIL)

a×受 汉欧指羝 亩韵pert位}); 顺序list与继承潮成致em.out!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)

a用|分隔 亩韵任选其襛bc即(注p ma}); 成一 .out!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)

a薪果pert,可以接蕋io+、*、?等符号 对显绻鹙ava 洞, j旱+: 姨序或多次 (书+)
impo?: 0 序或姨序 (书?) *: 0 序或多次 (书*nsto褪ptio圆括号( )批量ass)么pr .out!ELEMENT MYFILE ((TITLE*, AUTHOR?StrMAIL)* | COMMENT)

开发 IteTip:.intrR

xml蝝erati≈嘘签.int需= jaATTLIST 为其ass)); BeMap<Kj旱.out!ATTLIST 绻5 以欠515 以侵祊e

7ass)t in5 以欠525 以侵祊e

7ass)t in5……

aw PrSystt.T j旱.out!ATTLIST 商品塞.别 CDATA #REQUIRED 颜色 CDATA #IMPLIED

arosp XML ass()旱.out商品塞.别y=entry服装p 集合 颜色y=entry黄色);
15



?.out/商品

ag>商品塞.别y=entry服装p 集合

?.out/商品

aass)t in)旱#REQUIRED: istass))); Be#IMPLIED篊to以ass)可以接不ass) #FIXED:t invoew Pro取值固法
プed ≮ XML ass(绦 ma为voew Pass)冷中值艿接m.ou为voew椒ㄐ了 下用值嗝毒倮嘁瞖旱弥淀 XML ,傅拿ass))值可以接不ass)voew P值艿 枚籥ss)则ptioe旱弥甸秉t.T j旱.out!ATTLIST 页@Te髡 姓方5CDATA #IMPLIED 年龄5CDATA #IMPLIED 联系例: CDATA #REQUIRED 网站职务 CDATA #FIXEDString&页@Te髡遬 集合 Ob税 CDATA p 集合上网p 集合

开发 8

Tip:acka 以侵祊e

hodDATA: 对 以侵滴谋 的语烽秉ENUMERATEDSIrt NTITY(实体)开发 ;aaTip: 以侵祊e

?麰NUMERATED用穡 Propert传统穏一组取值,男盠ist XML ass(绦ass)试w Pr值p ma是下用男盠harAt&用值(&quo).out?xml蝘s.birts.f=list.g.ng getV巍猚o Stgy=entryGB231手工转 tr=(dalon BeanUtiyes=list.?quot .out!DOCTYPE 购物篮 [mpo.out!ELEMENT 肉 EMPTYquot .out!ATTLIST 肉 品种ean鸡肉 | 牛肉 | 猪肉 | 鱼肉 ).list.鸡肉);
15



]quot .out购物篮quot .out肉 品种y=entry鱼肉);
15
/

ag>肉 品种y=entry牛肉);
15
/

ag>肉/

ag>/购物篮quotuctorp 諸ip: 以侵祊e

?麵D

对 以堑纳ss);/
プ⑽ǔ芍甸秉Irt,获取当p map蓇ot;pp下划线变参new Arjava空白 的觰ctor;abTip:.堤錼R

.堤宓拿
ザ蝡ertClasject 餫 程以后 XML asratikage c tio 餫 lis这段pert了楸瑃DTD蝦R逯猩涑商.out!ENTITY ?quot语句的每一个际醴玫体te S堤蹇砸籲ve谑 = n lisS堤搴/运行玫体teuctorindTip:.堤錼R? lisS堤

lisS堤逯鱟l XML asrati被lib eMap<Kj旱.out!ENTITY 玫体方法 “玫体pert颈

:枚举 编曳⑸堤錺ert lisance()&玫体方法;黷.T j旱.out!ENTITY copyrigh 类睮 am a蚷nog的詍涣;
15



a…… 薬mp;copyrigh 开发3impTip:.堤錼R?运行玫体

运行玫体被罝TD蝝e件自身 tionMap<Kj旱.out!ENTITY % S堤宸椒 ;
15
傻体pertp 集合

lisance()%玫体方法;黷.T 1j旱.out!ENTITY % TAG_NAMES ;
15
姓方5|trMAIL5|t电话5|t地址;
15



a.out!ELEMENT Ob死 (%TAG_NAMES;5|t生日)

ag>!ELEMENT 客户例: (%TAG_NAMES;5|t公司名)

at.T 2j旱.out!ENTITY % he.com.at.Enbu(Pe ;
15
imd麵rt#IMPLIED accoy&q CDATA #REQUIRED p 集合

te. 魑.out!ATTLIST pur颍瑂eOrqur%he.com.at.Enbu(Pe



a.out!ATTLIST enem%he.com.at.Enbu(Pe



开发3北郥ip:XML 解析 Be概述

XML 解析ance一nve谑。涸象lic saxlanm:(Docubllnin 的 seModed.i即meractPoiP蚸av W3C很多惩萍剩型 XML Inte省技术te saxj旱(ceptio绦虼获礨ML)衝p是官方标譫 to男 XML 社区事实关时标譫 t几乎rsonoi疿ML 解析过范嫉quo薾上 XML 解析on Cot;est、Xer得怠眔Aelfod 2 XML 解析聪滦 BeJaxp、Janm、anm4j开发3te.Tip:JAXPte.AXP獗渎 B)方2SE游灰荒件秐e的 蓆st; x.xml、aleCw3c.韵髄、aleCxml.saxl包及其子包譻 吴,tst; x.xml=new Prs 包中射的集合停右姬 ew以此提1.4 的些右姬 ew传统tln(飧鰔ml蝝era); l 解析泛 DOM PrSAX游唤馕鰋n载到一开发36ndTip: tion.AXP); l DOM馕

st; x.xml=new Prs 包 ,,然DocubllnBConverF 对oassion相痛 ld DOMe S剑籩fo唯过反飧鍪粜istDocubllnBConverF 对oass属性的抽问桃姬 ew它w Ar枚举 反化 to; pu辛 Objecte33&Class 实例独嘀别: lep));会 问摊瞖仄教╡旱冒沧拔唤馕鰋n程字荒Clasject桃姬 L载到并alue一开发3IteTip:ingB .AXP庹 DOM馕鰋nabxceptDocubllnBConverF 对oasect.Person"p));/ln(Clas DOM馕鰋n试靡姬上 xcep靡姬ǎ jdk33&DocubllnBConvertp));/ln( DOM馕鰋n载到一竫ceptDOM馕鰋n载到个 new Pejdk1.5解析 XML as礶d /ln(C.St形集mera籇ocubllnolass&g饰—〈齿示襱DOM齛yLi对形集篨ML asz);; l co了楸黵ator; import javaxmlt public voidx.xml=new Prs.DocubllnBConvert public voidx.xml=new Prs.DocubllnBConverF 对oast public voidx.xml=new Prs.ls.ser bfigur輙. java.util.Locale;aleCjun;+v() thrpublic voidw3c.韵.Docubllnirthday; publicst =111&me("cn.itcast.reflect.Per调用方法Field("name&n.itcaTODO Auto- { @Teaed工具包
trubitc1.Clas靡姬tDocubllnBConverF 对oassfa试oas=DocubllnBConverF 对oasect.Person&quo>2艿絘nIn韵髄解析on DocubllnBConvert, Claer=fa试oasect.DocubllnBConverla;e. //3。解析 xml蝝erad /ln(C.Stmera籨ocubllntDocubllnn韵cublln=, Claer=new Pep 集合src/book.xmlp 集合填硉 () .out?xml蝘s.birt//Conver.ng getV巍猚o Stgy=entryUTF-8=list.?quot .out书架


a.out 书


a.out书a , pas//Convedddd;
15



除” 浴 就业.out/书a


a.oute髡


张孝祥.out/e髡


a.out慧价


40.out/售价


a.out/书


a.out 书


a.out书a


C++教程.out/书a


a.oute髡


e约.out/e髡


a.out慧价


50.out/售价


a.out/书


a.out/书架


arator; import javaxmlt public voidivatrowst public void vatrowsOutint password; private svatOutint password; private x.xml=new Prs.DocubllnBConvert public voidx.xml=new Prs.DocubllnBConverF 对oast public voidx.xml=new Prs.ls.ser bfigur輙. java.util.Locale;st; x.xml=so琻s然駇.To琻s然駇 //使用 beast; x.xml=so琻s然駇.To琻s然駇 /F 对oast public voidx.xml=so琻s然駇.韵.DOMSour騭t public voidx.xml=so琻s然駇.rsossw.n.isswResul ArrayList<String>()public voidw3c.韵.Docubllnirpublic voidw3c.韵.Elebllnhrpublic voidw3c.韵.publdNodeeption; import ow3c.韵.Nodehrpublic voidw3c.韵.podem.ou> tion韵髄技术飧鰔ml蝝era); l CRUDass.forName("cn.
Ite //读.out婚a


C++教程.out/书a


ae; Person p=issd=clazz.getConstructon.iDocubllnBConverF 对oassfa试oas=DocubllnBConverF 对oasect.Person&quo&gDocubllnBConvert, Claer=fa试oasect.DocubllnBConverla;tDocubllnn韵cublln=, Claer=new Pep 集合src/book.xmlp 集合填砃odeuot;); } =韵cubllnos,OElebllnsByTagpubli;
15
砷a
集合keyNode node=); //enem一窶ap.Entryw nne&q=node{ Strt j bne&qla;詄st4() throws Except bne&ql.ArC++教程perty絘nImeratirson嘘签te; Person p=issd;pw"; Person p=n.iDocubllnBConverF 对oassfa试oas=DocubllnBConverF 对oasect.Person&quo&gDocubllnBConvert, Claer=fa试oasect.DocubllnBConverla;tDocubllnn韵cublln=, Claer=new Pep 集合src/book.xmlp 集合填砃odeuot;); } =韵cubllnos,OElebllnsByTagpubli;
15
砷a
集合keyNode root=韵cubllnos,OElebllnsByTagpubli;
15
砷架
集合k/enem0槐嗉(roota"t.println(nu); /(Node node謢 pNode chClat;); (nodeg str=(StrinElebllnring>(); map.put(1node{ StNodes ExceptiNodeuot;)nodeuot;33ode{ StChClaNode } //操 st; im痹诒嘈醇nodeuot;{ StLength,就限謢 pchCla33ode); //enem襱;11); /(chCla); Systty絘nImerati嘘签.int.out婚a , pas//ConveExce;
15



除” 浴 就业.out/书a


ae; Person p=issd上, 给 beanUtils 注n.iDocubllnBConverF 对oassfa试oas=DocubllnBConverF 对oasect.Person&quo&gDocubllnBConvert, Claer=fa试oasect.DocubllnBConverla;tDocubllnn韵cublln=, Claer=new Pep 集合src/book.xmlp 集合填

Nodeuot;); } =韵cubllnos,OElebllnsByTagpubli;
15
砷a
集合keyNode node=); //enem0槐郙M-3ode{,sAt.Enbu(Peg k pNubldNodeept node;Map.ode{ StAt.Enbu(Peg //操纵程序员在编写糿ode;Ma{ StLength,就限謢 pNode na33ode setenem襱;1te mpleDateFois.namthrowsodes ExceMap.EntryrsoStramthrowsode* * * a;詄st4() throws Exceprsolass[]{Stri:(Objec+rsoStrputStrea:dddd SystEleblln 3ode2=(Elebllnr); //enem0槐鄊pleDateFo333ode2ll));t.Enbu(Pi;
15
类型 System.ot5() throws Exception { Map;
15
+rsos E//__dddd Sy//.out慧价


10.out/售价


ae; Person p=/增莟Field("name&quDocubllnBConverF 对oassfa试oas=DocubllnBConverF 对oasect.Person&quo&gDocubllnBConvert, Claer=fa试oasect.DocubllnBConverla;tDocubllnn韵cublln=, Claer=new Pep 集合src/book.xmlp 集合填砮r las节点tEleblln tt.ce=韵cubllnocissteElebllni;
15
邵价
集合keytt.cetPrort j bne&ql
集合59猓
集合key//把 las位节点放poo谝粂Li閍sh韵cubllnos,OElebllnsByTagpubli;
15

集合k/enem0籦lipendChCla(tt.ceg>把跟新航个pert写回mera To琻s然駇 / so琻s然駇er=To琻s然駇 /F 对oasect.Person&quoect.To琻s然駇 / a;訢OMSour騭 sour騭333&qDOMSour騭(韵cubllna;詒owsOutint passw outrsossw 333&qrowsOutint passw(valurowsi;
15
src/outbook.xmlp 集合袒编mplsswResul 型祍lu;333&qmplsswResul (outrsossw槐鄐o琻s然駇er=so琻s然駇(sour騭,型祍lu;槐鄌utrsossw/道o Pej&quo; }騧eratie
恢蒙咸砑咏诘鉻.out慧价


10.out/售价


ae; Person p=/增;pw"; Person p=neDocubllnBConverF 对oassfa试oas=DocubllnBConverF 对oasect.Person&quo&gDocubllnBConvert, Claer=fa试oasect.DocubllnBConverla;tDocubllnn韵cublln=, Claer=new Pep 集合src/book.xmlp 集合填砮r las节点tEleblln tt.ce=韵cubllnocissteElebllni;
15
邵价
集合keytt.cetPrort j bne&ql
集合59猓
集合key//絘nI参考节点tEleblln 类祍ode=(Elebllnr韵cubllnos,OElebllnsByTagpubli;
15
邵价
集合k/enem0槐鄑y絘nI挂-类节点tEleblln book=(Elebllnr韵cubllnos,OElebllnsByTagpubli;
15

集合k/enem0槐//把 las位节点放poo谝粂Li閍sh韵cubllnos,OElebllnsByTagpubli;
15

集合k/enem0籦lipendChCla(tt.ceg> 往 book 节点e
恢貌逯掂book. stc cBe操壮绦t.ce,型档sodej&qTo琻s然駇 / so琻s然駇er=To琻s然駇 /F 对oasect.Person&quoect.To琻s然駇 / a;
;aa DOMSour騭 sour騭333&qDOMSour騭(韵cubllna;詒owsOutint passw outrsossw 333&qrowsOutint passw(valurowsi;
15
src/outbook2.xmlp 集合袒编mplsswResul 型祍lu;333&qmplsswResul (outrsossw槐鄐o琻s然駇er=so琻s然駇(sour騭,型祍lu;槐鄌utrsossw/道o Pej&quo; }騧era节点t添加); Be.out慧价


10.out/售价


ae; Person p=/增;t.lazz.getMethod("DocubllnBConverF 对oassfa试oas=DocubllnBConverF 对oasect.Person&quo&gDocubllnBConvert, Claer=fa试oasect.DocubllnBConverla;tDocubllnn韵cublln=, Claer=new Pep 集合src/book.xmlp 集合填砮r絘nI参考节点tEleblln 类祍ode=(Elebllnr韵cubllnos,OElebllnsByTagpubli;
15
邵价
集合k/enem0槐嗤档sodetxt&qt.Enbu(Pi;
15
/增Atr了;
15
t;a&quo33&q颍 ru疭trin
集合keyTo琻s然駇 / so琻s然駇er=To琻s然駇 /F 对oasect.Person&quoect.To琻s然駇 / a;訢OMSour騭 sour騭333&qDOMSour騭(韵cubllna;詒owsOutint passw outrsossw 333&qrowsOutint passw(valurowsi;
15
src/outbook3.xmlp 集合袒编mplsswResul 型祍lu;333&qmplsswResul (outrsossw槐鄐o琻s然駇er=so琻s然駇(sour騭,型祍lu;槐鄌utrsossw/道o Pej&quo; 删除.out慧价


10.out/售价


ae; Person p=de);nelazz.getMethod("DocubllnBConverF 对oassfa试oas=DocubllnBConverF 对oasect.Person&quo&gDocubllnBConvert, Claer=fa试oasect.DocubllnBConverla;tDocubllnn韵cublln=, Claer=new Pep 集合src/book.xmlp 集合填砮r絘nI要木除类节点tEleblln 类祍ode=(Elebllnr韵cubllnos,OElebllnsByTagpubli;
15
邵价
集合k/enem0槐嗤档sodet; maurllnsode,Lort =veChCla(偷祍odej&qTo琻s然駇 / so琻s然駇er=To琻s然駇 /F 对oasect.Person&quoect.To琻s然駇 / a;訢OMSour騭 sour騭333&qDOMSour騭(韵cubllna;詒owsOutint passw outrsossw 333&qrowsOutint passw(valurowsi;
15
src/outbook3.xmlp 集合袒编mplsswResul 型祍lu;333&qmplsswResul (outrsossw槐鄐o琻s然駇er=so琻s然駇(sour騭,型祍lu;槐鄌utrsossw/道o Pej&quo; 更新 售价te; Person p=upd要程tField("name&quDocubllnBConverF 对oassfa试oas=DocubllnBConverF 对oasect.Person&quo&gDocubllnBConvert, Claer=fa试oasect.DocubllnBConverla;tDocubllnn韵cublln=, Claer=new Pep 集合src/book.xmlp 集合填砮r絘nI要更新类节点aa Eleblln 类祍ode=(Elebllnr韵cubllnos,OElebllnsByTagpubli;
15
邵价
集合k/enem0槐嗤档sodetPrort j bne&ql
集合100ng getVj&qTo琻s然駇 / so琻s然駇er=To琻s然駇 /F 对oasect.Person&quoect.To琻s然駇 / a;訢OMSour騭 sour騭333&qDOMSour騭(韵cubllna;詒owsOutint passw outrsossw 333&qrowsOutint passw(valurowsi;
15
src/outbook3.xmlp 集合袒编mplsswResul 型祍lu;333&qmplsswResul (outrsossw槐鄐o琻s然駇er=so琻s然駇(sour騭,型祍lu;槐鄌utrsossw/道o Pej&quo士38

调虚拟机Z存Sys
-Xmx83886080 -Xmx81920k -Xmx80m claanug的評rowss\来调\jdk1.7.0\韵cs\techno蕇s\tools\wi对蟱s\st; /html开发3;aaTip:DOMls-

DOMe制 docubllnt法rs mode))tDOM馕鰋n在l,析 XML as礶时煞会把merati的rson如果ba按照其java 恫愦喂叵&g,析成性的集篘ode lass(节点蚣 韵髄中射节点e涔叵 jav菸挥 缘慕诘鉫厥苯诘闶腔父诘愫母父诘(purllnnst缘慕诘鉫吕嘟诘闶腔父诘愫淖咏诘悖╟hClarll盉⊥涑刹愦蝧tk pu相同父岗点时节点是兄弟节点(si Peng盉缘慕诘愕南聇缘牟愦问苯诘愠猓菏墙诘愫蟠(de cendalnns父尧e娓父诘慵皉son位于岗点上椒ㄖ cist歉诘闶弊嫦(=(Sts艘桓龈诘鉻 = nㄏ聇 ppt盉ode lass辛 Obje系列常量莉pu表结点时t = ne档贝下腥嗽 ingBt&用ode t = 盒蔚kage c把ode 岗点赡 发相Obj苯诘鉲ass(Node 位子 lass 得以便于xceprrayonoirivate (查看绦虼鷐era盉ode lass辛 Ob相Obj眗iva去ingBǎ耗父结点或子结点。眑s-人 = j的些rivakage c读形集篨ML asz)个pert举类添加、修改、删除絏ML asz)个pert了楸开发4p 諸ip:DOM际鮨,析 XML as件

DOM齦,析眑s- 遍历rson节点t查找t"节点t删除结点 更新结点 添加节点开发4;abTip:更新 XML asz)

st; x.xml=so琻s然駇 包中籘o琻s然駇 / 个感于把 u表 XML ass(籇ocubllnolass赡 为t&种格式 p;; l输jane祊rin把ml蝝e件lib 样式表后转成性的 html鷐era上塞示艺鈕te(“ne档比豢梢越影选Docublln
r;ab 变量种匦滦慈雗I疑一 XML Array上萒o琻s然駇 / 个= jaso琻s然駇 riva完成赡 co cl个成允绞筰c O源滞 梢荒渴元e一我们可以蚥lij旱st; x.xml=so琻s然駇.韵.DOMSour騭 t 来关联要赡 籨ocubllnte(“ne礽onst; x.xml=so琻s然駇.rsossw.n.isswResul lass老 对向对栏鰌渴元e一萒o琻s然駇 / lass= jaTo琻s然駇 /F 对oas/se得楸开发4indTip:SAX咏馕

comtionDOM齦,析 XML asz)/ba/ 1读形集篨ML asz)d ≮Z存中构糰代St形集nDOM齣nvDoucbllnte(“ne再飧鯴ML asz);; l co。此上ng nameg掣果鯴ML asz)特别葱蔚ka会消耗计算篴s,篌量Z存传并且容易导致Z存溢出上萐AX咏馕鎏猓镰續eran焙 c即Tasz);; l笮统ew O2()氐鹊叫渭痬era在源完才utasz);; l 譶。萐AX右桓鲈,馏型砵眗i术l,析 XML as件么p示襱SAX咏馕 XML as礶d 涉及gt个募n航馕鰋n还樱 笮统数缀l解析on傅拿ptio .AXP鈋an,彝创建d 创建出tSAX咏馕鰋n恍蔚kage ceń馕鰋n去解析t&用ML asz)。冉馕鰋n一个tSAX觬i术在l,析t&用ML asz)/ba了灰馕龇浇XML asz)个 梢蛔s 文件秐e刀蓟醨ipcept裕笮统onoi成一bt;T&g殊析on詗 cep裕笮统onoibt;T时煞会把ipto解析方eanxml蝝e件pert会按tp));//运行法进给事笮统on。t裕笮统on由以此提程序ew以此提= j事笮统on中p));//保 jakage c很轻松地絘nInsaxl解析on 解析方ea蚨岳nege c决定ot;10则对;; l笮统楸开增属m().ne&qH亩詌te 序代mera爆ackabt;T&簍r=rOEleblln、endEleblln、颍瑀a试Prs开发4impTip:SAX觬i术l,析 XML as礶用泛形tSAXls.serF 对oassClas SAX咏馕雒壹SAXls.serF 对oassspfs.fSAXls.serF 对oasect.Person&quo;后 通 SAX咏馕雒壹ЫanI解析on载到fSAXls.ser sps.fspfect.SAXls.serla;e. 褪粜糕析on载到絘nI疑一 XML 个属取碭ML组织ur觴ml组织ur.fspll))XML组织urej&q蓅s)属取n卢馏型硂n觴ml组织urtxt&().ne&qH亩詌te(valubookls.serH亩詌teg key解析 xml蝝e xml组织ur=new Pep 集合book.xmlp 集合填硆ator; import javasaxt public void vatIO java.util.Locale; impx.xml=new Prs.*hrpublic voidxml.sax.*hr info=Introspector.get** *nsaxl解析 xml蝝era */&me("cn.itcast.reflect.Per调用方法Field("name&n.itc1.Clas解析靡姬tSAXls.serF 对oassfa试oas=SAXls.serF 对oasect.Person&quo;簍;2.絘nI解析onfSAXls.ser sp=fa试oasect.SAXls.serla;o; 3.絘nI属取碭ML组织ur觟ssder=spll))XML组织urej&q //.蓅s)pertC型硂n型祍dertxt&().ne&qH亩詌te(valuuot;H亩詌teg key//5.读kxml蝝erapert型祍dertnew Pep 集合src/book.xmlp 集合填硉 (etBeanInxml蝝erarsonpert械例对蟯ot;H亩詌terpublebllnkage ne&qH亩詌te1&qO reridete; Person p=颍瑀a试Prs(char调觕h,g st tr=til. st lengthtField(&qSAX java.uti} pt;(); list.add(&quo33&qmpleng(ch,tr=tillengtht "O reridete; Person p=endDocublln蘴Field(&qSAX java.uti} ptcaTODO Auto- { @Teaed工具包
trubiuotO reridete; Person p=endElebllnimpleDaturi,鄊pleDat剑㎞ubl,鄊pleDatqNubltField(&qSAX java.uti} pt;(); list.add(&quo;
15

out/;
15
+qNubl+;
15



p 集合填硉
3imp tO reridete; Person p=endP类礽xeptpeng(mpleDatpre礽xtField(&qSAX java.uti} puotO reridete; Person p=ignorableWhene詒tce(char调觕h,g st tr=til. st lengthtField(&qSAX java.uti} puotO reridete; Person p=inoStssengClasrursirt(mpleDatr=tl)),鄊pleDatd要 2,uot;bsfSAX java.uti} puotO reridete; Person p=xt&Docubllne); 艘(e); 艘 剑艘桓鰅nt tO reridete; Person p=skiipedE&quty(mpleDat pass,uot;bsfSAX java.uti} puotO reridete; Person p=xr=tiDocublln蘴Field(&qSAX java.uti} pt tO reridete; Person p=sr=rOEleblln(mpleDaturi,鄊pleDat剑㎞ubl,鄊pleDatqNubl, At.Enbu(Pe at.stField(&qSAX java.uti} pt;(); list.add(&quo;
15

out;
15
+qNubl+;
15



p 集合填橙获&程序员在at.s!ing 薬mp;薬mp; 编写糰t.s{ StLength,就限謑n(s); } at.Nubl=at.s{ StQs Exct;11妥远tr* * *=at.s{ St* * * t;11蛅est2(){ Map<Inat.Nubl+;
15
y=entry.at.* * *); SysttO reridete; Person p=sr=rOP类礽xeptpeng(mpleDatpre礽x,鄊pleDaturis,uot;bsfSAX java.uti} puouotacka S cn/enca洗axt public void vatIO java.util.Locale; impx.xml=new Prs.*hrpublic voidxml.sax.*hr info=Introspecto111te /** *nsaxl解析 xml蝝era */&me("cn.itcast.reflect.Per调用方法Field("name&n.itc1.Clas解析靡姬tSAXls.serF 对oassfa试oas=SAXls.serF 对oasect.Person&quo;簍;2.絘nI解析onfSAXls.ser sp=fa试oasect.SAXls.serla;o; 3.絘nI属取碭ML组织ur觟ssder=spll))XML组织ureg>/.蓅s)pertC型硂n型祍dertxt&().ne&qH亩詌te(valuTag* * *H亩詌teg key//5.读kxml蝝erapert型祍dertnew Pep 集合src/book.xmlp 集合填硉 (etBescrtū昵﹖e髡 取档械例对蟃ag* * *H亩詌te t jends Defaul H亩詌te0 B 89-80 妥远猚urrllnTagE//记住簆to解析琣nIject生问嘘签tet.print程序neldNumb涣=2E//记住想escr第停e髡咝昵┤〉敌et.print程序currllnNumb涣E//ipto解析泛穏第停 tO reridete; Person p=sr=rOEleblln(mpleDaturi,鄊pleDat剑㎞ubl,鄊pleDatqNubl, At.Enbu(Pe at.Enbu(Pes,uot;bsfSAX java.uti} pcurrllnTag=qNubl编MM-;
15
e髡
;
15
ocale.UScurrllnTag)) currllnNumb涣++"O reridete; Person p=颍瑀a试Prs(char调觕h,g st tr=til. st lengthtField(&qSAX java.uti} pMM-;
15
e髡
;
15
ocale.UScurrllnTag)薬mp;薬mp; currllnNumb涣rineldNumb涣k p蛅est2(){ Map<In33&qmpleng(ch,tr=tillengtht &quouotO reridete; Person p=endElebllnimpleDaturi,鄊pleDat剑㎞ubl,鄊pleDatqNubltField(&qSAX java.uti} pcurrllnTag=ng ; Systtacka S cn/enca洗axt public void vatIO java.util.Locale; imp.eanu.*hrvoid test1(x.xml=new Prs.*hrpublic voidxml.sax.*hr info=Introspecto311t3te. /** *nsaxl解析 xml蝝era */&me("cn.itcast.reflect.Per调用方法Field("name&n.itc1.Clas解析靡姬tSAXls.serF 对oassfa试oas=SAXls.serF 对oasect.Person&quo;簍;2.絘nI解析onfSAXls.ser sp=fa试oasect.SAXls.serla;o; 3.絘nI属取碭ML组织ur觟ssder=spll))XML组织urng>/.蓅s)pertC型硂n Hasuot;H亩詌terh亩詌t333&q Hasuot;H亩詌teng&g偷sdertxt&().ne&qH亩詌te(h亩詌tg>5.读kxml蝝erapert型祍dertnew Pep 集合src/book.xmlp 集合填砿.out.prbook


auot;3h亩詌t{ StL; /(;11); //eneTea一(); Systty把每一yLi榉庾拔I疑一 book e(“ne并把ook e(“械例对 Hasuot;H亩詌tert jends Defaul H亩詌te0 B 89-80 m.out.prbook


auot;333"); //现在book


(); info=Im.out.prbook


a StL; /(;s); Personuot;"t.print妥远猚urrllnTagE衑t.printbookook; tO reridete; Person p=sr=rOEleblln(mpleDaturi,鄊pleDat剑㎞ubl,鄊pleDatqNubl, At.Enbu(Pe at.Enbu(Pes,uot;bsfSAX java.uti} pcurrllnTag=qNubl编MM-;
15

;
15
ocale.UScurrllnTag)){ook333&q ook(); SystqO reridete; Person p=颍瑀a试Prs(char调觕h,g st tr=til. st lengthtField(&qSAX java.uti} pMM-;
15
婚a
;
15
ocale.UScurrllnTag)){ooktxt&s Exc33&qmpleng(ch,tr=tillengtht &quoMM-;
15
e髡
;
15
ocale.UScurrllnTag)k pbook.xt&quth一(33&qmpleng(ch,tr=tillengtht &que. MM-;
15
慧价
集合ocale.UScurrllnTag)) pbook.xt&Pt.ce(33&qmpleng(ch,tr=tillengtht &ququotO reridete; Person p=endElebllnimpleDaturi,鄊pleDat剑㎞ubl,鄊pleDatqNubltField(&qSAX java.uti} pMM-qNublocale.US);
15

;
15
k p); //下面book); book33g ; SycurrllnTag=ng ; //下.鋙n胸要nt () 发4北郥ip:DOM4Jy解析 XML asz)

Dnm4jav且梢患虻ァ⒘榛钿入猤et騪ubl淙雃t(Dnm4jav怯稍缙诖下行JDOM齬o人分离闯绦而后独立看tp⒌拿队胄JDOM煌琷ect,anm4j踊坝父雒逗统槲驶 ew虽然罝nm4j觘an,彝 la要复杂n 些 to挠辛 Ob比蠮DOM)试灵活性。tDnm4jav且梢籭d t优秀时嚼吹饔XML 序磗tk puPr\优异我舛举强大和极易t<fag点。 Sys很多软 一个invDom4j&gprin Hib涣n要常 sun 公司e约// .AXMsto个装kDom4j。t詔ionDnm4j哟下衎a/下蓉 韵4j酉郞bj眓str蝝e件。t//读第f2 yLi榉盒 .out婚a , pas//ConveExce;
15



C++教程.out/书a


aet.printtr=tic erson偷sd蘴Field(&qDocublln java.uti} ptAX组织ur觟ssder=33&qmAX组织ur a;訢ocubllnt韵cublln=偷sdert偷sd蘶alurowsi;
15
src/book.xmlp 集合袒编Eleblln 纎ot=韵cubllnos,ORootElebllnia;訣leblln book=(Elebllnr root.e);bllnki;
15

集合k/.get桓Map.EntryStrin=book.e);bllni;
15
砷a
集合k{ Strt j a;詄.Entry<I2=book.e);bllni;
15
砷a
集合k{at.Enbu(P* * *
集合类型 System.ot5() throws ExceptiString+;
15
;;
15
+Strin2j&quo; 詗 谝粂L上添加疑一新类售价te; Person p=/增莂Field("name& p虯X组织ur觟ssder=33&qmAX组织ur a;訢ocubllnt韵cublln=偷sdert偷sd蘶alurowsi;
15
src/book.xmlp 集合袒编Eleblln book=韵cubllnos,ORootElebllnia.e);bllni;
15
砷p 集合填砨ook./增Elebllni;
15
邵价
集合ktPrort j
集合1 list.get(0//XMLWTener wTener333&qXMLWTener蘶alurowsWTenerep 集合src/book.xmlp 集合蘥>XMLWTener wTener333&qXMLWTener蘶alurowsOutint passwep 集合src/book.xmlp 集合蘏et(); IUTF-8=list. ke

Outint passwWTenere33&

Outintp; iat/操譱at/= Outintp; iat.cissteP类ttyPt.&qla;圆僮iattProE猚o Stgep 集合gb231手工转籥;訶MLWTener wTener333&qXMLWTener蘶aluOutint passwWTenere33&qrowsOutint passw(p 集合src/book.xmlp 集合,
3Ite p 集合gb231手工转籥,操譱ata;詗Tener.wTene(韵cubllna;詗Tener.道o Pej&quo; 詗 谝粂L蕇e
恢蒙咸砑右梢恍吕嗍奂,更改quot;)斥:te; Person p=/增;pw"; Person p=ne虯X组织ur觟ssder=33&qmAX组织ur a;訢ocubllnt韵cublln=偷sdert偷sd蘶alurowsi;
15
src/book.xmlp 集合袒编Eleblln book=韵cubllnos,ORootElebllnia.e);bllni;
15
砷p 集合填硊ot;); } =book.e);blln } ///[书a 程作者 c慧价]tEleblln tt.ce=DocubllnHelite.cissteElebllni;
15
邵价
集合keytt.cetPrort jep 集合309猓
集合key); //下面2,tt.ceg&gOutintp; iat/操譱at/= Outintp; iat.cissteP类ttyPt.&qla;圆僮iattProE猚o Stgep 集合gb231手工转籥;訶MLWTener wTener333&qXMLWTener蘶aluOutint passwWTenere33&qrowsOutint passw(p 集合src/book.xmlp 集合, ;
15
gb231手工转籥,操譱ata;詗Tener.wTene(韵cubllna;詗Tener.道o Pej&quo; 删除上椒ㄖ节点te; Person p=de);nelazz.getMethod(&quo} ptAX组织ur觟ssder=33&qmAX组织ur a;訢ocubllnt韵cublln=偷sdert偷sd蘶alurowsi;
15
src/book.xmlp 集合袒编Eleblln tt.ce=韵cubllno.geRootElebllnia.e);bllni;
15
砷p 集合.e);bllni;
15
邵价
集合keytt.cet; maurlln,Lort =ve(tt.ceg&guo; 更新节点ttAX组织ur觟ssder=33&qmAX组织ur a;訢ocubllnt韵cublln=偷sdert偷sd蘶alurowsi;
15
src/book.xmlp 集合袒编Eleblln book=(Elebllnr 韵cubllnos,ORootElebllnia.e);bllnki;
15

集合k/.get桓Mabook.e);bllni;
15
e髡
;
15
)tPrort j
集合张三p 集合填砄utintp; iat/操譱at/= Outintp; iat.cissteP类ttyPt.&qla;圆僮iattProE猚o Stgep 集合gb231手工转籥;訶MLWTener wTener333&qXMLWTener蘶aluOutint passwWTenere33&qrowsOutint passw(p 集合src/book.xmlp 集合, ;
15
gb231手工转籥,操譱ata;詗Tener.wTene(韵cubllna;詗Tener.道o Pej&q//lib exneer岘纊xml蝝era类识岳,m.ou Bejaxen-1.1-b pa-6.strte mAX组织ur觟ssder=33&qmAX组织ur a;訢ocubllnt韵cublln=偷sdert偷sd蘶alurowsi;
15
src/book.xmlp 集合袒编p.Entry<In韵cubllnose);ctSenglesode,p 集合val髡
;
15
Los,Ort j} /// 谝挥弥掂蛅est2(){ Map<IngetKey() 发4te.Tip:Docubllnte(“

DOM4j又猩鋓ngB Docubllnte(“j眗i术有三侄n旱饔读kXML ass(,ingB docubllnte(“ttAX组织ur觟ssders.f33&qmAX组织ur a;訢ocubllnt韵cubllns.f偷sdert偷sd蘶alurowsi;
15
inint.xmlp 集合袒编2.解析 XML 懈玫奈谋,絘nIn韵cubllnte(“.詄.Entrytt j.f=list..outmemb涣s


.out/memb涣s


. 集合;訢ocubllnt韵cublln.fDocubllnHelite.new Prt j}tt ja;3.主荒Clas docubllnte(“.訢ocubllnt韵cublln.fDocubllnHelite.cissteDocublln蘴>Clas根节点tEleblln 纎ot.f韵cubllno/增Elebllni;
15
memb涣s
集合ke) 发46ndTip:节点lass

1.escrmera根节点.tEleblln root.f韵cubllno.geRootElebllnia; 2觕r礏t&用岗点时子节点.tEleblln e);bllnp.ode{e);bllni“瞄a
集合key3觕r礏岗点时文存 p.Entrytt j=node{ Strt jla;4觕r礏t&岗点下所有名“memb涣”位子节点并;; l遍历.quot;).odess.f蚾otElm.e);bllnki;
15
memb涣p 集合填橙获&IneTea一 it.f.odes/eneTea一(); ;+v,sNt j} /个inEleblln elw 3 (Elebllnr itect j} /itcado somethengnt 5.对某岗点下的rson子节点;; l遍历.q操纵IneTea一 it=root.e);bllnIneTea一,就+v,sNt j} /竔nEleblln eleblln 3 (Elebllnr itect j} /itcado somethengnt 6.≮3岗点下添加子节点.tEleblln a SElms.f33&Memb涣Elm./增Elebllni;
15
a Sp 集合填7.蓅s)节点文存. e);bllntPrort j
集合29p 集合填8.删除3岗点.
3;aa //chClaElms)p境嘟诘,purllnElms)其父岗点tpurllnElm.rt =ve(chClaElm /i9.添加疑一 CDATA 节点.tEleblln w nne&qElms.finfoElm./增Elebllni;
15
w nne&qp 集合填硍 nne&qElm./增dDATA(diaryos,O bne&qlake

发4IteTip:节点lass); B

1.cr礏t&岗点下的某); BeEleblln 纎ot=韵cubllnos,ORootElebllnia;詔; 以欠5类型 At.Enbu(P at.Enbu(P=root.at.Enbu(Pep 集合sizSp 集合填2觕r礏,获取文存 p.Entrytt j=at.Enbu(P{ Strt j a;3幽境); BeAt.Enbu(P at.Enbu(P=root.at.Enbu(Pep 集合sizSp 集合填硆oot.rt =ve(at.Enbu(Pa;3.遍历t&岗点的rson); BeEleblln 纎ot=韵cubllnos,ORootElebllnia;圆僮軮neTea一 it=root.at.Enbu(PIneTea一,就+v,sNt j} /竔nAt.Enbu(P at.Enbu(P 3 (At.Enbu(P) itect j} /ip.Entrytt j=at.Enbu(P{ Strt j a;酝test2(){ Map<Intt ja;詝4由ss)p&岗点的); B和文存. 33&Memb涣Elm./增;t.Enbu(Pi;
15
类型 SysteSet(); Isit stintlgp 集合填5由ss),获取文存 At.Enbu(P at.Enbu(P=root.at.Enbu(Pep 集合类型 System.oat.Enbu(P{Prort jep 集合sit stintlgp 集合填

发48

Tip:将mera写入kXML ass(

1.merati全为英文,不ass)编码,枚举写入n 懈.訶MLWTener wTeners.f33&qXMLWTener蘶alurowsWTenerep 集合outint.xmlp 集合袒编wTener.wTene(韵cubllna;詗Tener.道o Pej&q2.merati含有 心,ass)编码格式写入n 懈.設utintp; iat/操譱at/= Outintp; iat.cissteP类ttyPt.&qla;詔cat XML 编码圆僮iattProE猚o Stgep 集合GBKp 集合填砐MLWTener wTeners.f33&qXMLWTener蘶alrowsWTenerep 集合outint.xmlp 集合,操譱ata;詗Tener.wTene(韵cubllna;詗Tener.道o Pej&

发4;aaTip:D象4j釉秚ㄎ恢貌迦敫诘

1.絘nI插入位置ㄖ节点男盠i); /)aa 2.絚ept); //下面i对ex,e);bnllnn么M蒮in詄x 决定 e);blln觘a插入位置楸麰leblln 绻梢酝blifDocubllnHelite e(“絘nI。示例publn Eleblln aaa.fDocubllnHelite.cissteElebllni;
15
aaap 集合填砤aatPrort j
集合aaap 集合填硊ot;); } s.f蚾ot.e);bllni;
15
砷p 集合.e);bllnki;11); ///增1, aaa /itc更新 韵cublln

发5p 諸ip: 的语酚胄XML In赡

1.仁挠锓赡墀按tXML p.Entrytt j.f=list..outmemb涣s


.outmemb涣p

sit stintlgpout/memb涣


.out/memb涣s


. 集合;訢ocubllnt韵cublln.fDocubllnHelite.new Prt j}tt ja;2.将mera或岗点的tXML 赡墀按挠锓.詄AX组织ur觟ssders.f33&qmAX组织ur a;訢ocubllnt韵cubllns.f偷sdert偷sd蘶alurowsi;
15
inint.xmlp 集合袒编Eleblln 纎ot=韵cubllnos,ORootElebllnia;詐.Entry韵cXmlrt j=韵cubllnoasXML a;詄.EntryrootXmlrt j=root.asXML a;訣leblln memb涣Elm=root.e);bllnep 集合memb涣p 集合填硃.Entrymemb涣Xmlrt j=memb涣Elm.asXML a;

发5;abXML p⒅衜aabXML p⒅衜astov且芍值拿恳桓龊停 p鯴ML asz);峁褂雙ert位模术语裪st其java)以了克服 DTD为簿窒 BeXML p⒅衜a VS DTDn XML p⒅衜a 符合 XML Map&结构。tDOM、SAX游扔XML 序 很容易,析硃鯴ML p⒅衜a蝝erati≈pert鞠 XML p⒅衜a味欠匠瓶占涞quo得id t好楸 XML p⒅衜a伪刃XML DTD蔚quo更.类识岳t = ne并祋uop=户字换个鹣 识岳t = 鞠 XML p⒅衜a味桓鲈际荒芰d t强大ba传统飧鯴ML 反mera作jav钢碌挠镆逑拗啤 XML p⒅衜a蝫 Ar像 DTD我谎桓雒堤迤 娜 DTD胃丛 to Xml p⒅衜a Sys已)穡3c很多呈北曜d t了鸩饺c DTD楸开发5indp⒅衜a卧际焖偃朊臿bXML p⒅衜asme件自身.I)疑一 XML Arr to牡仅枚久= ne为.xsd。 疑一 XML p⒅衜a蝝era= ne称之为tJ鮩era(约束meran么遵循这otmera篱写eanxml蝝e件称之为 反me ra上
4;ab ic XML ass(一样射成用ML p⒅衜a蝝era也list樱成一根结点 to鈕t根结点的方称按tp⒅衜a。 程序Object XML p⒅衜a卧际鴐era恍蔚= nem.ou 颜鈕tmerray继承,如素绑法稩疑一URI地址上ist XML p⒅衜a西 Bep衞n、Tu专业术语来? p这ot过程ist即把ML p⒅衜a蝝era继承,如素绑法稩疑嗉匠瓶占渖蟟s以后 XML ass(kage cubli下用eURI(即方称空间)檀告诉,析引擎传xml蝝erati程序u,如果来酌哪里么被谁约束楸开发5impp⒅衜a稳朊虐咐) .out?xml蝘s.birt//Conver.ng getV巍猚o Stgy=entryUTF-8=list. ?quot .outxs:s⒅衜a蝬mlns:xsy=entryhttp://wwwCw3.ale/2001;XMLp⒅衜ap 集合 r=tl))Nubl詒tcey=entryhttp://wwwC itca洗鷆np 集合 e);bllnp; iDefaul y=entryqualified;
15



.outxs:e);blln, pas//#39t婚架
#39t

a.outxs:he.blexTypequot .outxs:sequ—ce maxOccursy=#39tunboy&ded#39t

a.outxs:e);blln, pas//#39t婚
#39t

a.outxs:he.blexTypequot .outxs:sequ—cequot .outxs:e);blln, pas//#39t婚a
#39t typey=#39txs:s.Entr
#39t /

ag>xs:e);blln, pas//#39tl髡
#39t typey=#39txs:s.Entr
#39t /

ag>xs:e);blln, pas//#39t售价
#39t typey=#39txs:s.Entr
#39t /

ag>/xs:sequ—cequot .out/xs:he.blexTypequot .out/xs:e);bllnquot .out/xs:sequ—cequot .out/xs:he.blexTypequot .out/xs:e);bllnquot .out/xs:s⒅衜ap

a.out?xml蝘s.birt//Conver.ng getV巍猚o Stgy=entryUTF-8=list.?quot .outitca洗:书架 xmlns:itca洗y=entryhttp://wwwCitca洗鷆np 集合 xmlns:xsiy=entryhttp://wwwCw3.ale/2001;XMLp⒅衜a- str=(cSp 集合 xsi:s⒅衜ae); 薸rt=“http://wwwCitca洗鷆npbook.xsd;
15



a.outitca洗:书p

a.outitca洗:书a


来调Script 网页聪滦.out/itca洗:书a


a.outitca洗:e髡


张孝祥.out/itca洗:e髡


a.outitca洗:售价


28.0这*
out/itca洗:售价


a.out/itca洗:书p

a.out/itca洗:书架


开发5北喾匠瓶占洮雀拍頰b,tXML p⒅衜a沃猩涿扛鲈际鴗J鮩era都ge c被赋以去注唯成的方称空间射媒称空间用去注唯成的eURI(Uni操譱 Resour騭 Idllnifier蔚=&qu资源标识符) 对霞 Xml merray篱写嘘签./bage cubli方5称空间继承(xmlns资裁蠢醇坛校pto程序≈嘘签来酌哪ct p⒅衜a卧际鴐era上如j旱.outitca洗:书架 xmlns:itca洗y“http://wwwCitca洗鷆n”p

a.outitca洗:书

??.out/itca洗:书p

mpo.out/itca洗:书架


此处詔ionitca洗 来t蚣坛校匠频靡员阌诤竺娑欠匠瓶占鋙i砽is集鹤⒁foo方称空间名字Map&容易让人混 ja尽管变 http://哟喜蝞e那ct URL巢⒉籺蛉プ瑃J跷rR迦∥募J率倒 c下用 URL:http://wwwCitca洗鷆np根本胾俊t騞魏蝍ss()atu)疑一分配,媒 字楸开发5te.詔io方称空间 l入 p⒅衜aab以了ys疑一 XML Arati继承它所遵循eanp⒅衜a蝝e件的具体位置蔚= nem.ou Xml merati的根结点又性tions⒅衜ae); 薸rtt,获来t╠ prinj旱.outitca洗:书架 xmlns:itca洗y;
15
http://wwwCitca洗鷆np 集合 xmlns:xsiy=entryhttp://wwwCw3.ale/2001;XMLp⒅衜a- str=(cSp 集合 xsi:s⒅衜ae); 薸rt=“http://wwwCitca洗鷆npbook.xsd;
15



as⒅衜ae); 薸rtt此,获有gt个值艿节一用值是m.ouptio,命名空间艿节二个值是供命名空间t<ftXML s⒅衜a稳∥恢梦盗秸遝鋓o空格分隔集鹤⒁fo ≮詔ions⒅衜ae); 薸rtt,获./ba也m.out╲oew P来酌哪里楸开发56ndptioe旱梅匠瓶占

基本格式j旱xmlnsy=entryURIp 集合 t.T j旱.out书架 xmlnsy=entryhttp://wwwCit315.ale/xmlbook/s⒅衜ap 集合 xmlns:xsiy=entryhttp://wwwCw3.ale/2001;XMLp⒅衜a- str=(cSp 集合 xsi:s⒅衜ae); 薸rt=“http://wwwCitca洗鷆npbook.xsd;
15



a.out婚


a.out书a


来调Script 网页聪滦.out/书a


a.oute髡


张孝祥.out/e髡


a.out慧价


28.0这*
out/售价


a.out/书


a.out书架


开发5Ite詔io方称空间 l入(注ML p⒅衜a蝝era

ass(清单:xmlbook.xml.out?xml蝘s.birt//Conver.ng getV巍猚o Stgy=entryUTF-8=list.?quot .out书架 xmlnsy=entryhttp://wwwCit315.ale/xmlbook/s⒅衜ap 集合 xmlns:de oy=entryhttp://wwwCit315.ale/de o/s⒅衜ap 集合 xmlns:xsiy=entryhttp://wwwCw3.ale/2001;XMLp⒅衜a- str=(cSp 集合 xsi:s⒅衜ae); 薸rt=;
15
http://wwwCit315.ale/xmlbook/s⒅衜a http://wwwCit315.ale/xmlbook.xsd http://wwwCit315.ale/de o/s⒅衜a http://wwwCit315.ale/de o.xsd;
15



a.out 书


a.out书a


来调Script 网页聪滦.out/书a


a.oute髡


张孝祥.out/e髡


a.out慧价 de o:币种=”人民币”p

28.0这*
out/售价


a.out/书



4impo.out/书架


开发58

np蕋io方称空间 l入 XML p⒅衜a蝝era

ass(清单:xmlbook.xml.out?xml蝘s.birt//Conver.ng getV巍猚o Stgy=entryUTF-8=list.?quot .out书架 xmlns:xsiy=entryhttp://wwwCw3.ale/2001;XMLp⒅衜a- str=(cSp 集合 xsi:noNubl詒tcep⒅衜ae); 薸rt=;
15
xmlbook.xsd;
15



a.out婚


a.out书a


来调Script 网页聪滦.out/书a


a.oute髡


张孝祥.out/e髡


a.out慧价


28.0这*
out/售价


a.out/书


a.out/书架


开发5;aa,tXML p⒅衜a蝝erati继承方称空间

.outxs:s⒅衜a蝬mlns:xsy=entryhttp://wwwCw3.ale/2001;XMLp⒅衜ap 集合 r=tl))Nubl詒tcey=entryhttp://wwwC itca洗鷆np 集合 e);bllnp; iDefaul y=entryqualified;
15



.outxs:s⒅衜ap

ar=tl))Nubl詒tce绻拿縯 s⒅衜a蝝erati继承,如果属于哪ct方称空间集篹);bllnp; iDefaul  素sion相椭肝rPist竜ns⒅衜a me ra ,I in5;ft根 素s及 其 所 有 子 素s都t,n相蛂=tl))Nubl詒tce鵷ǖ姆匠瓶占溟笨8 HTTP 协议
8.15 裁矗┓HTTP 协议
客户端连ash浴 服务on恍蔚 若想esgB 浴 服务onharAt&用 浴 资源蔚 需遵蚀程法的通讯格式jHTTP 协议的每一个客户端与性、 服务on通迅的格式。t詔iontelnet 以此连ash浴 服务onne并詔ionHTTP 协议escrt&用页@T得以快速了efoHTTP 协议In蒫ep。t安装 IE 浏览on义 HttpWatchne查看蘄E 浏览on 通 HTTP 协议escrt&用页@T。tvoid test1(ivat*hrvoid test1(ectt.*hr info=IntrospSeris.11&me("cn.itcast.reflect.Per调用方法Field("name&n.iSeris.Socket seris.333&qmeris.Socket(9999a;詄ocket sock=seris..accepj} /irowsInintmplsswfin333&qrowsInintmplsswep 集合d:\\qq\\1/htmlp 集合填砄utintmplsswfout=sock{ StOutint passwea;e. st len痹 byte buffer调333&qbyte[1024];詗hCle((len=in.rtsd蘠uffer))

0k pout.wTene(buffer,0llenj&quoin.道o Pej&qout.道o Pej&qsock{道o Pej&qseris..道o Pej&quo} Weblogic tom; WebSphere

Fport 工具查看端口占lt;f以此嚼吹鱛home 环境变量试ass)问题 只要,tPro道詎eer.b 批C型砤ss(节一矗瑃ion.AVA_HOME 环境变量之前位d魏蔚胤絡将n.AVA_HOME 环境变量ass)为蠮DK 取调目挛nekage c tio tr=tiup.b ass(启动 Tom; 了楸丝谡糽t问题 C要 Pen鱛home 环境变量试ass)问题 指in5Tom; ≮D里么当硬盘上有(注om; ./ba点d魏我梢 tr=tiup.b ./baist窃诵型涑筛錾先je般不配)aa8.2 Tip:配置虚拟目挛
Web lib 聪滦好恍蔚若想供外界)问ba/ou 研浴 lib 交给性、 服务on管统ew这ot过程称之为配置 虚拟目挛上萾om; 服务on会字荒管统性、ptps 目挛下的rson性、 lib ne并把的 成曳⑿樗颇柯巍;痪浠八&g只 ou 研浴 项目放置ń萾om; 服务on;ft浴tps 目挛中射不/ou做冷中ass) c下用 浴 lib kage c嗝毒俦煌饨绶)问了楸约扑慊鷋arA任意位置ㄖ WEB lib 蔚若想被外界)问nekam.oup止ねㄖ浴 服务on去管统ew即通知性、 服务on把其 成曳⑿樗颇柯 c下样才能供外界)问楸.out bne j齨eer=“/itca洗p 集合 韵cB瑂ey=entryc:\ptpp 集合 /

aa8.3 Tip2j篐TTP 协议简介
HTTP )穐yperne j齭o琻s萻.1inotocol(超文本传输协议)取简序ew的星 TCP/IP 协议oi成一lib 层协议,sio于rR WEB 浏览on与蠾EB 服务one浣换或对栏龉涕秉HTTP 协议是学习嚼吹鱓EB 聪滦的基石 t不a钊肓薳foHTTP 协议nekaw Ar说掌握装kWEB 聪滦 cl捺直管统和维护n 些复杂ㄖ WEB 站点。oHTTP 协议In版本j篐TTPc1.0、HTTPc1.;ab8.4 Tip3j篐TTP1.0lic HTTP1.1 取区别a,tHTTP1.0l协议中射客户端与性、 服务on建立连接恍蔚p maesgB疑一 浴 资源。oHTTP1.1 协议,题,客户端与性、 服务on建立连接恍蔚ys疑一连接上escr(注≡、 资源。o瑃iontelnet t.T 说胣。t疑一好多同学搞不清楚的问题j旱疑一 浴 页@T中射詔ionimg 嘘签砽is了三幅图片么当客户端)问服务onearA这ot≡、 页@T./bag突
4te. 端总共会)问几次服务onew即向服务on发送合停次oHTTP 请墙一开8.5 Tip4j篐TTP 请墙
客户端连as服务on恍蔚向服务on请墙t&用≡、 资源蔚称之为客户端向服务on发送合疑一 HTTP 请墙一狄梢煌暾 HTTP 请墙包括 javpertj旱疑一请墙行、若干消息头、以及玫体pertst其harAn 些消息头还拥体pertist强裳〃 c消息头lic拥体perte湟猧o空行隔开上如下所示j GET /books/st; /html HTTPc1.1 Accepj: */* Accepj-Langua S: en-ukage n;ctirt: Keep-Alive Ho洗: 剑lho洗 Re萻.er: http://剑lho洗/Penks.asp User-A { : Mozilla;/.0 Accepj-E猚o Stg: gzip, deflste 请墙行

(注消息头

梢豢招锌8.6 Tip5j篐TTP 请墙的细岗——请墙行
请墙行中籊ET 称之为请墙ance(肭絘nce有j POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT 砪ka的有j篜OST、GET还 POST PrGETbaisio于向服务on请墙t&用EB 资源蔚这两省技术取区别主要表 Sys蚨岳法进上ist客户端ubli下两省技术都ge c带n 些蚨岳给服务one 如请墙ance为蠫ET ance( 则ge c在请墙籙RL车刂泛笠?n 懈么辖桓駉n类识岳( (注识岳之 间以薬mp;;; l分隔d prinj旱GET /mailc1.html?is.naabc薬mp;p詗ord=xyz HTTPc1.1 GET ance;fag点:,tURL车刂泛蟾么鴈a菜行是pu限制ㄖ c其识岳rt量w Ar超通 1K。t如请墙ance为蠵OST齛nce(騡e c在请墙拥体perte邢蚍駉n发送识岳(琾rinj旱POST/seri);n/ls.amsmeri);n HTTPc1.1 Ho洗: bne&q-Type: ptpli; 薸rt/x-www-操譱-urlencoded bne&q-Length: 28, pas/abc薬mp;p詗ord=xyz Po洗 技术取ag点:传送类识岳量无限制。 Tip6j篐TTP 请墙的细岗——消息头lio于 HTTP 请墙中砪ka头lAccepj: ne j/html,ima S/* Accepj-CharPro: ISO-8859-1 Accepj-E猚o Stg: gzip,he.b偷ss Accepj-Langua S: en-uk,zh-cn Ho洗: wwwCit315.ale:80 If-Modified-Sence: Tul,11 Jul 2000 18:23:51 GMT Re萻.er: http://wwwCit315.ale/in詄x.jsp User-A { : Mozilla;/.0 (he.b 薸ble; MSIE 5.5; Wi对蟱s NT 5.0)e. Cookieage n;ctirt: 道o P/Keep-Alive Dste: Tul,11 Jul 2000 18:23:51 GMT 疑一 HTTP 响应代St服务on向客户端回送类识岳ew的包括j旱疑一状态行、若干消息头、以及玫体pertst其harAn 些消息头还拥体pertist强裳〃 c消息头lic拥体perte湟猧o空行隔开上 HTTPc1.1 200 OKqmeris.: Microsoft-IIS;5.0 Dste: Thu,13 Jul 2000 05:46:53 GMT bne&q-Length: 2291 bne&q-Type: ne j/html C尧中-w nnrol:衑t.print.outHTML


a.outBODY


a状态行

(注消息头

梢豢招 拥体pert

状态行 格式j旱HTTP 版本号a状态码栽蛐鹗.out銻LF


at.T j篐TTPc1.1 200 OKq状态码io于 对戏駉n对请墙C型辰峁鹐w的星疑一三 十进制数。 煊ψ刺敕治5 t eg掣下 所示j 状态码100~199 200~299 300~399 含义 对铣晒κ绞骨肭降靡罂突Ф思绦峤幌聇源吻肭讲拍芡瓿尚渭疌型彻 对铣晒κ绞骨肭讲⒁淹瓿尚渭疌型彻蘣w襝ka 200 为完成请墙得客户需进n 步细化请墙一prinj肭絀n墒源已经移动疑一新镭址( 襝ka 302、307lic 304t客户端取请墙傩错谓得襝ka 404t服务on端java错谓得襝ka 50p 400~499 50p~59;aa8.7 Tip9j篐TTP 煊ο父凇cka 煊ν
HTTP 请墙中砪ka 煊ν e); 薸rt: http://wwwCit315.ale/in詄x.jsp meris.:artche萾om; bne&q-E猚o Stg: gzip bne&q-Length: 80 bne&q-Langua S: zh-cn bne&q-Type: ne j/html;q颍瑀Pro=GB231 La洗-Modified: Tul,11 Jul 2000 18:23:51 GMT Re韧祍h: 1;url=http://wwwCit315.ale bne&q-Disposit rt: at.tchblln;圆Cle pas/aaatzipaTo琻s萫r-E猚o Stg: chunked
4Ite Set-Cookie:SS=Q0=5Lb_nQ; eer=/search Expi偷s: -1 C尧中- bnrol:衝o-ctche萈ragma:衝o-ctche萭e n;ctirt: 道o P/Keep-Alive Dste: Tul,11 Jul 2000 18:23:51 GMTaa8.8 Tip10j篐TTP 请墙的细岗—通用旋:头
通用旋:头指既\觨于请墙得又\觨于 煊An 些消息头。tC尧中- bnrol:衝o-ctche萈ragma:衝o-ctche萭e n;ctirt: 道o P/Keep-Alive Dste: Tul,11 Jul 2000 18:23:51 GMTaa8.9 Tip11:作业
请写一篇关于 HTTP 协议oi笔紅,要求j ? p清楚 HTTP 请墙头、 煊ν返母袷 请墙头还 煊ν分懈饕煌纷侄问焙 掣果浏览on法进给蠾EB 服务onea菜行pert超通 1K得应voetio那省技术发送请墙消息? 请? p200、302、304、404tic 50p游 煊ψ刺胨 对蟫An庖濉请列举三侄禁止浏览on缓捶ㄖ头字段ne并写jav郞bj盿ss)值艿 请墙调覨rom: 2.Accepj: 3.Accepj-E猚o Stg: 4.Accepj-Langua S: 5.User-A { 磈 6.Re萻.er: 7.Auth一iz 薸rt: 8.ChargeTo:i9.Pragma:蠥ccepj-CharProj If-Modified-Sencej Cookiej Co ne&q-Lengthj Ho洗j User-A { 碼ge n;ctirt 浏览on可式受In傻挠集艿 謚俊当所请墙Inpert远t╮A日期之毫恐经过修改才返回它,否则返回 304t“Not齅odified”应答艿 ass) cookie,这是最重要取请墙头旋:之一 对锨肭较⒄磎er某ざ溶 初始tURL持鞋戎骰投丝谲 浏览ont = ne掣果鰉eri);n 返回Inpert与浏览ont = 有关则)值id t有ep。t 对向欠駇.ou持久连接上如果鰉eri);n 看到锈里取档“Keep-Alive”衖s或者看痰角肭絫<f)稨TTP 1.1(HTTP 1.1 默认;; l持久连接资裁此黭age cp示页志 连接的优点 to币矦T包含(注如果时(prin Atplet蔚=计什么显著地减少下蓉 所m.oun奔滠 ou实现这一点 t鰉eri);n m.ou在应答中p⑺鸵梢 Co ne&q-Length 头(罴虻ガ萵迪謆t;T是:先把pert写入 ByteArrayOutint passwne郴后在正 式写出pert之前计算的到Sys 包含疑一 URL,p=户从竜nURL炒鶶trAn矦T出发)问to请墙Inn矦T艿 请墙p⑺驼攥然衜ail车刂访碝蒼 些特殊ㄖ W、 客户以此t<,浏览on一会ka 到它艿 浏览on可式受In MIME t = 艿 浏览on能够;; l解bl淙识岳编码ance(萯n gzip艿 浏览on所希望ㄖ语裪种t eg档狈駉n能够辛 疑种以关时语裪版本时要ionI。

UA-Pixels,UA-Color蔚 由某些版本ㄖ IE 浏览on所p⑺蚸眗潜曜既∏肭酵肺 对掀聊籗ys  颜色深度堍te UA-OS,UA-CPUj Range

co系统ic CPU t = 艿 Range 头域ge c请墙t堤錹i成一或者(注子范围一prinj 对贤 50p幼⒆纸冢篵ytes=0-499 对蟫诙 50p幼纸冢篵ytes=50p-999 对献詈 50p幼⒆纸冢篵ytes=-50p 对 50p幼纸谝院骿眗段В篵ytes=50p节一用和最后一用字节:bytes=0-0,-1 同时tㄍ,羠段В篵ytes=50p-600,601-999 但蚯服务onge c忽略此请墙头ne掣果无条 GET 包含 Range 请墙头么响应会 以状态码206(ls.tialCo ne&q)返回 O2(星以200(OK檬病

煊ν纷侄谓鲇o于 煊ο Accepj-Ranges Age ETag La洗-Modified 缓捶相关In头ne能做方实./ba冷蛀ㄖ头只做方秒一级艿 mera最后改动n奔滠悼突Э梢酝blifIf-Modified-Sence 请墙头辛 疑一日期ist竜请墙将被视为疑一条 GET蔚p 有改动n奔涑倜縯╪奔淙∥牡挡舥t返回ist否则返回疑一 304(Not齅odified)状态艿 这ot头配合 302t詔io,p=于告诉浏览on去找t腸t墒源。e); 薸rtt= ne2(星枚举 ass)ㄖ ci求 通 Httpmeri);nRespostc5;ftsendRedi偷rs bt;T&g竌bt;T同时ass) 状态publ为302。

e); 薸rt

anuxy-Authllni; 薳 Retry-Afner Vary WWW-Authllni; 薳 bne&q-Type Co ne&q-E猚o Stg 对虾竺嫒∥牡凳粲 裁 MIME t = 艿meri);n 默认为衝e j/plain to= nem.ou显 式地贮法为衝e j/html艿 mera编码(E猚o e)穞;T。p 有在l,码之毫才可以絘nIn bne&q-Type 头贮法 Inpertt = 艿p示襱gzip 压缩文档能够显著地减少 HTML mera下蓉n奔滠道吹饔籊ZIPOutint passw ge c很方便地;; ltgzip 压缩 to玴 有 Unix 关时 Netscapetic Wi对蟱s 关时 IE 4、IE 5 才祋uo它艿 no-ctche萵o-ctche扔oys虿么1候认为mera已经过期is不再缓捶它?-1 Pr0换捍酚 对箱纎n应voys多少n奔渲了⑿耺era泵以秒计。除了刷新tomerat鈏st你还可以蚥lifProH祍derep 集合Re韧祍hp 集合Set(); I5; URL=http://ho洗/ eerp 集合倘娩纎n读贮法 Inn矦T艿 以下蓉ance打看t蚨岳个传送ance 源t服 务 on衖n 果鼍 受幼 岗 范 围 请 墙(byte-o琻ge requnns那 么 可 以tp 送 Accepj-Ranges:qbytes 但蚯胾俊胸要下样做上瓤突Ф嗽诿u俊式使此蚢域时疑以接 产生字节r段肭降╞yte-o琻ge requn檬病7駉n掣果w Ar式受d魏蝨 = j眗段 请墙(o琻ge requn檬裁唇玼t发送 Accepj-Ranges:none 去告诉客户不要尝试范 围请墙(o琻ge requn檬曹 贮法了返回In W、 墒源In傻节r段А8袷绞牵轰 bne&q-Range:100n-3000/50p0
4;aaC尧中- bnrol萈ragma Expi偷s Re韧祍haaCo ne&q-Disposit rtaTo琻s萫r-E猚o Stg Accepj-RangeaaCo ne&q-Range

蚨岳压缩蚨岳 p.Entryd要 y=entryaaaap 集合; ByteArrayOutint passwpbout=33&q yteArrayOutint passw} /iGZIPOutint passw gout=33&qGZIPOutint passw(bout /igout.wTene(砸 { St yte } ///包装流je般有缓冲igout.道o Pej&//为确眛有蚨岳 byte gzip调3bout.to yteArray} /// anI压缩后j彬对 偷spostctProH祍derep 集合 bne&q-E猚o Stgp 集合Set(); Igzipp 集合填惩祍postctProH祍derep 集合 bne&q-Lengthp 集合Segzip.length+;
15

集合ke 偷spostct StOutint passwea.wTene(gzip /i显韵图片 偷spostctProH祍derep 集合w nne&q-typep 集合Set(); Iima S/bmpp 集合填矷nintmplsswfin3thes{ Stmeri);n bne j,Lo.geResour騭Asmplssw,p 集合v1.bmpp 集合填 st len痹 byte buffer调333&qbyte[1024];設utint passw out=偷spostct StOutint passwea;詗hCle((len=in.rtsd蘠uffer))

0k pout.wTene(buffer,0llenj&quo以下蓉ance打看t偷spostctProH祍derep 集合w nne&q-disposit rtp 集合Set(); Iat.tchblln;睠le pas/3.jpgp 集合填矷nintmplsswfin3thes{ Stmeri);n bne j,Lo.geResour騭Asmplssw,p 集合v1.bmpp 集合填 st len痹 byte buffer调333&qbyte[1024];設utint passw out=偷spostct StOutint passwea;詗hCle((len=in.rtsd蘠uffer))

0k pout.wTene(buffer,0llenj&qu

9鰉eri);n 聪滦
9.1 Tip:meri);n 简介
meri);n )穝un 公司辛 oi成门p=于聪滦动态≡、 资源取 Be艿 Sun 公司在其 序代中辛 Obje一 teri);n 个枚,sio户若想kab⒁梢欢浴 资源(即聪滦疑一 来调右源私向浏览on输ja蚨岳n么m.ou完成以下f2 个慕骤j 程序疑一 来调觮 egn迪 teri);n 个枚。t把聪滦好时嚼吹饔类部署nIn浴 服务onha。t 绦蛞梢 来调右源嗣聪蜾纎n输ja“hello seri);n”。t 绦蛘鈕t以此m.ou解决时2 个问题j旱,t来调右源酥猩鋙t;1才能向 IE 浏览on输ja蚨岳?te 输ja hello seri);n蝇然st; 炒雐o写在以此Inp腸t穞;T内? 增属mmeri);n 序磗t解决以关gt个问题。

9.2 meri);n ,t浴 lib 中位置

9.3 Tip:meri);n ,人行过程(课后看)
meri);n 以此t荕蒮WEB 服务on絚ep,浴 服务on收到客户端eanperi);n )问请墙恍魏 ①W、 服务on首先检查蚯否已经在源并Clas了竜nperi);n n道齟(“上如果ct,则枚举执行第④瞖( 否则蔚p葱械冖诓健②在源并Clas竜nperi);n 疑一n道齟(“上 ③絚eptmeri);n 5例e(“eaninij} rivate ④Clas成一l=于封装 HTTP 请墙消息ㄖ Httpmeri);nRequn e(“滞 梢 u表 HTTP 煊οⅷ Httpmeri);nRespostc5e(“ne郴后絚eptmeri);n ;ftserv.ce( riva并;肭交 煊(“会按运行法进进去。t⑤WEB lib 以此被停止或重新启动之前,meri);n 引擎将卸蓉 meri);nne并在卸蓉之前蝐eptmeri);n ;ftdesnroy} rivate

5;ab 9.4 Tip:,tEcliptc5中聪滦衜eri);n

新絪成一 j2ee 1.4蝇让壹蘨s完成毫说 I猚o.b 薸ble籹t; 矯e.bli=(cS Level车恪No,p=新类(高版本j┍ 译onew

添加疑一 tom; 服务on wi对蟱/P类祍.e(cS/MyEcliptc/meris.s/Tim; /Tom; 7.x 选择目挛ic Enable胃荒0甯栈籥shMyecliptc9.0, 结果要修改 teri);n 模板n焙虿幌 Myeclptc6.5 一样Ar搜薾类nInseri);n.st; 沉. 网上搜了下t裁u俊搜到,还好求助了下老师,riva雀下. xlaanug的評rowss\MyEcliptc\Ce.mon\plug st 下找nInco.o.gnuenec.ecliptc.wiz rds_9.0.0.me201012172208.str,郴后eptwi秗tr未蚩,找nInte.bl 薳s未蚩春缶湍 找nInmeri);n.st; 沉. ou是膕,)8.5 的话,搜:he.o.gnuenec.ecliptc.wiz rd*.str 这ot关键丛贤行了. 拷彬疑一靡继恍蔚更富发布路径,靡继; 以/MyEcliptc/W、 富发布路径ab 9.5 Tip:meri);n 个枚n迪掷
meri);n 个枚 SUN 公司rR辶薵t个默认n迪掷啵直鹞篏enet.cmeri);n、Httpmeri);n。oHttpmeri);n 贮能够C型 HTTP 请墙;ftservlet蔚了谠 meri);n 个枚上添加Obje些与蠬TTP 协议C型撤 ;T&g它娜 meri);n 个枚枚举l看蟆R虼舜下腥嗽 在程序umeri);n /ba= ne应继承这ot类,而避免 侄举去n迪 meri);n 个枚。oHttpmeri);n ys虻现 meri);n 个枚./ba覆序Obtserv.ce bt;T&g竌bt;T体内个代码会字荒判断io户取请墙方 ce(缥GET 请墙得则蝐eptHttpmeri);n ;ftdoG;n bt;T&g如为蠵o洗 请墙得则蝐eptdoPo洗 技;T。因此ist肯滦人 在程序umeri);n /ba= ne只/ou覆序tdoG;n PrdoPo洗 技;Tew O2(要去覆序tserv.ce bt;T。o增属mHttpmeri);n 序代mera

9.6 Tip:meri);n ,n 些细岗t桓
由于赐户端是 通 URL车刂贩)问 浴 服务onharA资源蔚所接 meri);n 以此若想被外界)问nelist 研teri);n 程 此接 射 到 一 个tURL车 址 关衖st这 个t工te骱 浴.xml祄e  ,J箂ion.outteri);n


ag 素sic .outteri);n-mptpeng


如果完成。o.outteri);n


g果的每注册 meri);nne的包含有gt个主要位子g果:.outteri);n-类型

和.outteri);n-道

,分别sio于ass) peri);n 注册方称ic peri);n 完整类名。t疑一.outteri);n-mptpeng


如果io于 成乙梢灰炎⒉醗anperi);n oi成一对外)问路径,的包含有gt个子g 素:.outteri);n-类型

和.outurl- eenern

,分别的每t peri);n 注册方称ic peri);n 对外)问路径一pr衖nj旱.out浴-ptpp

a.outteri);n


a.outteri);n-类型

AnyNubl.out/teri);n-类型

.outteri);n-道

Helloperi);n.out/teri);n-道

.out/teri);np

a.outteri);n-mptpeng


.outteri);n-类型

AnyNubl.out/teri);n-类型

.outurl- eenern

/de o/hello/htmlpout/url- eenern

.out/teri);n-mptpeng


.out/浴-ptpp

a弯成个鰉eri);n 磂 c被 成襫I(注RL成蟟s即(注.outteri);n-mptpeng


如果的.outteri);n-类型

子g果j盿s s)值傅拿p峭涑筛鲻meri);n 位注册方。o远 Seri);n 成襫I籙RL持幸梢越釉tio*通配符档莗 ma有gt种固法rA格式j旱疑种格式是t“*.雒毒名”衖s 另疑种格式是以正斜杠(/)开头并以“/*”结尾。o.outteri);n-mptpeng


.outteri);n-类型

AnyNubl .out/teri);n-类型

.outurl- eenern

*.do pout/url- eenern

.out/teri);n-mptpeng


.outteri);n-mptpeng


.outteri);n-类型

AnyNubl .out/teri);n-类型

.outurl- eenern

/a试irt/* pout/url- eenern

.out/teri);n-mptpeng




5impo对于雀下rAn 些 成夜叵礿旱Seri);n1接成襫I /abc/* Seri);n2接成襫I /* Seri);n3接成襫I /abc Seri);n4接成襫I *.do 问题j旱URL/abc/a/html/abc/abc/a/do /a/do /xxx/yyy/a/do 都匹配t“/abc/*”和“/*”t“/abc/*”和“/abc”t“/abc/*”和“*.do”t“/*”和“*.do”t“/*”和“*.do”t哪ct teri);n 煊ΦSeri);n1絊eri);n3礢eri);n1絊eri);n2 meri);nindperi);n 星疑一供冷蛀t来调右源耍╩eri);n 引擎)萩ep时嚼吹饔类,的w Ar独立人行,的,人行完全M蒮meri);n 引擎来控制ic调度艿 针对客户端ea多次omeri);n 请墙得 = ne情况下( 服务one换酑las成一tmeri);n 5例e(“( 也.I)说 peri);n 械例e(“一旦Clas么它ka会驻留≮Z碩中射未后续ea冷中请墙服务蔚p敝 浴 容器退ja,teri);n 实 例e(“才ut销毁。o远 Seri);n rA瘴集生命周期Z,meri);n eaninij bt;T只被萩ept源巍6鴏a疑个鰉eri);n 的房次)问请墙都t导致fmeri);n 引擎萩ept源 teri);n ;ftserv.ce bt;T。对于房次)问请墙,meri);n 引擎都会Clas成一新 ㄖ Httpmeri);nRequn 请墙e(“滞 梢恍吕 Httpmeri);nRespostc5 煊(“蔚 然后将这gt个e(“会按运t蚨法进给的ep时絧eri);n tserv.ce( riva,teri.ce bt;T再根据请墙ance分别蝐eptdoXXX bt;T。o如果在.outteri);n


g果中配置Object.outload-on-tr=tiup


如果ne那么 WEB lib 以此在启动./baka会宗源并 Clas peri);n n道齟(“散以及絚eptmeri);n 5例e(“eaninij} rivate t.T j旱.outteri);n


a.outteri);n-类型

invok涣pout/teri);n-类型

.outteri);n-道

ale.artche.; Pen鱰Prri);ns.Invok涣peri);n .out/teri);n-道

.outload-on-tr=tiup


2.out/load-on-tr=tiup


.out/teri);np

a星疑一正整 ja数字越小么先启动。oka途j何浴 lib 序疑一 Inijperi);n c下用 teri);n 配置为启动./宗源射未瘴集性、 lib Clas胸要时津对揽獗澈万对馈如果t&用eri);n 映梢路径仅仅为疑一正斜杠(/)衖s那么这oteri);n 就成为to W、 lib 以此In 缺省eri);n。o穙v 浴.xml祄erray找不到匹配的.outteri);n-mptpeng


如果籙RL么它们j眗)问请墙都将交给缺省eri);n C型砨a也.I)说&g缺省eri);nsio于C型硆son冷蛀tperi);n 都不C型砵眗)问请墙。o远 .outtom; 话 装 目 录

\w nf\浴.xml祄e  ,N 注 册 Obt一 个t方5称 为 ale.artche.; Pen鱰Prri);ns.Defaul peri);n tperi);n c并;鈕teri);n ass)为了缺省eri);n。o当)问 Tom; 服务onearAt&用静态TML me件和图片./ba实际上v 诜)问这ot缺省eri);n。ab 9.7 Tip:meri);n ,n 些细岗t7)—线程安全
当(注客户端并发)问弯成个鰉eri);n ./ba浴 服务on会为每一注客户端j眗)问请墙Clas成一线程蔚 并在这ot线程关蔯eptmeri);n ;ftteri.ce bt;Tba因此tserv.ce bt;Tper绻)问了弯成个墒源In话,就有 可能引发线程安全问题。o如果t&用eri);n 虻现ObtSengleThrtsdModel掣雒叮敲 meri);n 引擎将以渐线程tJ趵词cep其 teri.ce bt;T艿 SengleThrtsdModel掣雒吨忻u俊rR錮魏蝏t;T&g 只要,tmeri);n .类rR逯性黾域迪 mengleThrtsdModel掣雒秊盿坛屑创伞对于虻现ObtSengleThrtsdModel掣雒妒苯peri);n,meri);n 引擎仍然祋uo对竜nperi);n 多线程并发)问&g 其一个inance是产生(注eri);n 械例e(“ne并滦的每个线程分别蝐ep成一独立时絧eri);n n道齟(“上 虻现 mengleThrtsdModel掣雒恫⒉荒苷嬲饩觥peri);n 线程安全问题ba因按tperi);n 引擎会Clas(注eri);n 械例e(“ne 而真正n庖迳辖饩龆嘞叱贪踩侍怛莗敢筛鲻meri);n n道齟(“被(注线程同时蔯ept的问题。事实关 c远 Seri);n 序代2.4又猩湟丫玭mengleThrtsdModel潮昙┮ Deb偷; 薳d 通时誓檬病tc子类在覆盖福雷inan;T是不能抛出比父类更.类异常

9.8 Tip:meri);n bfig e(“a,tperi);n 配置蝒rraybage c詔io成一或(注.outinij- e.am

嘘签以 teri);n 配置n 些初始化运行。i当 teri);n 配置了初始化运行恍蔚浴 容器在Clas teri);n 实例e(“./ba会字荒;庑┏跏蓟诵蟹庾 nInmeri);n bfig e(“中射并在蔯eptteri);n eaninij bt;T./ba将nmeri);n bfig e(“法进给衪eri);n。进而( 以此员 通 meri);n bfig e(“kage c anIto teri);n ea初始化运行旋:。o增属mmeri);n bfig 序磗t并t.T 说胣该e(“絥蒫epj旱esgB傻挠集编码詄sgB蚨岳库连接旋: esgB配置蝒rrne查看蘳nruts 案例ean浴.xml祄e件

Requn Requn peri);n w nfig peri);n w nne j齋祍sirt cookie

Ie W、 服务on teri);n

9.9 Tip:meri);n bne j
WEB 容器在启动./ba它会为每注EB lib 以此都Clas成一对觔j眓meri);n bne j齟(“ne它代Strpto 浴 lib 艿 Seri);n bne j齟( 象 被 包 含o远 Seri);n bfig e( 象 ,st肯tp 人 员o远 编 序tserv);n 时衖s 可 以t椭惫 meri);n bfig{ Stmeri);n bne j bt;TesgB飧鰉eri);n bne j齟(“oi砽is集
5te. 由于疑个鯳EB lib 中rson peri);n 共享弯成个鰉eri);n bne j齟(“ne 因此tperi);n (“e淇梢酝blifmeri);n bne j齟(“来虻现通讯。meri);n bne j齟(“= ne也l怀浦 cobne j騟(“上 查看蘭eri);n bne j虼鷐era蔚了efomeri);n bne j齟(“oi枚举上 rtcka S cnCitca洗;tvoid test1(ivatIO java.uti;tvoid test1(ivatPt.&qWTener;tvoid test1(iutil.EnumeTeairt;tvoid test1(xtPrri);n.meri);n bfig;tvoid test1(xtPrri);n.meri);n java.uti;tvoid test1(xtPrri);n.http.Httpmeri);n;tvoid test1(xtPrri);n.http.Httpmeri);nRequn;tvoid test1(xtPrri);n.http.Httpmeri);nRespostc/itcmeri);n bfig l=于封装 teri);n ea配置 e; Pers道詏meri);nDe o5 e jendsmHttpmeri);n {衑t.printmeri);n bfig w nfig; ubli; ersondoG;n(Httpmeri);nRequn requn, Httpmeri);nRespostc5偷spostcaField(&qmeri);n java.uti, IO java.uti} pt.Entry<I=thes{ Stmeri);n bfig,Lo.geInijls.amenerep 集合d要 p 集合填//= ne用 Stringbt;T&g因按父类已经序Obte.Entry<I2=w nfigo.geInijls.amenerep 集合d要 p 集合填惩test2(){ Map<IngetKe+;
15
,p 集合+Strin2j&q偷spostct StOutint passwea.wTene(p 集合merieltDe o2!!p 集合{ St yte } /itc anIrsonj眓EnumeTeairt e=Fiees{ StInijls.amenerNubl詝 /iwhCle(ev,sMorSEl;bllnki k pe.Entrya=(e.Entr) eect jElebllnia;詄.Entry&=thes{ Stmeri);n bfig,Lo.geInijls.amenerea /i蛅est2(){ Map<Ina+;
15
y=entry+vj&quo} @Ois.ride ubli; ersoninij}meri);n bfig w nfigaField(&qmeri);n java.uti} piees{w nfig=w nfig; suite.inij}w nfigj&quo}

9.1p 諸ip:meri);n bne j齦ib

(注tperi);n 通 meri);n bne j齟(“虻现蚨岳共享上 rtcka S cnCitca洗;trtcka S cnCitca洗;e. mport st; /vatIO java.uti;tvoid test1(ivatPt.&qWTener;tvoid test1(xtPrri);n.meri);n bne j;tvoid test1(xtPrri);n.meri);n java.uti;tvoid test1(xtPrri);n.http.Httpmeri);n;tvoid test1(xtPrri);n.http.Httpmeri);nRequn;tvoid test1(xtPrri);n.http.Httpmeri);nRespostc/ie; Pers道詏meri);nDe o6 e jendsmHttpmeri);n {//teri);n bne j纠 ubli; ersondoG;n(Httpmeri);nRequn requn, Httpmeri);nRespostc5偷spostcaField(&qmeri);n java.uti, IO java.uti} ptc anI teri);n bne j齧eri);n bne j齝obne j=thes{ Stmeri);n bfig,Lo.gemeri);n bne j} /imeri);n bne j齝obne j2=thes{ Stmeri);n bne j a;詄.Entryd要 y=entryaaaaap 集合; cobne jtPro;t.Enbu(Pi;
15
d要 p 集合, d要 j&quo} escr鯳EB lib r某跏蓟诵小.outcobne j- e.am

.out e.am-类型

d要 pout/ e.am-类型

.out e.am-Strin

zzzzpout/ e.am-Strin

.out/cobne j- e.am



mport st; /vatIO java.uti;tvoid test1(ivatPt.&qWTener;tvoid test1(xtPrri);n.meri);n java.uti;tvoid test1(xtPrri);n.http.Httpmeri);n;tvoid test1(xtPrri);n.http.Httpmeri);nRequn;tvoid test1(xtPrri);n.http.Httpmeri);nRespostc/it* teri);n bne j颍1ba是疑一容器 2。蒫epr段莟lib 以此r段 */ e; Pers道詏meri);nDe o8 e jendsmHttpmeri);n {衑ubli; ersondoG;n(Httpmeri);nRequn requn, Httpmeri);nRespostc5偷spostcaField(&qmeri);n java.uti, IO java.uti} pt.Entry<I 3 (e.Entr) thes{ Stmeri);n bne j,Lo.ge;t.Enbu(Pi;
15
d要 p 集合j&q偷spostct StOutint passwea.wTene(Strin{ St yte } /quo}

thes{ Stmeri);n bne j,Lo.ge;t.Enbu(Pi;
15
d要 p 集合j&te缘现 meri);n In赡泛。oRequnDispatcher rd=thes{ Stmeri);n bne j,Lo.geRequnDispatcher,p 集合v1.jspp 集合填惩d.操譿 rd(requn, 偷spostca; p示襱meri);n bne j齟(“读墒源文件。 anI文件路径 读墒源文件rA三侄ance .inopernies蝍ss() 以莂ss() url=jdbc:mysql://剑lho洗:3306/薳st uter pas/root齪詗ord=root齞b.inopernies畏牛瑃Prc 目挛下,因按该目挛下的墒源文件发布时ut发到/WEB-INF/道詄s文柯蜗
5Ite Inintmplsswin3thes{ Stmeri);n bne j,Lo.geResour騭Asmplssw,p 集合vWEB-INF/道詄s/db.inoperniesp 集合填砤nupernies蝘nops=33&qanupernies a;詉nops.load(inj&q蛅est2(){ Map<Ininops.; manuperny,p 集合urlp 集合 /itcin2t的相对路径是ttom; 籦in文柯挝邓诱庵禷n法ou在该目挛下建立ass(夹 道詄sne并把ass(放o远锈里irows圆Cle333&qrows,p 集合p 集合填惩祍postct StOutint passwea.wTene(睠le.; mAbsolutePeer,Lo.ge yte } /itc以关gt行代码 anIto路径 C:\pt尧中-tom; -7.0.22\bin蝦owsInintmplsswfin2333&qrowsInintmplsswep 集合道詄s/db.inoperniesp 集合填砤nupernies蝘nops=33&qanupernies a;詉nops.load(in2 /itc anI绝la路径 e.Entry eer=thes{ Stmeri);n bne j,Lo.geRealPeer,p 集合/WEB-INF/道詄s/db.inoperniesp 集合填砮.Entry睠le pas/neer.subs.Entr(neer.例秚In詄xOf,p 集合\\p 集合 /irowsInintmplsswfin2333&qrowsInintmplssweneer /ianupernies蝘nops=33&qanupernies a;詉nops.load(in2 /irtcka S cnCitca洗;tvoid test1(ivatIO java.uti;tvoid test1(ivatPt.&qWTener;tvoid test1(xtPrri);n.meri);n java.uti;tvoid test1(xtPrri);n.http.Httpmeri);n;tvoid test1(xtPrri);n.http.Httpmeri);nRequn;tvoid test1(xtPrri);n.http.Httpmeri);nRespostc/i mport cnCitca洗.dao.UserDao/itcteri);n ecep其它以此么在其它以此ti萾;1 去读配置蝒rritc 通类宗源器 e; Pers道詏meri);nDe o1 e jendsmHttpmeri);n {衑ubli; ersondoG;n(Httpmeri);nRequn requn, Httpmeri);nRespostc5偷spostcaField(&qmeri);n java.uti, IO java.uti} pUserDao uter333&qUserDao a;評ter.upd要e( &quo} rtcka S cnCitca洗.dao;tvoid test1(ivatrowsInintmplssw;tvoid test1(ivatrowsNotFoy&d java.uti;tvoid test1(ivatIO java.uti;tvoid test1(ivatInintmplssw;tvoid test1(ictt.URL;tvoid test1(iutil.anupernies/itcr绻镰郎试次募䌷A以此2(星 teri);n ea话,itc就p ma 通类转源器去读了isass(不能太大itc用法进运行riva不簆,耦合性高 e; Pers道詏UserDao {衑t.printtr=ni;ianupernies蝑bc nfig=33&qanupernies a;詔r=ni;i{ I猧ntmplsswfin3UserDao.道詏s,O淅訪oadereLo.geResour騭Asmplssw ep 集合db.inoperniesp 集合填硉ry} pdbc nfig.load(inj&q} ; 薱h (IO java.uti}e个inthrow 33& ExcepjirtItItit Pez涣Err僮輊 &quo//上面代码类宗源器只宗源t源,下面代码疽t类宗源技术萢nI文件位置RL硊rl=UserDao.道詏s,O淅訪oadereLo.geResour騭ep 集合db.ino perniesp 集合填te S.Entrys.E=url.; maeer,L/itc睠le:/C:/pt尧中-tom; -7.0.22/浴tps/day05/W EB-INF/道詄s/db.inopernies齭oy} pI猧ntmplsswfin2333&qrowsInintmplsswes.EL/itry} pdbc nfig.load(in2 /i} ; 薱h (IO java.uti}e个inthrow 33& ExcepjirtItItit Pez涣Err僮輊 &quo} ; 薱h (rowsNotFoy&d java.uti e1个inthrow 33& ExcepjirtItItit Pez涣Err僮輊1 &quo} rubli; ersonupd要e( } ptyste..out.intltln(dbc nfig.; m,p 集合urlp 集合 /iuo}

9.1;abTip:meri);n 高级lib —peri);n 与缓捶

ass)缓捶ㄖgt种场景j旱场景一:对于不经常变怀时识岳(瑃Prri);n 中磂 c为其ass)合统j被捍穘奔渲a泵以避免浏览on频繁较蚍駉n发送请墙得提升服务on类性举上 场景二:r绻鹢u实现疑种高级枚举is即客户端请墙e浴 资源./bai浴 资源发现发给客户端t的蚨岳更新了is就给客户端发送最新类识岳(瑀绻⑾质对烂u俊更新得则i浴 资源就要客户端 就去)问它自己缓捶ㄖ蚨岳。此种情况可以蚥li覆序动态≡、 资源(即tPrri);n)j眓; mLa洗Modifygbt;T 予 c缘现上 ; mLa洗Modifiedgbt;TM蒮Prri.ce bt;T絚ep,默认情况下(; mLa洗Modifiedgbt;T返回疑一负 ja肯滦人 员在程序uPrri);n ./ba掣果w 覆盖 ; mLa洗Modifiedgbt;T得则房次)问 teri);n /baPrri.ce bt;T发现 ; mLa洗Modifiedgbt;T返回负 ja它ka会蝐eptdoXXX bt;T向客户端返回最新类识岳。此种情况下( 务器在向客户端返回tdoXXX bt;T返回In蚨岳./ba不会ys蚨岳上加 La洗-Modified 头字段。o如果程序uPrri);n ./ba覆盖Obt; mLa洗Modifiedgbt;Tne并碌回&qu一n奔渲a泵则g突Ф朔)问eri);n /bafPrri.ce bt;T首先会检查赐户端是否 通 If-Modified-Sence 头字段带n 一n奔渲a通来。掣果胾俊In话, 则fPrri.ce bt;T会蝐eptdoXXX bt;T向客户端返回最新类识岳。 诜祷仳对./baPrri.ce bt;T还会蝐ept; mLa洗Modifiedgbt;T萢nIqu一n奔渲a泵并以这otn奔渲ays蚨岳上加上疑个鯨a洗-Modified 头字段。o(即t椭知客户端缓捶n对(┤客户端在)问 Prri);n ./ba掣果 通 If-Modified-Sence 头字段带Objectn奔渲a通来得则fPrri.ce bt;T,t蝐eptdoXXX bt;T之前,它会先蝐ept; mLa洗Modifiedgbt;Tne萢nIqu一n奔渲a泵并与赐户端带通来n 间值;; l比较is掣果比客户端ean奔渲a要新得则fPrri.ce bt;T絚eptdoXXX bt;T向客户端返回最新类识 岳。r绻鹢u旧得则fPrri.ce bt;T O2(会蝐eptdoXXX bt;T向客户端返回识岳(琲欠祷匾梢 304tIn纱态
5;aa 码给客户端ba= 知客户端≮C它缓捶中蚨岳。

9.1indTip:; mLa洗Modifiedgbt;TM牖捍

9.1impTip:缓捶ㄖlib

ject网站有很多静态资源蔚prin c对o文件、html硁矦T堍gif 图片等等 c下些文件一旦Clas么有磂ma永 远2(会更新艿奖客户端节一矗)问这些文件./ba服务on在把ass(蚨岳交给客户端ea同时,就应vo椭敝突Ф嘶捍氛庑┪募㱮s以后客户端房次)问ba服务onr绻⑾謅ss(没更新得则应要客户端去C它 缓捶中蝧s()a以减轻服务on类压力。o编程魏詔io成一 Prri);n 读jectass(蚨岳给客户端ba当ass(蚨岳未更新时,= 知客户端去)问它缓 捶中蚨岳ne掣果蝧s(蚨岳更新了is则向客户端返回最新蚨岳。oTom; 服务onearArson静态≡、 资源蔚 都t荕梢梢蝗笔 Prri);n 负责读回送给客户端ea蔚了.I)以成霞际趵刺嵘駉n类性举上

9.1北嗤祍postc、requn e(“a
Web 服务on收到客户端eanhttp 请墙得会针对每一次请墙,分别Clas成一l=于代St请墙In requn e( 象、和代St 煊Aq偷spostc e(“。orequn ic 偷spostc e(“即然代St请墙还 煊Γ俏颐且猠scr客户机提交通来n对(恍/ou找aa requn e(“贤行了。要向客户机输ja蚨岳,只/ou找 偷spostc e(“贤行了。 Httpmeri);nRespostc5e(“服务on类 煊ΑU鈕te(“中p庾傲讼騡突Ф朔⑺万对馈⒙兴 煊ν罚⑺ 煊ψ刺雐nan;T。oProH祍derest; /lang.S.Entry pas, st; /lang.S.EntryStrin)ets a 偷spostc h祍dertwithnthe given, pas and Strin.oProSr=nus(int sc)t; mWTener()t; mOutint passweaets the tr=nukaco e 操譸ieesq偷spostct Returst aian.&qWTener obj祌s th canoPrnd 颍瑀a试ertne j齭o the clilln. Returst aiperi);nOutint passw suenable尾僮pwTenntrybinary d要 nin the 偷spostctmpTip:偷spostc 常见lib 较虼突Ф耸鋔a中伪蚨岳 GB231 UTF-8

IEndperi);n

分别以砄utint passw ic an.&qWTener 输ja S.Entryd要 y=entry中国 p 集合/itc以此 c圆么码 对鋔a)a姨法要控制浏览on c圆么码 洞蚩磘偷spostctProH祍derep 集合 bne&q-typep 集合Set(); Ine j/html;颍瑀Pro=UTF-8p 集合填砄utintmplsswfout=偷spostct StOutint passwea;//out.wTene(砸 { St yte } /pout.wTene(d要 o.ge yte }p 集合UTF-8p 集合蘪&q.Entryd要 y=entry中国 2 p 集合/itchtml: .outmenap

嘘签模拟一个鰄ttp 煊ν Outint passw out=偷spostct StOutint passwea;//out.wTene(砸 { St yte } /pout.wTene(p 集合.outmena鰄ttp-equivy=#39tw nne&q-typep#39t w nne&qy=#39tne j/html;颍瑀Pro=UTF-8p#39tp

p 集合{ St yte } /iout.wTene(砸 { St yte }p 集合UTF-8p 集合蘪&q.Entryd要 y=entry中国 qp 集合/itc ass) 偷spostc t<f码 兜靡钥刂 偷spostc c圆么码 断蜾纎n输入蚨岳 , 默认为 ISO-8859-1 偷spostctProChara试erE猚o Stg,p 集合GB231蕄 集合填//贮法浏览on c圆么码 洞蚩捶駉n发送j彬对 偷spostctProH祍derep 集合 bne&q-typep 集合Set(); Ine j/html;颍瑀Pro=GB231蕄 集合填//偷spostctProH祍derep 集合 bne&q-typep 集合Set(); Ine j/html;颍瑀Pro=ISO-8859-1p 集合填砤n.&qWTener out=偷spostct StWTener();pout.wTene(d要 ///q.Entryd要 y=entry中国 qp 集合/
6;ab //该句代码 燃塾谄浜竺媪骄鋞偷spostctPro bne&qType,p 集合ne j/html;颍瑀Pro=GB231蕄 集合填//偷spostctProChara试erE猚o Stg,p 集合GB231蕄 集合填//偷spostctProH祍derep 集合 bne&q-typep 集合Set(); Ine j/html;颍瑀Pro=ISO-8859-1p 集合填砤n.&qWTener out=偷spostct StWTener();pout.wTene(d要 ///qb 絆utint passw 输ja 1ba赐户端看到,)圆么?te9.1te.ass(下蓉ndp.Entry eer=thes{ Stmeri);n bne j,Lo.geRealPeer,p 集合/韵wnload/33&.jpgp 集合填//C:\pt尧中-tom; -7.0.22\浴tps\day06\韵wnload\33&.jsp e.Entry睠le pas/neer.subs.Entr(neer.例秚In詄xOf,p 集合\\p 集合+1 &qInintmplsswfin33ull;絆utint passw out=3ull;酵祍postctProH祍derep 集合w nne&q-disposit rtp 集合Set(); Iat.tchblln;睠le pas/p 集合+睠le pasL/itcr绻氯豠ss(蚯中伪蝧s()a则ass(名/ou经过硊rlo编码酝祍postctProH祍derep 集合w nne&q-disposit rtp 集合Set(); Iat.tchblln;睠le pas/p 集合+URLE猚o er.encode(睠le pas,p 集合UTF-8p 集合蘪&qtry} pin333&qrowsInintmplssweneer /i st len痹 byte buffer调333&qbyte[1024];詏ut=偷spostct StOutint passwea;詗hCle((len=in.rtsd蘠uffer))

0k pout.wTene(buffer,0llenj&quo}finally pif(in!=3ullk ptry pin.道o Pej&qu; 薱h(Excepjirt ek pe.intltSr=ckTra蔱( &quo} }

生成随机图片te9.16nd发送 http 头ne控制浏览on法n彼⑿峦(REFRESH)e.偷spostctProH祍derep 集合类低祍hp 集合Set(); I3p 集合填惩.Entryd要 3 33& RandomeLoct jInt(100n00)+;
15

集合;e. 偷spostct StWTener().wTene(砸 j&q偷spostctProH祍derep 集合类低祍hp 集合Set(); I3;url==#39t/day06cin詄x.jsp=#39tp 集合填惩祍postctPro bne&qType,p 集合ne j/html;颍瑀Pro=GB231蕄 集合填惩.Entryd要 3 33& RandomeLoct jInt(100n00)+;
15

集合;q偷spostct StWTener().wTene(p 集合登录成功ba将,t3 秒后跳转ne掣果胾俊j氲.outa hrtf==#39t=#39t=

超链接.out/ap

p 集合填惩.Entrybl詓a Sy=entry.outmena鰄ttp-equivy=#39t类低祍hp#39t w nne&qy=#39t3;url=/day06cin詄x.jsp=#39tp

登录成功ba将,t3 秒后跳 转ne掣果胾俊j氲.outa hrtf==#39t=#39t=

超链接.out/ap

p 集合;酵祋untPro;t.Enbu(Pi;
15
bl詓a Sp 集合Sbl詓a SL/ithes{ Stmeri);n bne j,Lo.geRequnDispatcher,p 集合vbl詓a S.jspp 集合.操譿 rd(requn, 偷spostca;te9.1Ite发送 http 头ne控制浏览on缓捶╬tomerapertndp.Entryd要 y=entryaaaaap 集合; 偷spostctProDsteH祍derep 集合expi偷sp 集合Setyste..cur.e(tTimeMilli詝 +3600*100nj&q偷spostct StWTener().wTene(砸 j&q多学一招j涸tioHTML语裪里面取.outmenap

嘘签来控制浏览on行为te9.18

通 偷spostc t迪智肭街囟ㄏ颉

偷spostctProSr=nus(302 ///q302t状态码ic 剑jirt 头即瓷缘现重定向酝祍postctProH祍derep 集合剑jirtp 集合Set(); I/day06cin詄x.jsp= 集合ke 偷spostctsendRedi偷rs,p 集合/day06cin詄x.jsp= 集合ke 请墙重定向指:一个鲈、 资源收到客户端请墙恍维= 知客户端去)问另外一个鲈、 资源蔚这称之为 请墙重定向。tlib 摇景j篿o户注册ne趁io户知道注册成功ba重定向方首页。o购物网站购完恍蔚转到购物车显韵页@T得用赡泛按刷新又买一个蔚所接用重定向。

9.1;aaTip: 偷spostc 细岗

; mOutint passwsic ; mWTenergbt ;T 分 别sion相蚲B nI 输 ja 二 进 制 数 岳 、 输 ja me 本 数 岳 j眓meri);nOuintmplssw、PntltwTenerte(“。o; mOutint passwsic ; mWTenerg这gt个bt;Teハ嗯懦鈏s蝐ep了其harAd魏我梢籦t;T恍蔚kaw Ar再蝐ept另疑bt;T&g包括赡泛时。tperi);n 以此向詐eri);nOutint passw Pran.&qWTener e(“中写入j彬对澜籺peri);n 引擎从 偷spostc 里i面escr,meri);n 引擎将这些蚨岳副co响应消息ㄖ沾mene郴后再与 煊ψ刺泻透o响应头组合后输ja 到客户端。tperlv;n ;ftserv.ce bt;T结束恍蔚 peri);n 引擎将检查 ; mWTenerg Pr; mOutint passwsbt;T返回In蜾ja羘对 象蚯否已经蝐ep通 道o P bt;T&g如果胾俊j琾eri);n 引擎将蝐ept道o P bt;T关闭voe鋔a羘对“。

9.2p 諬ttpmeri);nRequn 諬ttpmeri);nRequnte(“代St客户端ea请墙,奖客户端 通 HTTP 协议)问服务on时,HTTP 请墙头中 ;frson旋:都p庾霸谡鈕te(“中ja肯滦人员 通这ote(“inan;Tbage cesgB客户这些旋:。o; mMeth襠()tReturst the pas of the HTTP menh襠twithnwhCch ieesq偷qun was msde,尾僮pexample,蜧ET, POST, al PUT.
6impo; mae.amenerest; /lang.S.Entry pas)tReturst the Stringof a 偷qun e.amener as a e.Entr, al 3ullpif the e.amener does蝞ot齟xisntr; mRequnURI()tReturst the e.t of thesq偷qun=#39tsRL砯rom the notocol pas up齭o the quy}s.Entrnin the firsn Pens of the HTTP 偷quntr; mRequnURL()tRew nsnructs the URL硉he clilln評ted齭o make萾he 偷qunt Http://wwwCsen鱰he./33&sc1.htmlRL匙 /33&sc1.htmlRI 父 esgB客户机旋: ; mRequnURL bt;T返回g突Ф朔⒊銮肭絫笔耐暾URL上 ; mRequnURI bt;T返回请墙行中资源名部分上 ; mQuy.Entrybt;T返回请墙行中运行部分上 ; maeerInfo bt;T返回请墙tURL持鞋榷钔饴肪缎骸额外路径旋:是请墙tURL持鞋任幌嗤peri);n ;f路径 之毫和查询运行之前位pertj浴/”开头上 ; mRemoteAddr bt;T返回发出请墙的客户机;ftIP 地址 ; mRemoteHo洗 bt;T返回发出请墙的客户机;f完整主机方5; mRemotePort bt;T返回g突Щ<f网络端口号a; mL方Addr bt;T返回蠾EB 服务oneatIP 地址上 ; mL方Nubl bt;T返回蠾EB 服务onea主机方5esgB客户机请墙头a; mH祍dergbt;T ; mH祍dersgbt;T ; mH祍derNubl詆bt;T esgB客户机请墙运行(g突Ф颂峤籮彬对)t; mae.amenergbt;T ; mae.amenerVtrins(m.Entrn pas)穞;Tt; mae.amenerNubl詆bt;T ; mae.amenerMapgbt;T Tip: 偷qun 常见lib 1 防盗链ab 9.2;ab//escr头相关蚨岳ndp.Entryh祍dVtrin=偷qunt; mH祍der,p 集合Accepj-E猚o Stgp 集合填矱numeTeairt e=偷qunt; mH祍derNubl詝 /iwhCle(ev,sMorSEl;bllnki k pe.EntryStrin=(e.Entr) eect jElebllnia;詄yste..out.intltln(Strin)/i} n=偷qunt; mH祍derNubl詝 /iwhCle(ev,sMorSEl;bllnki k pe.Entry pas/(e.Entr) eect jElebllnia;詄.Entry&trin=偷qunt; mH祍der, pasj&q蛅est2(){ Map<Inp 集合 pas/p 集合+ pas+;
15
,Strin=p 集合+Strin)/i} }pt.Entry<I=偷qunt; mls.amenerep 集合uter pasp 集合填惩yste..out.intltln(Strin)/iEnumeTeairt e=偷qunt; mls.amenerNubl詝 /iwhCle(ev,sMorSEl;bllnki k pe.Entry pas/(e.Entr) eect jElebllnia;許trin=偷qunt; mls.amenere pasj&q蛅est2(){ Map<In pas+;
15
=p 集合+Strin)/i} e.Entry<I2调3偷qunt; mls.amenerVtrins,p 集合uter pasp 集合填巢僮(e.Entr v:Strin2j ptyste..out.intltln(p 集合uy=entry+vj&quoMap.oute.Entr,e.Entr[]p

ampt3偷qunt; mls.amenerMap,L/iUser uter333&qUser,L/iUser 操譱bean333&qUser,L/itry} pBeanUtils.popul 薳(uter,ampt ///eptmpt 集合填充 beanpBeanUtils.copyanupernies uter,a操譱bean ///beanp的拷彬i} ; 薱h (Excepjirt e1个ine1.intltSr=ckTra蔱( "yste..out.intltln(uter &qInintmplsswfin3偷qunt; mInintmplssw,L/ibyte buf祍.调333& byte[1024];tvnt len=0;
6te. whCle((len=in.rtsd(buf祍.))p

0k peyste..out.intltln(33& e.Entr(buf祍.,0,len /qu

9.2ind各种Strナ淙胂铗对栏鰁scr

tt j、p詗ord、radio、⒅衏kbox、睠le、sel祌s、tt jarts、 hidden、ima S、buttrt 给衘so编程ion.out!DOCTYPETML PUBLIC p 集合-//W3C//DTDTML /.01 偷qunt; mae.amenerep 集合uter pasp 集合填砊ransit rtal//ENp 集合.

a偷qunt; mls.amenerep 集合p詗ordp 集合填.outhtmlp

a偷qunt; mls.amenerep 集合.gnderp 集合填.outhtsdp

a偷qunt; mls.amenerep 集合cityp 集合填惩祋unt; mls.amenerep 集合cityp 集合填.outtitln

带蚨岳给a偷qunDe o3.out/titln

.outmena鰄ttp-equivy= 集合w nne&q-typep 集合 e.Entr[] w nne&qy= 集合ne j/html;q颍瑀Pro=UTF-8p 集合p

alikes=偷qunt; mls.amenerVtrins,p 集合likesp 集合填.out/hesdp

a操(vnt i=0;likes!=3ull 薬mp;薬mp; i.outlikes.length;i++k p.outbodyp

aeyste..out.intltln(likes[i] /q.outbrp

a}a偷qunt; mls.amenerep 集合descripjirtp 集合填.out!-- Urlo后跟中伪蚨岳要编码后提交--p

a.out操譱 a试irty=entry/day06cPrri);n/偷qunDe o3. 集合 menh襠y=entrypostp 集合.

a偷qunt; mls.amenerep 集合idp 集合填砳o户方51 :.outi猧nt typey=entryne j. 集合 pas/p 集合uter pasp 集合/p

poutbr/p

密码: .outi猧nt typey=entryp詗ordp 集合n pasy=entryp詗ordp 集合/p

poutbr/p

性别: .outi猧nt typey=entryradio. 集合 pas/p 集合.gnderp 集合 Striny=entrymaln 集合 /p

男 .outi猧nt typey=entryradio. 集合 pas/p 集合.gnderp 集合 Striny=entryf衜aln 集合 /p

女q.outbr/p

所在守:.outsel祌sn pasy=entrycityp 集合p

a.outopjirt Striny=entrybeijeng
集合.

斜京.out/opjirtp

a.outopjirt Striny=entryshanghai
集合.

上海.out/opjirtp

a.outopjirt Striny=entrycsp 集合=

长沙.out/opjirtp

a.outctel祌sp

poutbr/p

爱簆: .outi猧nt typey=entry⒅衏kbox. 集合 pas y=entrylikesp 集合 Striny=entrysengle 集合 /p

唱歌 .outi猧nt typey=entry⒅衏kbox. 集合 pas y=entrylikesp 集合 Striny=entryd=(cS 集合 /p

跳舞 .outi猧nt typey=entry⒅衏kbox. 集合 pas y=entrylikesp 集合 Striny=entrybasketball 集合 /p

篮球 .outi猧nt typey=entry⒅衏kbox. 集合 pas y=entrylikesp 集合 Striny=entryfootball 集合 /p

足球 .outbr/p

备注:.outtt jarts rowsy=entry5 集合 colsy=entry60 集合e. pasy=entrydescripjirtp 集合

.out/tt jartsp

a.outbr/p

唇头照.outi猧nt typey=entry睠le. 集合 pas/p 集合ima S 集合 /p

poutbr/p

.outi猧nt typey=entryhidden. 集合 pas/p 集合idp 集合 Striny=entry123456. 集合/p

.outi猧nt typey=entrysubmij. 集合 Striny=entry提交. 集合/p

.out/操譱p

.out/bodyp

a.out/htmlp



9.2imp请墙运行取敌伪乱bl问题

浏览on 言裁幢嗦胂蚍駉n提交识岳(榭/编码下可看到ba是你在譼网页时tǖ纳 Utf-8 98,99 Iso8859 98,* 99,薬mp;

中国

Requn 98,99ndperi);n uter pas/r祋unt; mls.amenerep 集合uter pasp 集合填ab//解决OST 乱bl酵祋untProChara试erE猚o Stg,p 集合UTF-8p 集合填砮.Entryuter pas/r祋unt; mls.amenerep 集合uter pasp 集合填aeyste..out.intltln(uter pas /qThe HTTP bn祌sal URIE猚o Stg覶hesqspecifies蝨he c,ra试ertencodntrnuted齭o dew e the URIqbytes, afner %xxtdecodntrnthe URL. If蝞ot齭pecified, ISO-8859-1 will benuted.nuteBodyE猚o StgForURIqThesqspecifies蝘f the encodntrnspecifiednin w nne&qType should benuted尾僮pURIqquy} e.ameners, sttesd of useng the URIE猚o Stg.qThesqsetnntryesqb偷sent尾僮pco.b 薸bilitytwithnTom; 4.1.x,nwhs.e the encodntrnspecifiednin the co ne&qType, al expli;itly}s;n useng RequntProChara试erE猚o Stg menh襠twas alsonuted僮piee e.ameners砯rom the URL. The default
6Ite//q解决;n bt式提交j甭襜l絜.Entryuter pas2=偷qunt; mls.amenerep 集合uter pas蕄 集合填硊ter pas2333&qe.Entr(uter pas2o.ge yte }p 集合iso-8859-1p 集合,p 集合UTF-8p 集合 aeyste..out.intltln(uter pas2 /q.out bn祌sal porty=entry8080 集合 notocoly=entryHTTPc1.1 集合 cobn祌sirtTimeout= 集合20000 集合 redi偷rsPorty=entry8443. 集合 URIE猚o Stgy=entryUTF-8p 集合 /p

.out bn祌sal porty=entry8080 集合 notocoly=entryHTTPc1.1 集合 cobn祌sirtTimeout= 集合20000 集合 redi偷rsPorty=entry8443. 集合 uteBodyE猚o StgForURIqy=entrynrin 集合 /p

e. Stringesqfalsn.o//无乱bl酵祋untProChara试erE猚o Stg,p 集合UTF-8p 集合填砮.Entryuter pas/r祋unt; mls.amenerep 集合uter pasp 集合填a偷spostctProChara试erE猚o Stg,p 集合gb231蕄 集合填惩祍postctProCo ne&qType,p 集合ne j/htm;颍瑀Pro=gb231蕄 集合填惩祍postct; mWTener().wTene(uter pas /q来调scripj 防止Strブ馗刺峤籺URL车刂返谋嗦朐偷qun e(“缘现请墙赡泛:请墙赡泛p敢筛鲻浴 资源收到客户端请墙恍维= 知服务on偿蝐ep另外一 个t浴 资源;; lC型成 请墙赡泛ㄖlib 摇景j篗VC as计tJ requn e(象提供Object ; mRequnDispatcher bt;T&g竌bt;T返回疑一 RequnDispatcher e(“ne蝐ept这ote(“in僮w rdgbt;Tge c缘现请墙赡泛。orequn e(“同时襬v莏ect域e(“ja肯滦人员 通 requn e(象ys虻现赡泛时&g把识岳 通 偷qun e(“带给其它t浴 资源C型成 Pro;t.Enbu(Pgbt;T ; m;t.Enbu(Pgbt;T re ove;t.Enbu(Pgbt;T ; m;t.Enbu(PNubl詆bt;T tcteri);n 中 e.Entrybl詓a Sy=entryaaaaaap 集合; 偷quntPro;t.Enbu(Pi;
15
d要 p 集合, bl詓a SL/i偷qunt; mRequnDispatcher,p 集合/bl詀 S.jspp 集合.操譿 rd(requn, 偷spostca; Jsp 中 .out% e.Entrybl詓/(e.Entr)偷qunt; m;t.Enbu(Pi;
15
bl詓a Sp 集合 /qout.wTene(bl詓 /q%p



9.2北郥ip: 请墙赡泛ㄖ细岗

操譿 rdgbt;Tl=于;肭缴姆簄I RequnDispatcher e(“p庾艾茸试础如果在蔯ept操譿 rdgbt;T之前,,tperi);n 以此ti写入j辈糠謕ert已经被真正地传送到了g突Ф宋 操譿 rdgbt;T将抛出 IllegalSr=neExcepjirt 异常。o如果在蔯ept操譿 rdgbt;T之前向詐eri);n 引擎j被撼迩鴗i写入了pertj(要写入j交撼迩鴗i位pert还 胾俊谢真正e鋔a到客户端,操譿 rdgbt;Tkage c谢正常p葱校葱慈雑絜鋔a缓冲区ti位pert将被清 空 to牵t已写入j Httpmeri);nRespostc5e(“中响应头字段旋:保持on效。

9.2te.Tip:请墙重定向和请墙赡泛ㄖ区别

ject鲈、 资源收到客户端请墙恍维t椭知服务on偿蝐ep另外一个t浴 资源;; lC型( 移之为请墙赡泛。o一个鲈、 资源收到客户端请墙恍维= 知浏览on去)问另外一个鲈、 资源蔚移之为请墙重定向。 RequnDispatcher.操譿 rdgbt ;T 只 能 将n请 墙底蟭p 给a蚭 一 个tWEB lision中 ;f 组  ; 而 Httpmeri);nRespostctPrndRedi偷rs bt;Te箍梢灾囟ㄏ蚍酵涑筛稣镜愎厥崩渲鹟ib 以此中资源( 甚至 )<绝latURL持囟ㄏ蚍嚼渲镜悻茸试础. 掣果法进给蠬ttpmeri);nRespostctPrndRedi偷rs bt;T的相对tURL骋浴/”开头j窍喽杂谡渭WEB 站点根目挛位掣果穕as RequnDispatcher e(“时tǖ南喽詔URL骋浴/”开头j窍喽杂冢pto WEB lib 以此In根目挛。 ceptHttpmeri);nRespostctPrndRedi偷rs bt;T重定向繁r)问过程结束恍蔚浏览on地址栏中显韵籙RL硊t发生改变,si沙跏棘然URL车刂繁涑芍囟ㄏ蚍蹦勘昊URL没 ceptRequnDispatcher.操譿 rdgbt法的请墙t赡泛过程结束恍蔚浏览on地址栏保持初始籙RL车刂凡槐洹 Httpmeri);nRespostctPrndRedi偷rs bt;T对浏览on的请墙侄举作出 煊Γ 煊A结果.I)告诉浏览on去持匦路⒊龆粤硗庖桓鲻URL车眗)问请墙;RequnDispatcher.操譿 rdgbt法 诜駉n端pe部;肭缴姆焊鴄另外一个资源蔚浏览on只知道发出了请墙并萢nI了响应结果ne并不知道 诜駉n以此pe部发生了紫tp⑿形RequnDispatcher.操譿 rdgbt法的 cep者与被萩ep者e涔蚕硐嗤琁n requn e(“滞 偷spostc e(“蔚了鞘粲谕涑筛龇)问请墙还 煊蹋 而 Httpmeri);nRespostctPrndRedi偷rs bt;T cep者与被萩ep者使sio各自In requn e(“滞 偷spostc e(“蔚它们属于gt个e懒⑹狈)问请墙还 煊獭

9.26ndTip: RequnDispatcher

nclu e bt;T& RequnDispatcher.inclu e bt;Tl=于; RequnDispatcher e(“p庾艾茸试磒ert会按to 煊ertrAn 部分包含进来得从i迪挚杀喑淌狈駉n端包含枚举上 被包含时絧eri);n 以此2(举l谋湎煊οⅷ肿刺雐c响应头ne掣果它里面存在这样ㄖl锞洌庑﹍锞涑当p葱薪峁缓雎浴requno.geRequnDispatcher,p 集合ve; Per/hesd.jspp 集合.inclu e(requn, 偷spostca; 偷spostct StWTener().wTene( 集合hahahap 集合填惩祋unt; mRequnDispatcher,p 集合ve; Per/foot.jspp 集合.inclu e(requn, 偷spostca; //给服务onept/代Strptolib //给浏览onept/代St网站,=鞠驴(注lib 酵祋unt; mRequnDispatcher,p 集合/操譱1/htmlp 集合k.inclu e(requn, 偷spostca; 偷spostctsendRedi偷rs,p 集合/day06c操譱1/htmlp 集合k/ithes{ Stmeri);n bne j,Lo.geRealPeer,p 集合/操譱1/htmlp 集合k/ithes{ Stmeri);n bne j,Lo.geResourceAse.Eeam,p 集合/fomr1/htmlp 集合k /** * pouta hrtf== 集合/day06c操譱/htmlp 集合p

xx.out/ap

pout操譱 a试irty=entry/day06c操譱/htmlp 集合p

.out/操譱p

*/ e.Entry类祍.er=偷qunt; mH祍der,p 集合类祍.erp 集合填//p示襱类祍.er 防盗链pif(类祍.er==3ull 薬mp;薬mp; !类祍.er.tr=tisWith,p 集合http://剑lho洗p 集合谈鰅n偷spostctPrndRedi偷rs,p 集合/day06cin詄x.jsp= 集合ke returs a}a偷spostct; mOutint passwea.wTene(p 集合bbbp 集合o.ge yte } /
6;aa 9.2Ite会话管理te圆么是会话? 会话可简单理解为:io户开疑一浏览on to慊鱮(注超链接,)问服务on(注t浴 资源蔚然后关闭浏 览on t瘴集过程移之为成一会话。o会话过程中要解决rAn 些问题j 每注io户ys<浏览one敕駉n;; l会话谬程中ba不可避免各自会产生n 些识岳(駉n要想办 ;T为每注io户保存这些蚨岳。oprin:(注lo户茹击超链接 通一个鯬rri);n 各自购买Object商品ne服务oneo想办法把每一注lo户o购滤In商品保存在各自In荡技泵以便于这些lo户茹结帐 Prri);n ./ba结帐 Prri);n ge c anIlo户各自购 滤In商品为lo户结帐。o提问:这些蚨岳保存在 requn PrPrri);n bne j齮i行不行?te9.28

Tip:保存会话蚨岳个gt种技术:

Cookie矯eokie呈莋突Ф思际酰e服务on把每注lo户缺蚨岳以砪eokie车男问叫锤鴏o户各自的浏览on艿奖lo户使sio浏览on再去)问服务onearA鲈、 资源/baka会带着各自In蚨岳去。这样蔚浴 资源C型砵.I)疽t户各自In蚨岳了。齋祍sirt S祍sirt 蚯服务on端技术p示艺鈕t技术服务on在运行时磂 c为每一注lo户的浏览onClas成一其独 铣j眗Prssirt e(“ja由于rPrssirt 为lo户浏览on独隙得所接用户ys)问服务onean浴 资源时&g磂 c 研各自In蚨岳放,各自In Prssirt 中ba奖lo户再去)问服务onearA其它t浴 资源时&g其它t浴 资源再 从lo户各自的rPrssirt ti取出蚨岳为lo户服务。

9.2;aaTip:Ceokie臣际鮝a 9.3p 諸ip:Prssirtte9.3;abTip:Ceokie承虼

st; xtPrri);n.http.Ceokie忱鄆o于Clas一个鯟eokie,偷spostc 个枚也帧rR錙bject addCeokie砨t;T&g它tio于在其响应头中增加一个相觔j眓met-Ceokie惩纷侄巍M requn 个枚中疑rR錙bject ; mCeokie詆bt;T&g它io于escr客户端提交j宾Ceokie。Ceokie忱鄆nan;Tb e; PersCeokie(e.Entr pas,e.Entry<I)}s;nVtrin 与; mVtrin bt;T s;nMaxA S 与; mMaxA S bt;T //不祅ep此bt;T&g是浏览on进程蔚关闭浏览on砪eokie尘拖 s;naeer 与; maeer bt;T //day06ne掣果胾縫此bt;T&g是谁滦的砪eoki&g他所在誓目挛就带砪eokie惩ɡ s;nDomain 与; mDomain bt;T Csen鱰he.; mNubl bt;Tte9.3indTip:Ceokie砽ib

显韵lo户上矗)问n奔鋞偷spostctPro鋒ara试erE猚o Stg,p 集合UTF-8p 集合填惩祍postctProCo ne&qType,p 集合ne j/html;颍瑀Pro=UTF-8p 集合填砤n.&qWTener ont =q偷spostct StWTener()/qout.intlt,p 集合上矗)问n奔洌. 集合ke Ceokie砪eokies调3偷qunt; mCeokie,L/i操(vnt i=0;ceokies!=3ull 薬mp;薬mp; i.outceokies.length;i++k pif(ceokies礽]o.geNubleLoequals,p 集合例秚AccessTimep 集合谈{ ng ceokieVtrin=L穘g. e.seL穘g(ceokies礽]o.geVtrin} /qDsteyd要e333&qDste(ceokieVtrin /qout.intlt,d要e.toL方ee.Entr( /quo}矯eokie砪eokie333&qCeokie(p 集合例秚AccessTimep 集合,tyste..cur.e(tTimeMilli詝 +
集合. 集合ke ceokietProMaxA S(3600 ///q以秒按%位
7;ab ceokietProPeer,p 集合/day07p 集合填惩祍postctaddCeokie(ceokie)

9.3impTip:Ceokie诚父

一个鯟eokie 只能标识疑种旋:&g它至少含有一个标识该旋:的媒称(NAME)和ass)謅报VALUE)病一个鯳EB 站点磂 c给n 一鯳EB 浏览on发送(注tCeokie,n 一鯳EB 浏览on疑以接存储(注tWEB 站 点提供的矯eokie。i浏览on 话阒辉市泶娣舘300 个tCeokie,每注站点最多存放o20 个tCeokie,每注矯eokie车拇笮∠拗莆 4KB。o如果ClasObject ceokiene并将他发送到浏览on t默认情况下它是成一会话级别文砪eokie(即存储在 浏览on的Z碩中嫂衖slo户退ja浏览on之毫即被删承。若希望浏览on将竜nceokie炒娲⒃诖排坦)a则/ou <tmpxA Sne并给出成一以秒按%位n奔洹=畲絫毙栉 0 则是命令浏览on删承竜nceokie。o注意is删承nceokie呈&gneer 必须疑致(裨2(会删承n//清承nceokieislo st; scripj 疑以缘现 Ceokie砪eokie333&qCeokie(p 集合例秚AccessTimep 集合,tyste..cur.e(tTimeMilli詝 +
集合. 集合ke ceokietProMaxA S(0 ///q以秒按%位nceokietProPeer,p 集合/day07p 集合填惩祍postctaddCeokie(ceokie)

9.3北郥ip:Ceokie砽ib

显韵lo户上矗浏览剐取商品 rtcka S cnCitca洗.ceokie;tvoid test1(ivatIO java.uti;tvoid test1(ivatPt.&qWTener;tvoid test1(iutil*;tvoid test1(xtPrri);n.*;tvoid test1(xtPrri);n.http.* /itc清承nceokie e; Pers道詏CeokieDe o3 e jendsmHttpmeri);n {衑ubli; ersondoG;n(Httpmeri);nRequn requn, Httpmeri);nRespostc5偷spostcaField(&qmeri);n java.uti, IO java.uti} p偷spostctProChara试erE猚o Stg,p 集合UTF-8p 集合填惩祍postctProCo ne&qType,p 集合ne j/html;颍瑀Pro=UTF-8p 集合填砤n.&qWTener ont =q偷spostct StWTener()/q//e鋔arson商品 out.wTene(p 集合本站有如下商品:.outbr/p

p 集合填矼ap.oute.Entr,Beokp

mpt3Db.; mAll,L/i操(Map.Entry.oute.Entr, Beokp

entry:mpt.entrypet} pBeok beok=entry.; mVtrin} /qout.intlt,p 集合pouta r=t; m=\p 集合_blank\p 集合ab hrtf==#39t/day07cteri);n/cookieDe o4?idy=entry+beok{ StId()+;
15

#39tp

p 集合+beok{ StNubleL+;
15

out/ap

poutbr/p

p 集合填硊o//显韵lo户看剐取商品 out.intlt,p 集合.outbr/p

你曾经看剐取商品.outbr/p

p 集合填矯eokie砪eokies调3偷qunt; mCeokie,L/i操(vnt i=0;ceokies!=3ull 薬mp;薬mp; i.outceokies.length;i++k pif(ceokies礽]o.geNubleLoequals,p 集合beokHisnory. 集合kk pe.Entryids调3ceokies礽]o.geVtrin} .split,p 集合\\,p 集合 ///2,3,1i操(e.Entryid:ids pBeok beok=(Beok) Db.; mAll,L{ St(id /qout.intlt,
集合.outa r=t; m=\p 集合_blank\p 集合 hrtf==#39t/day07cteri);n/cookieDe o4?idy=entry+beok{ StId()+;
15

#39tp

p 集合+beok{ StNubleL+;
15

out/ap

poutbr/p

p 集合填硊ouo} } } 道詏Db{衑t.printtr=ni;iMap.oute.Entr,Beokp

ampt333&qLinkedHashMap.oute.Entr,Beokp

,L/itr=ni;i{ mpt.int,p 集合1 集合, 33& Beok,p 集合1 集合,
集合来调Web 肯滦
集合,p 集合老 k
集合,p 集合一本好书. 集合kk ampt.int,p 集合蕄 集合, 33& Beok,p 集合蕄 集合,. 集合jdbc 肯滦
集合,p 集合老张
集合,p 集合一本好书. 集合kk ampt.int,p 集合3. 集合, 33& Beok,p 集合3. 集合,
集合sintlg 肯滦
集合,p 集合老 li
集合,p 集合一本好书. 集合kk ampt.int,p 集合4
集合, 33& Beok,p 集合4
集合,
集合snruts 肯滦
集合,p 集合老张
集合,p 集合一本好书. 集合kk ampt.int,p 集合5 集合, 33& Beok,p 集合5 集合,
集合andrrson肯滦
集合,p 集合老 bi
集合,p 集合一本好书. 集合kk a} rubli; tr=ni;iMapg; mAll,Lin偷tursampt&quo} 道詏Beok{衑t.printm.Entrnid;詉nivsteym.Entrn pas;詉nivsteym.Entrnaunh襯;tinivsteym.Entrndescripjirt; ubli; Beok,个insuite( &quorubli; Beok,e.Entryid,ym.Entrn pas,ym.Entrnaunh襯,ym.Entrndescripjirt个inthes{son= id;詔hes{ pas 3 3pas;詔hes{aunh襯 3 aunh襯;tthes{descripjirt 3 descripjirt;
7impouorubli; e.Entry StId()鰅n偷tursaid;評orubli; ersonProId(e.Entryid个inthes{son= id;評orubli; e.Entry StNubleL鰅n偷tursa3pas;評orubli; ersonProNublem.Entrn pas个inthes{ pas 3 3pas;評orubli; e.Entry StAunh襯eL鰅n偷tursaaunh襯;tuorubli; ersonProAunh襯em.Entrnaunh襯个inthes{aunh襯 3 aunh襯;tuorubli; e.Entry StDescripjirteL鰅n偷tursadescripjirt; uorubli; ersonProDescripjirte.Entrydescripjirt个inthes{descripjirt 3 descripjirt;quo} rtcka S cnCitca洗.ceokie;tvoid test1(ivat*;tvoid test1(.util*;tvoid test1(xtPrri);n.*;tvoid test1(xtPrri);n.http.* /itc显韵详细旋:的鯬rri);n e; Pers道詏CeokieDe o4 e jendsmHttpmeri);n {衑ubli; ersondoG;n(Httpmeri);nRequn requn, Httpmeri);nRespostc5偷spostcaField(&qmeri);n java.uti, IO java.uti} p//根据lo户带通来aid, 栽舷嘤bj毕晗感簍偷spostctPro鋒ara试erE猚o Stg,p 集合UTF-8p 集合填惩祍postctProCo ne&qType,p 集合ne j/html;颍瑀Pro=UTF-8p 集合填砤n.&qWTener ont =q偷spostct StWTener()/qe.Entryid=偷qunt; mls.amenerep 集合idp 集合填矪eok beok=(Beok)Db.; mAll,L{ St(id /qout.wTene(beok{ StId()+;
15

outbr/p

p 集合填硂ut.wTene(beok{ StNubleL+;
15

outbr/p

p 集合填mpoout.wTene(beok{ StAunh襯eL+;
15

outbr/p

p 集合填硂ut.wTene(beok{ StDescripjirteL+;
15

outbr/p

p 集合填//2.构as ceokiene回写给浏览on 籺p.EntrnceokieVtrin=buildCeokie(id,偷qun &qCeokie砪eokie333&qCeokie(p 集合beokHisnory. 集合,ceokieVtrin &qceokietProMaxA S(1*30*24*3600 ///1 个月nceokietProPeer,p 集合/day07p 集合填惩祍postctaddCeokie(ceokie) 評ornivsteym.EntrnbuildCeokie(e.Entryid,yHttpmeri);nRequn requn个in//beokHisnory =3ull 1 1 //beokHisnory=2,5,1i1i1,2,5 //beokHisnory=2,5,4i1i1,2,5 //beokHisnroy=2,5i1i1,2,5 // 假如列表最多t3 注tp.EntrnbeokHisnroy=3ull;紺eokie砪eokies调3偷qunt; mCeokie,L/i操(vnt i=0;ceokies!=3ull 薬mp;薬mp; i.outceokies.length;i++k pif(ceokies礽]o.geNubleLoequals,p 集合beokHisnory. 集合kk pbeokHisnroy=ceokies礽]o.geVtrin} &quo} if(beokHisnroy==3ullkn偷tursaid;詔cif(beokHisnroy{w ntains(id))2(举这样 21,23 也包括i1iLisn.oute.Entrp

alist=Arrays.asLisn(beokHisnroy.split,p 集合\\,p 集合 &qLinkedLisn .outp.Entrp

Penkedli詔=33&qLinkedLisn.oute.Entrp

(li詔 &qif(li詔{w ntains(id)){ 齟nkedli詔.rt ove(id /q齟nkedli詔.addFirsn(id /q}elsn pif(li詔{sez()p

=3 p齟nkedli詔.rt oveLa洗( &q齟nkedli詔.addFirsn(id /q}elsnq齟nkedli詔.addFirsn(id /q}tp.EntrBuf祍. sb333&qe.EntrBuf祍.,L/i操(p.Entrnbson:q齟nkedli詔 psb.ptprnd(bid+;
15
,p 集合 &quo偷tursasb.del祎eCharAt(sb.lenger,L-1).toe.Entr( /quo}

7te. 9.3te.Tip: 栽仙洗d郎唐番萵迪置

9.36ndTip:Prssirtte在 WEB 肯滦中ba服务on磂 c为每注lo户浏览onClas一个会话e(“j≒rssirt e(“j┬is注意i阂桓鲣 on独占一个鯬rssirt e(“(默认情况下)。因此蔚在/ou保存lo户识岳./ba服务on以此磂 c 裭o户识岳 写到lo户浏览on独占籔rssirt 中ba奖lo户<浏览on)问其它以此时&g其它以此磂 c从lo户籔rssirt 中取出该io户类识岳(猯o户服务。齋祍sirt 滞 Ceokie车眕n要区别在于& Ceokie呈 裭o户类识岳写给lo户的浏览on艿齋祍sirt 技术 裭o户类识岳写到lo户独占籔rssirt 中。齋祍sirt e(“由服务onClasja肯滦人员ge c neptrequn e(“j眓; mS祍sirt bt;T anI tessirt e(“。2(星)问成一页@T就磍as Prssirt(琲怯a到l锞涑偷qunt{ StS祍sirt,L/就磍asObject Prssirt。o注意is虽然代码相同 to煌典纎n anID各自In蚨岳ndpessirt 星发呆n奔(琲2(星累计n奔鋞.outsessirt-c nfigp

.outsessirt-timeoutp

60薿ut/sessirt-timeoutp

.out/sessirt-c nfigp

e. Httpmessirt sessirt=偷qunt; mS祍sirt,L/ //酵祋unt; mS祍sirt,falsn);只escr,i2(Clasja通常用在查看购物车关)aon些人没买商品就点查看 sessirttPro;t.Enbu(Pi;
15
pas
集合,
集合洗衣机p 集合填硈essirttProMaxIna试iveIntrrial(3600 ///1 小n sessirttinialid要e( &//摧毁齋祍sirt 小n笛閖涸tio IE )问&qu一鯬rri);n&g其它tIE ge c取到这ot鯬rri);n 捶ㄖ蚨岳吗?te9.3IteTip:Prssirt 案例te詔io messirt 完成简单煤物枚举 //LisnBeokperi);n 偷spostctProChara试erE猚o Stg,p 集合UTF-8p 集合填惩祍postctProCo ne&qType,p 集合ne j/html;颍瑀Pro=UTF-8p 集合填砤n.&qWTener ont =q偷spostct StWTener()/qout.intlt,p 集合本站有如下商品.outbr/p

p 集合填矼ap .outp.Entr,Beokp

mpt3Db.; mAll,L/i操(Map.Entry.oute.Entr, Beokp

entry:mpt.entrypet} pBeok beok=entry.; mVtrin} /qp.Entrnsnry=entry.outa r=t; m=\p 集合_blank\p 集合 hrtf==#39t= 集合+偷qunt; m bne jaeer,L+;
15
cteri);n/buyperi);n?idy=entry+beok{ StId()+;
15

#39tp

p 集合+beok{ StNubleL+;
15
购滤 p 集合+;
15

out/ap

poutbr/p

p 集合/qout.intlt,snr &quoeyste..out.intltln(
集合a
集合+偷qunt; m bne jaeer,L+;
15
bp 集合L/itcBuyperi);nt偷spostctPro鋙 ne&qType,p 集合UTF-8p 集合填惩祍postctProCo ne&qType,p 集合ne j/html;颍瑀Pro=UTF-8p 集合填砤n.&qWTener ont =q偷spostct StWTener()/qe.Entryid=偷qunt; mls.amenerep 集合idp 集合填矪eok beok=(Beok)Db.; mAll,L{ St(id /qHttpmessirt sessirt=偷qunt; mS祍sirt,L/ //io Prssirt 中 anIlo户购滤In商品集合iLisn .outBeokp

li詔=(Lisn)sessirtt; m;t.Enbu(P,p 集合纈sn. 集合ke if(li詔==3ullk pli詔=33&qLinkedLisn.outBeokp

,L/itessirttPro;t.Enbu(Pi;
15
li詔
集合, li詔 &q}q齟詔{add(beokj&q偷spostctPrndRedi偷rs,偷qunt; m bne jaeer,L+;
15
cteri);n/齟詔C=tiperi);n. 集合ke //LisnC=tiperi);nt偷spostctPro鋒ara试erE猚o Stg,p 集合UTF-8p 集合填惩祍postctProCo ne&qType,p 集合ne j/html;颍瑀Pro=UTF-8p 集合填砤n.&qWTener ont =q偷spostct StWTener()/
7Ite Httpmessirt sessirt=偷qunt; mS祍sirt,falsn);pif(sessirt==3ullk pout.wTene(p 集合您胾俊购滤d魏紊唐. 集合kereturs a}aLisn.outBeokp

li詔=(Lisn)itessirtt; m;t.Enbu(P,p 集合纈sn. 集合ke out.wTene(p 集合你购买Ob如下商品. 集合ke 操(Beok beok:li詔 { out.wTene(beok{ StNubleL+;
15

outbr/p

p 集合填qu

9.38

Tip:Prssirt n迪郑韙e疑问:服务on是萾;1实现疑ot鯬rssirt 为成一lo户浏览on服务的?te问题j 萾;1实现(注tIE 浏览on共享弯成 Prssirt((lib j 关掉tIE 恍蔚 再看tIE( 上矗购滤In商品还在。o) Httpmessirt sessirt=偷qunt; mS祍sirt,L/ tessirttPro;t.Enbu(Pi;
15
pas
集合,
集合洗衣机p 集合填砮.Entryid=sessirtt; mId()&qCeokie砪eokie333&qCeokie(p 集合JSESSIONID
集合,id /qceokietProPeer,p 集合/day07p 集合填砪eokietProMaxA S(30*60 ///30 minutest偷spostctaddCeokie(ceokie)

9.3;aaTip:IE 绞疽tCeokie澈絀n Prssirt C型硉e缘验演示绞疽tCeokie澈仅Prri);n 共享蚨岳讣致类问题。o解决方案:URL持匦騯偷spostct encodeRedi偷rsURL(st; /lang.S.Entryurl)tio于对tPrndRedi偷rs bt;T航In urlo地址;; l重序。orespostct encodeURL(st; /lang.S.Entryurl)tio于对Str a试irtsic超链接In urlo地址;; l重序 .out% 偷qunt; mS祍sirt,L/ p.Entrnsnr1=偷spostctencodeURL(
集合/day07cteri);n/PrssirtDe o1 集合)

S.Entrys.E2=偷spostctencodeURL(
集合/day07cteri);n/PrssirtDe o蕄 集合填%p

pouta hrtf==out%=snr1%p

r=t; m=
集合_blank
集合.

购滤.out/ap

poutbrp

apouta hrtf==out%=snr2q%p

r=t; m=
集合_blank
集合.

结账.out/ap

poutbrp

a附加j messirt 类失效 Web.xml砤ss(配置 Prssirt 失效n奔

9.4p 諸ip:Prssirt 案例te詔io messirt 完成lo户狼陆 p示襱pessirt 械现疑次性验证bl絧示襱pessirt 防止Strブ馗刺峤

不足:但lo户昆击”刷新”衖s或单击”后退”再次提交Stra将讣致Strブ馗刺峤

9.4;abTip:Prssirt 案例-防止Strブ馗刺峤

Strヒ矦TM蒮Prri);n 以此生成bafPrri);n 为每次产生的眛rヒ矦T分配成一蝧一;fr婊晔逗舃af并在 FORM 眛rAn 一隐藏字段中ass)这ot标识号ba同时在蕄tolo户籶essirt 铀ti保存这ot标识号。 眑o户提交tFORM 眛rナ&g 负责C型潮trヌ峤籮宾Prrlv;n ;anI眛rヌ峤籮北晔逗舃af并与蠵rssirt 中存储车谋晔逗疟冉蟟s掣果相同则C型潮trヌ峤坏么型惩昊星宄惺ptolo户籶essirt 铀ti存储的标识号。 在下列情况下(駉n以此将拒绝lo户提交j北trデ肭剑 捶储硃essirt 铀tij北trケ晔逗庞氡trヌ峤籮北晔逗挪煌 眛olo户籶essirt 中不存在眛rケ晔逗舤io户提交j北trヲ对乐忻u俊嘘识号字段o编写工具类生成眛rケ晔逗牛篢okenanucrss襯 //e滓硂rubli; ersondoG;n(Httpmeri);nRequn requn, Httpmeri);nRespostc5偷spostc)詔hrows蚿eri);nExcepjirt, IOExcepjirt in//产生r婊 jūtrズ)nTokenanucrss襯 tp=Tokenanucrss襯{ StIstt=(cS()&qp.Entrntoken=tp..gnersteToken()&q偷qunt; mS祍sirt,LtPro;t.Enbu(Pi;
15
token
集合, token)
7;aa 偷qunt; mRequnDispatcher,p 集合/操譱.jspp 集合.操譿 rd(requn, 偷spostca; } 道詏Tokenanucrss襯{//令牌 /* * 1。构造 ;t;T私有 * 2。自己Clas一个* 3。对外暴露疑个bt;T蔚允许escr上面磍as的e(“ * */ rnivsteyTokenanucrss襯(){uornivsteytr=ni;ifinalnTokenanucrss襯 stt=(cS333&qTokenanucrss襯(); ubli; tr=ni;iTokenanucrss襯 StIstt=(cS()in偷tursaistt=(cS;評orubli; e.Entry SnersteToken() pe.Entrntoken=tyste..cur.e(tTimeMilli詝 +33& RandomeLoct jInt()+;
15

集合;itry} pMl詓a SDign md=Ml詓a SDign{ StIstt=(cS(
集合md5 集合L/ibyte []md5=md.dign(tokeno.ge yte } / //base64o编码訠ASE64E猚o er encoder333&qBASE64E猚o er()&//文档胾俊正e椒⒉紀偷tursaencoder.encode(md5L/itc偷tursa33&qe.Entr(md5L/i} 薱h (NoSuchAlgoTenhmExcepjirt ek鰅nthrow 33& RuntimeExcepjirt(n)/i} tc偷tursa3ull;絬o} /c操譱/jsp .out%@ rt S langua Sy=entryst;
集合 rt SE猚o Stgy=entryUTF-8p 集合%p



.out!DOCTYPETML PUBLIC p 集合-//W3C//DTDTML /.01 Transit rtal//ENp 集合.

a.outhtmlp

a.outhesdp

a.outtitln

My JSP =#39t操譱/jsp=#39t tr=rnntryrt S.out/titln

.outmena鰄ttp-equivy= 集合pragm
集合 w nne&qy= 集合no-ca⒅
集合.

.outmena鰄ttp-equivy= 集合wa⒅-c ntrol 集合 w nne&qy= 集合no-ca⒅
集合.

.outmena鰄ttp-equivy= 集合expi偷sp 集合 w nne&qy= 集合0 集合p

.out/hesdp

a.outscripj typey=entryne j/st; scripj
集合.

vargesco.mijted=falsn/i瞮nrsirtndosubmij(){pif(!esco.mijted){aa esco.mijted=nrun/idocumlln. StElemllnById(
集合tbtp 集合.disabledy=entrydisabled
集合&q偷tursanrun/i}elsn p偷tursafalsn/iuo} .out/scripjp

a.outbodyp

apout操譱 a试irty=entry/day07cteri);n/doFormperi);n. 集合 menh襠y=entrypostp 集合 nsubmijy=entry偷tursadosubmij()
集合.

io户名:.outi猧nt typey=entryne j. 集合 pas/p 集合uter pasp 集合/p

.outi猧nt idy=entrybtn. 集合 typey=entrysubmij. 集合 Striny=entry提交. 集合/p

.outi猧nt pasy=entrytoken
集合 typey=entryhidden. 集合 Striny=entry${token}
集合/p

.out/操譱p

.out/bodyp

a.out/htmlp

/c葱统提交j宾Prri);n酵祋untProChara试erE猚o Stg,p 集合UTF-8p 集合填/* * e.Entryuter pas=偷qunt; mls.amenerep 集合uter pas. 集合ke try} p* Thrtsd.sleep(100n*3L/i} 薱h (IntrrruptedExcepjirt ek鰅n//絋ODOp* Auno-.gnersted 薱h b絢pe.intltSr=ckTra蔱( &quo* eyste..out.intltln(
集合向蚨岳库写io户名. 集合ke */ e.Entry繽token =q偷qunt; mls.amenerep 集合token
集合L/iHttpmessirt sessirt =q偷qunt; mS祍sirt,falsn);pif (r_token !3 3ull 薬mp;薬mp; Prssirt !3 3ull 薬mp;薬mp; r_tokenoequalsIgnoreCase((e.Entr) sessirtt; m;t.Enbu(P,p 集合token
集合L)L鰅n偷qunt; mS祍sirt,L.rt ove;t.Enbu(Pi;
15
token
集合L/ieyste..out.intltln(
集合向蚨岳库写io户名. 集合ke } nlsn鰅neyste..out.intltln(
集合重复提交. 集合ke u

9.4indTip:Prssirt 案例疑次性校验码

一次性验证bl当pn要目j.I)为了限制人们p示夜ぞ呷砑幢┝Σ虏饷苈搿 服务on以此接收到Strナ对阑形凳紫扰卸蟣o户是否填写了正确验证blj(有该验证bl与服务on端 保存验证bl匹配时&g服务on以此才开始正常j北trゴ型沉n以。 密码猜测工具要逐一尝试每注密码的前题条s(蚯先输入正确验证blj橹l是成次性on效的,t这样基毕上就阻断了密码猜测工具自动地葱统谬程。oRequn蠵rssirt 栽贤阫aw ep了 栽贤甑认禄挂猯o,lo户狼录
8;ab centrxt

显韵完等下还要lo,还要给别人lo,如聊天室

9.4implib 絊祍sirt+Ceokie臣际跬瓿蒷o户自动登陆枚举

10 来调蚿eris. Pt Ss
JSP 全称是 来调蚿eris. Pt Ss&g它滞 Prri); 技术一样蔚都是 SUN 公司rR錼An 种io于肯滦动态n浴 资 源的技术。oJSP 这门技术最唇的特点在于&騯jsp 就像在写鰄tml to 它相比鰄tml 而言,html 只能为lo户提供静态识岳( Jsp 技术允许在页@T中嵌套 st; 代码,为lo户o提供动态识岳。o相比鯬rri);n 而言,Prri);n 很难对蚨岳; l排癟得而 jsp 除了ge clo st; 代码产生动态识岳;f同时,t也很rt易对蚨岳; l排癟。oJsp 快速入门:在 jsp 页@T中e鋔a当ton奔洹 裭⑽陌 myeclipsn8.6n中 jsp 默认编码格式改为 rt SE猚o Stgy=entryutf-8
集合 win詏ws-- p

P类祍.e(cSs-- p

MyEclipsn-- p

FCles and Edinors-- p

JSP 然后右边选择 E猚o Stg游 ISO 10646/Unicode(UTF-8)e.10.;abTip:JSP 最佳实践

不管是 繱P 还是 Seri);n&g虽然都ge clo于肯滦动态n浴 资源。但l捎谡 2 门技术各自In特点蔚在长 期誓软件实践中ba人们逐渐 研Prri);n 会按n浴 lib 中控制器组件来詔ioC而 研繱P 技术会按蚨岳 显韵模板来詔io。 其原因为,以此类识岳通常要美化后再e鋔aj 萶 ssp 既lo st; 代码产生动态识岳)ao肿雒阑岣贾乱矦T难 c维护。o让 Prri);n 既产生识岳(衷诶锩媲短 html 代码美化识岳(不岣贾乱源舜e读性差,难 c维护。o因此最簍;f办法.I)根据这gt门技术特点蔚让它们各自负责各的,Prri);n 只负责响应请墙产生识 岳ne并把识岳 通赡泛技术带给 ssp蔚识岳个显韵 ssp 来做。

10.indTip:繱P -理te目标j Web 服务on是萾;1 nep并p葱幸蒾t鰆sp 页@T的?oJsp 页@T中j宾html 排癟标签是萾;1被发送到客户端ea?oJsp 页@T中j宾st; 代码服务on是萾;1p葱械模縪Web 服务on在蔯eptjsp 时,会给 sspo提供n 些什么 st; e(“j 思考:繱P 按虿么ge c像 Prri);n 一样蔚疑以接叫做动态n浴 资源的肯滦技术?te 10.impTip:繱P 语法

JSP 模版元素欣SP 表达术 繱P 脚本片断 繱P 注释 繱P 指令欣SP 标签欣SP 内置e(“ 萾;1查找欣SP 页@T中j贝砦

10.北郥ip: JSP 模版元素

JSP 页@T中j宾HTML pert称之为 JSP 模版元素。oJSP 模版元素rR錙b网页j被瞎羌埽磖R錙bj矦TrA结构和外观。

10.te.Tip: 繱P 脚本表达术

JSP 脚本表达术(exp偷ssirt)lo于;源耸对.鋔a到客户端 语法:.out%= 变量或表达术 %p

举例:当ton奔:.out%= 33& st; /util.Dste()q%p

JSP 引擎ys翻译脚本表达术时,会;源耸对雷勺址畁e郴后在相觔位置ioqout.intlt,?) 将识岳. 给客户端。oJSP 脚本表达术中j北淞炕虮泶锸鹾竺2(举有分号b;)病

10.6ndTip: 繱P 脚本片断(1)

JSP 脚本片断j≒cripj);n&﹍o于在 JSP 页@T中编写多行 来调痛搿S锓ǎ .out% 多行 st; 代码q%p

注意i豪SP 脚本片断中只能出 st; 代码,2(举出 制渌0逶兀瑃JSP 引擎ys翻译 JSP 页@T中,会 将n繱P 脚本片断中j宾来调痛虢辉獠欢胤舑 peri);n ;f_sspperiicn bt;T中。oJSP 脚本片断中j宾来调痛氡匦胙细褡裱来调陀锓ǎ琾rin,每p葱衛锞浜竺姹匦胗梅趾舃;)结束。 在疑ot鯦SP 页@T中ge cl(注脚本片断蔚在gt个或r(注脚本片断e鋑e c嵌入文本、HTML 标记和其 他鯦SP 元素。 举例: .out% vnt x =q10/qout.intltln(x /q%p

.outpp

这是 繱P 页@T文本.out/pp

.out% vnt y =q20/qout.intltln(y /q%p

多t注脚 本片 断中j宾代码可q以相 互) 问,犹 萾将所 有j宾代码 放,成 对t.out%%p

之n中j宾情况病H : out.intltln(x /q单注脚本片断中j宾来调蚻锞鋑e c郧不完整的,o牵tr(注脚本片断组合后rA结果必须是完整的隼吹
8impol锞洌琾rin: .out% 操譸(vnt i=1; i.out5; i++k鰅n%p

poutH1p

wwwCit315.org.out/H1p

.out% }q%p



10.IteTip:鯦SP 声明

JSP 页@T中编写;frson代码,默认ut翻译j Prri);n ;ftserv.ce bt;T中ba 而 Jsp 声明中j宾st; 代码被翻 译j絖sspperiicn bt;T;f外面。语法: .out%! st; 代码q%p

所接,JSP 声明可lo于叮义鯦SP 页@T转换成时絧eri);n 以此j.蔡肟椤⒊稍北淞亢蚥t;T 。 r(注.蔡肟椤⒈淞亢秃秅e c叮义在疑ot鯦SP 声明中蔚疑以接分别违独叮义在(注tJSP 声明中。oJSP 隐式e(“譶ep范围仅限相蚿eri);n ;f_sspperiicn bt;T蔚了釉 JSP 声明中2(举詔io这些隐式e(“。

10.8

Tip:tJSP 声明?案例te.out%!itr=ni;i{ eyste..out.intltln(
集合loaditryperi);n!. 集合ke u rnivsteyvnt globalVarg= 0/qe; PersersonsspInij()鰅neyste..out.intltln(
集合inijializitryssp!. 集合ke u %p

pout%!ie; PersersonsspDestroy()鰅neyste..out.intltln(
集合destroyitryssp!. 集合ke u %p



10.;aaTip: 繱P 注释

JSP 注释D格式: .out%-- 注释旋: --%p



JSP 引擎ys将n繱P 页@T翻译成tperi);n 以此时,忽略 JSP 页@T中被注释Dpert。

10.10 Tip: 繱P 指令
JSP 指令(dir祌sivs))为tJSP 引擎而as计的,它们并不侄举产生d魏慰杉鹐鋔aj枚(星告诉引擎如 何葱统欣SP 页@T中j逼溆嗖糠稚显 JSP 2.0 规范中股rR錙b三个指令: et S 指令蠭nclu e 指令衪aglib 指令e.10.;1 Tip: 繱P 指令简介
JSP 指令j被嫌锓ǜ袷剑 .out%@ 指令惺粜悦鹹=entry值
集合 %p

举例:.out%@ rt S co ne&qTypey=entryne j/html;颍瑀Pro=gb231蕄 集合%p

掣果疑ot指令l(注属性,这r(注属性ge c写在疑ot指令中蔚疑以接分开写。oprin: .out%@ rt S co ne&qTypey=entryne j/html;颍瑀Pro=gb231蕄 集合%p

.out%@ rt S importy=entryst; /util.Dste
集合%p

疑以接写作: .out%@ rt S co ne&qTypey=entryne j/html;颍瑀Pro=gb231蕄 集合 importy=entryst; /util.Dste
集合%p

e.10.;2 Tip: Pt S 指令eet S 指令lo于叮义鯦SP 页@TD各种属性,无论 et S 指令出 衷 JSP 页@T中类什么荡技泵它譶ep的e 星瘴集蠮SP 页@T,为了保持吃此类磂读性和遵循良簍;f编程习惯&gne S 指令最簍是放,瘴集蠮SP 页 @TrA起始位置。oJSP 2.0 规范中rR錼A et S 指令誓完整语法: .out%@ rt S [ langua Sy=entryst;
集合 ] [ e jendsy=entryp齝ka S.道
集合 ] [ importy=entry{packa S.道 | rtcka S.*}, ...
集合 ] [ sessirt=
集合trun | falsn
集合 ] [ buf祍.y=entrynons | 8kb | sez籯bp 集合 ] [ aunoFlushy=entrynrin | falsn
集合 ] [ isThrtsdSafey=entrynrun | falsn
集合 ] [ infoy=entryne j. 集合 ] [ errorPt Sy=entry偷l 薸vs_url
集合 ] [ isErrorPt Sy=entrynrun | falsn
集合 ] [ co ne&qTypey=entrymimeType [ ;颍瑀Pro=c,ra试erpet ]
集合 | p 集合ne j/html /i颍瑀Pro=ISO-8859-1
集合 ] [ rt SE猚o Stgy=entryc,ra试erpet | ISO-8859-1
集合 ] [ isELIgnoredy=entrynrun | falsn
集合 ] %p

JSP 引擎自动导入下@TrA包: st; /lang.* st; xtPrri);n.* st; xtPrri);n.ssp.* st; xtPrri);n.http.*
8te. errorPt S惺粜匀∩ss)謅必须蕋io相对路径ne掣果以“/”开头j碓舷喽杂冢pto WEB lib 以此In根 目挛唯注意2(星站点根目挛惟衖s否运,表韵相对于to页@T。o以接在 浴.xml砤ss(中etio .outerror-rt S.

元素为瘴集蠾EB lib 以此蓅s)错误葱统页@T&g其中j宾.outexcepjirt-type.

子元素tㄒ斐@嗍耐耆薅.out 薸rtp

元素tㄒ浴/”开头错误葱统页@T车穆肪丁如果蓅s)了p臣JSP 页@Tj宾errorPt S惺粜裕敲丛 浴.xml砤ss(中蓅s)错误葱统将不对该页@T起 譶ep。oJSP 引擎会根据 et S 指令誓 w nne&qType 属性生成相觔j neptperi);nRespostctPrmCe ne&qType bt;Tj宾l锞洹ne S 指令文砪e ne&qType 属性还具有说明鯦SP 源ass(字符编码譶ep。

10.13 Tip:etio ne S 指令解决SP 中伪乱bl
JSP 吃此存在有与衟eri);n 吃此完全相同In敌伪乱bl问题 e鋔a响应正稳n背 諭n敌伪乱bl问题 读取浏览onC栏鲈诵行簄背 諭n敌伪乱bl问题 JSP 引擎将n繱P 页@T翻译成tperi);n 源ass(时襬可能讣致敌伪乱bl问题 JSP 引擎将n繱P 源ass(翻译成时絧eri);n 源ass(默认采lo UTF-8o编码( JSP 肯滦人员磂 c采lo各种字 符集编码来编写鯦SP 源ass(蔚因此蔚JSP 引擎将n繱P 源ass(翻译成衟eri);n 源ass(时&/ou; l字符编 码转换。o如果鯦SP ass(中胾俊说明它采lo字符集编码蔚JSP 引擎将把它当作默认时絀SO8859-1 字符集编码处 统上 萾;1解决SP 引擎翻译蠮SP 页@T时In敌伪乱bl问题 通 ne S 指令文砪e ne&qType 属性说明鯦SP 源ass(字符集编码 ne S 指令文硆t SE猚o Stg惺粜运得黯JSP 源ass(字符集编码e.10.;4 Tip: inclu e 指令einclu e 指令lo于引入其它tJSP 页@T,掣果etio inclu e 指令引入了其它tJSP 页@T,那么 JSP 引擎将 研这gt集蠮SP 翻译成qu一鯬rri);n。所接 inclu e 指令引入通常也称之为.蔡肷显诒嘁胧卑 语法: .out%@ inclu e 睠ley=entry偷l 薸vsURL
集合%p

其中j宾睠le惺粜詌o于tū灰隺ss(相对路径上 睠le惺粜匀∩ss)謅必须蕋io相对路径ne掣果骋浴/”开头j碓舷喽杂冢pto WEB lib 以此In根目挛唯注意2(星站点根目挛惟衖s否运,表韵相对于 眛oass(。o细岗: 被引入类蝧s(必须遵循隼SP 语法。o被引入类蝧s(ge c詔io任意的扩展名,即詔其扩展名是 html tJSP 引擎也会按照葱统衘sp 页@T的bt式 葱统它里面Dpert,为了见明知意isJSP 规范as议詔io/jspf(JSP fragmllns)会按.蔡隺ss(扩 展名。ol捎趀tio inclu e 指令将会涉及j 2 注tJSP 页@T,f并会把 2 注tJSP 翻译成qu一鯬rri);n蔚了诱 2 集蠮SP 页@Tj敝噶2(举冲突(除了 rt SE猚o Stgsic导包除外)病偷qunt; mRequnDispatcher,p 集合/a.jspp 集合.操譿 rd(requn,偷spostc)&//动态包含is翻译成(注tPrri);n蔚运 行时包含te 10.15 Tip: taglib 指令eTaglib 指令lo于在 JSP 页@T中导入标签库is讲自叮义标签技术时讲。

10.16 Tip:JSP 运行-理和九大隐式e(“
每注tJSP 页@T在授疑1被)问n保琖EB 容on都会把请墙交给 JSP 引擎(即疑ot鯦吹魍吃此)去葱统。oJSP 引擎先将n繱P 翻译成qu一_sspperi);n(实质上襬v莏ecttPrri);n)衖s然后按照 Prri);n ;f nepbt式; l cep。ol捎 JSP 授疑1)问n眜t翻译成tPrri);n蔚所接授疑1)问通常会比较慢,o诙1)问 tJSP 引擎如 果发 JSP 胾俊袖化,kaw 再翻译(琲侵毒 cep得所接吃此类p葱行2(会受nIlo 臁JSP 引擎在蔯eptJSP 对觔j盻sspperi);n 时,会法进或磍as 9 集与性、 肯滦相关的e(“供_sspperi);n 使sio。JSP 技术as计者为便于肯滦人员在编写鯦SP 页@Tn眜竦o这些性、 e(“引ep得特意rR錙b 9 集相觔j北淞縥a肯滦人员在 JSP 页@T中 通这些变量kage c快速u竦o这 9 大e(“引ep。o这 9 个e(“分别是哪些泵以及譶ep襬v潜适跃?疾炖鄍兜恪偷qunorespostc砪e fig ptpli; 薸rt e cepjirt硃essirt ne S out rt S bne je.10.;7 Tip:JSP 九大隐式e(“对觔关系
requn Httpmeri);nRequn respostc Httpmeri);nRespostc5Prssirt Httpmessirt ptpli; 薸rt Prri);n bne j齝e fig Prri);n bfig out JspWTener -----p

P纕ntWTener e cepjirt硁e S thes rt S bne je.10.;8 Tip: out 隐式e(“
out 隐式e(“lo于向客户端发送文本识岳。oout 对t“ 是 通 通 调sionrt S bne j 对t“ j眓; mOut 方 ;T 返 回 ;f 蔚疗 作sion滞 ion;T 与衟eri);nRespostct; mWTener bt;T返回;f an.&qWTener e(“非常相似。oJSP 页@T中j宾out 隐式e(“类型为tJspWTener tJspWTener 相 眑谝芍执捍婷毒;f an.&qWTeneris蓅s)tJSP 页@TrA et S 指令誓 buf祍.惺粜詆e c n整它j被捍反笮s甚至关闭它j被捍贰只 有 向詏ut 对t“ 中 写鋈 Ob 内 容 蔚燎 满 足 萾 下 任 何 一 个t条  n 蔚羙ut 对t“ 才 去 调sionperi);nRespostct; mWTener bt;Tne并 通竝bt;T返回;f an.&qWTener e(“将nout 对“缓冲区ti位pert 真正写入j peri);n 引擎提供的缓冲区ti: 蓅s)tne S 指令文砨uf祍.惺粜怨乇誒b out 对“缓存枚举nout 对“缓冲区已满
8Ite 瘴集蠮SP 页@T结束e.10.;9 Tip: out 隐式e(“盲作-理图

10.i0 Tip: out 隐式e(“注意事项
同时etio out 滞 偷spostc. StwTene.,Le鋔a识岳。oio JSP 实现ass(下载。

10.i1 Tip: rt S bne j 对象eet S bne j浴笆 繱P 技术中最重要rAn 一e(“ja它代SttJSP 页@TrA运行环境,这一e(“不仅p庾 Ob对其它t8 大隐式e(“引ep得它自身还是成一l騟(“ja縠 clo来保存识岳。并且,这一e(“还封 装Ob 浴 肯滦中经常涉及j絩An 些常用操作,prin引入和跳转其它资源、检索其它l騟(“中j笔粜 礳r

10.i2 Tip: 通 ne S bne j齯竦o冷蛀e(“
StE cepjirt砨t;T返回 e cepjirt骋絜(“n; mPt S bt;T返回 ne S 隐式e(“n; mRequn bt;T返回 requn 隐式e(“n; mRespostc bt;T返回 偷spostc 隐式e(“n; mperi);n bfig bt;T返回 ce fig 隐式e(“n; mperi);n bne j bt;T返回 ptpli; 薸rt 隐式e(“n; mpessirt bt;T返回 Prssirt 隐式e(“n; mOut 方;T返回 out 隐式e(“net S bne j齪庾捌渌黷8 大内置e(“rAn庖宓盟伎迹撼腹诒喑堂讨衎a把 et S bne j浴胺ń成一普通 st; e(“j敲凑鈕t鰏t; e(“将具有什么枚举j //用在 自叮义标签上

10.i3 Tip:et S bne j岚磍騟(“eet S bne j浴癷nan;Tie; PersersonPro;t.Enbu(P(st; /lang.S.Entry pas,st; /lang.Obj祌s Strin)ie; Persst; /lang.Obj祌s ; m;t.Enbu(P,st; /lang.S.Entry pas)e. e; Persersonre ove;t.Enbu(P(st; /lang.S.Entry pas)iet S bne j浴爸谢狗庾癘b)问其它铀类an;Tie; Persst; /lang.Obj祌s ; m;t.Enbu(P,st; /lang.S.Entry pas,vnt scopn)ie; PersersonPro;t.Enbu(Pist; /lang.S.Entry pas, st; /lang.Obj祌s Strin,vnt scopn)ie; Persersonre ove;t.Enbu(P(st; /lang.S.Entry pas,vnt scopn)i代St各一l虻某A Pt S bne j.APPLICATION_SCOPE Pt S bne j.SESSION_SCOPE Pt S bne j.REQUEST_SCOPE Pt S bne j.PAGE_SCOPE find;t.Enbu(Pgbt;T (*重点蔚查找各一l蛑衘笔粜裕

10.i4 Tip:重点
到此为止蔚浴 肯滦接触nI了 4 集域e(“j et S bne j(称之为tne S 铀)i偷qun(称之为trequn 铀)iPrssirt(称之为tPrssirt 铀)iPrri);n bne j(称之为tptpli; 薸rt 铀)i这 4 集域e(“是学习 浴 类p氐阄狄ov潜适跃?疾炖鄍兜恪明确如下问题j 这 4 集对“生命周期j 圆么是铀?按虿么把这 4 集对“叫做域e(“呢j 哪种情况下用哪种域e(“r

10.i5 Tip:引入和跳转到冷蛀资源
Pt S bne j 类n中 定 义隽 一 个t操譿 rdgbtn;T 滞 两 个tinclu e btn;T 来 分 别 简 化 滞 替龃鷗RequnDispatcher.操譿 rdgbt法滞 inclu e bt;T 法进给这些bt;Tj弊试绰肪抖贾荒苁窍喽月肪秐e掣果路径以“/”开头j碓舷喽杂冢pto WEB lib 统源爽雀柯挝s否运,表韵相对于totJSP rso成鋔絩A)问路径。

10.i6 Tip:tJSP 标签
虽然我们希望tJSP 页@T交lo作识岳显韵模块ba不要嵌套d魏 st; 代码引入d魏我滴衤呒琽珁s虻际 肯滦中不引入一;阋滴衤呒遣豢赡芨模琽胍滴衤呒岣贾乱矦T出 帜芽 st; 代码,怎么办j Sun 公司允许lo户肯滦自叮义标签封装页@Tj宾st; 代码泵以便衘sp 页@T不出 謓 行 st; 代码艿奖壬 Pun 公司在 jsp 页@T中也内置Obje些标签(这些标签叫做衘sp 标签)蔚量下腥嗽痹tio这些标签縠 c完成页o@Tj眓 些常用业务逻辑。oJSP 标签也称之为 Jsp Arsirt(JSP 动作)元素,它io于在 JSP 页@T中提供n滴衤呒毒偕

10.i7 Tip:tJSP 常用标签
.outjsp:inclu ep

标签.outjsp:操譿 rdp

标签.outjsp: e.amp

标签

8;aa 10.i8 Tip: .outjsp:inclu ep

标签
.outjsp:inclu ep

标签io于把另外一个资源j笔鋔apert插入进to JSP 页@Tj笔鋔apert之中蔚这种在 JSP 页@T执行时In引入bt式称之为动态引入上 语法: .outjsp:inclu etne Sy=entry偷l 薸vsURL | .out%=exp偷ssirt%p


集合 flushy=entrynrin|falsn
集合 /p

ne S 属性lo于tū灰胱试船认喽月肪叮梢越芋 通p葱幸蒾t表达术来u竦o上 瞝ush 属性tㄔ诓迦肜渲试磈笔鋔apert时,t是否先将to JSP 页@Tj币.鋔a的pert刷新到客户端上

10.i9 Tip: .outjsp:inclu ep

与衖nclu e 指令j北冉
.outjsp:inclu ep

标签是动态引入,t.outjsp:inclu ep

标签涉及j絩A 2 集蠮SP 页@T会被翻译成t2 集蠵rri);n蔚这 2 集蠵rri);n ;fpert在p葱惺苯; l合并。 rinclu e 指令是.蔡雐s涉及j絩A 2 集蠮SP 页@T会被翻译成qu一鯬rri);n&g其pert是在源ass(级别 ; l合并。 不管是.outjsp:inclu ep

标签,还是 inclu e 指令,它们都会把gt集蠮SP 页@T膃rt合并e鋔aj盟诱鈍t集页o@T不要出 种馗磈宾HTML 全局架构标签is否运e鋔a给客户端的pert将会是成一格式混乱j宾HTML 文 档。 .outjsp:inclu ep

标签:etio ne S 属性tū灰胱试础 inclu e 指令:etio 睠le惺粜詔ū灰胱试础 假设 my浴 lib 根目挛下俊qu一鯽.jsp ass( 掣果将na.jsp 页@TM成涑蒓b如下地址j http://剑lho洗:8080/my浴/dir1/a/html 在na.jsp 页@T中etioOb如下l锞湟 b.jsp ass(: .outjsp:inclu etne Sy=entryb.jsp
集合 /p

请问:b.jsp 要位于e裁次恢胕s上面j宾inclu e 才不会出错j http://剑lho洗:8080/my浴/b.jspf bad http://剑lho洗:8080/my浴/dir1/b.jspf ok 假设 my

相关文章:
方立勋javaweb视频的笔记--xml基础
方立勋javaweb视频笔记--xml基础_计算机软件及应用_IT/计算机_专业资料。javaweb视频笔记第二、三天的,自己总结的哦~今日推荐 180份文档 2014...
传智播客JavaWeb重点知识随堂笔记
新闻 网页 贴吧 知道 音乐 图片 视频 地图 百科...传智播客JavaWeb重点知识随堂笔记_计算机软件及应用_...库的版本,随便写 <jsp-version>1.0</jsp-version...
Java_SE_马士兵笔记word版
Java_SE_马士兵笔记word版_计算机软件及应用_IT/计算机...如果读取前已到输入 流的末尾返回-1 int read(...
JSP基础教程笔记(JavaWeb开发实战经典)
JSP基础教程笔记(JavaWeb开发实战经典)_计算机软件及...用 word 文档打开 jsp 文件 (在 page 设置 ...--使用pageEncoding指编码--之前charset也可以设置...
javaweb方立勋的dom解析
东北师大附中理科学霸高中化学选修5笔记90份文档 2014年执业医师资格考试 ...方立勋JavaWeb视频教程目... 暂无评价 2页 免费 javaweb方立勋的事务隔离... ...
更多相关标签:
方立勋javaweb笔记 | 方立勋笔记和源代码 | 方立勋javaweb视频 | javaweb方立勋 百度云 | 方立勋java web视频30 | javaweb 30天 方立勋 | 方立勋javaweb | 方立勋 javaweb 迅雷 |