javaee杂谈

欢迎大家进行JavaEE培训

第一天 java技术加强

Eclipse的使用

工作空间(workspace)、工程(project)、工作组(working set)

eclipseJava程序的编写和运行,及java运行环境的配置。

快捷键的配置,常用快捷键:

• 内容提示(Content Assist)Alt + /         

• 快速修复(Quick Fix)Ctrl + 1

• 导包:ctrl + shift + O

• 格式化代码块:ctrl + shift + F  ---> 配置代码自动格式化

• 添加(除去)块注释 Ctrl+Shift+/ (Ctrl+Shift+\)

• 添加(除去)单行注释 Ctrl+/

• 移动代码:选中行 alt+/

• 删除行:ctrl+D

 使用EclipseDebug功能

• 查看类源代码:ctrl+鼠标左键/ F3

• 前向后:Alt + 方向键(左、右)

• 查看类继承关系:F4

• F5(跳入)  F6(跳过)   F7(跳出) debug模式

Junit测试

取代main方法快速测试程序

l @Test: 测试方法

l @Ignore: 被忽略的测试方法

l @Before: 在每个测试方法执行之前都要执行一次。

l @After: 在每个测试方法执行之后要执行一次。

l @BeforeClass: 所有测试开始之前运行 static

l @AfterClass: 所有测试结束之后运行 static

使用断言判断测试结果

• assertEquals(expected, actual)

• assertNull(object)

• assertNotNull(object)

• assertTrue(condition)

• assertFalse(condition)

jdk1.5新特性

泛型

泛型优点1.安全  2.不需要强制转换  3.将运行阶段问题放到编译阶段解决

 

泛型:1.使用泛型规范集合,并且会对使用了泛型的集合List  Map进行遍历

1.集合中的泛型必须会使用

2.我们在自定义类上使用泛型

2.1 在类上定义泛型

在类上定义了一个泛型,对于在类上定义的泛型,我们在整个类内都可以使用.可以在方法上,可以在属性上,但是不能在静态方法中应用。

2.2 在方法上定义泛型

在任意的方法上都能声明泛型,但是泛型必须加在方法的返回值前。

 

3.泛型中的通配符 关于通配符使用

 

通配符是  ?

 

? extends E  它代表的是E类型或E的子类

这个在Collection接口中的addAll(Collection c)

? super E    它代表的是E类型或E的父类

泛型的擦除

泛型只是在编译阶段有效果,当运行后它就失去作用。

枚举

Ø 为什么需要枚举?

• 一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决

Ø JDK 5新增的 enum 关键字用于定义一个枚举类

Ø 创建枚举格式:

enum 枚举类型名称 {

枚举对象1名称,

枚举对象2名称,

 … ,

枚举对象n名称;

}

Ø 枚举类具有如下特性:

• 枚举类也是一种特殊形式的Java类。

• 枚举类中声明的每一个枚举值代表枚举类的一个实例对象。

• java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的(这点不难理解)。

• 若枚举类只有一个枚举值,则可以当作单态设计模式使用。

Ø 枚举注意事项

• 1:枚举默认就是abstract的,不可以实例化。

• 2:枚举中可以拥有abstract抽像方法。

• 3:枚举的所有成员,都默认是public static final类型的。且必须要第一行开始声明。必须在,(逗号)分开。

• 4:所有的枚举,默认都是java.lang.Enum

• 5:Enum类不但是所有枚举的公共的基类,还是一个工具类。

•  6: 枚举中的构造方法必须是private,可以重载。

Ø 枚举常用API

Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:

• name()  得到枚举常量的名称

• ordinal() 得到枚举常量的序号

• valueof(Class enumClass, String name) 根据枚举常量的名称得到枚举对象

• 自定义的枚举类

• valueof(String name) 根据枚举常量名称得到枚举对象

• values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便

 

静态导入

l JDK 1.5 增加的静态导入语法用于导入类的某个静态属性或方法

使用静态导入可以简化程序对类静态属性和方法的调用。

语法:

• Import static 包名.类名.静态属性|静态方法|*

例如:

• import static java.lang.System.out;

• import static java.util.Arrays.sort;

• import static java.lang.Math.*;

静态导入它有弊端

 如果一个类中存在同名的方法,在导入时就会出错。

 静态导入的代码可读性太差。

 

自动拆箱与装箱

l JDK5.0的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 类型的变量,这个过程称之为自动装箱。

自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量。

典型应用:

List list = new ArrayList();

list.add(1);

int j = (Integer)list.get(0);

增强for

引入增强for循环的原因:抛弃Iterator

l for/in语句的适用范围

• 遍历数组

• 遍历实现Iterable接口的集合类

语法格式:                                              

for(变量类型 变量 :需迭代的数组或集合){

}

增强for底层是使用迭代器实现的。

使用它的时候只能进行遍历操作,而不能像List中通过get方式可以对某个元素进行精确控制。

什么样的类可以被增强for操作? 只要实现Iterable接口就可以。

这个接口代表是可以被增强for操作的。

动态参数

测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组,传数组又传参的情况。

• 注意:传入基本数据类型数组的问题。

JDK 5开始, Java 允许为方法定义长度可变的参数。语法:

public void foo(int args){

}

注意事项:

• 调用可变参数的方法时, 编译器将自动创建一个数组保存传递给方法的可变参数,因此,程序员可以在方法体中以数组的形式访问可变参数

• 可变参数只能处于参数列表的最后, 所以一个方法最多只能有一个长度可变的参数

 

声明  类型... 变量名

这个变量本质就是一个数组.

在传递参数时,可以传递多个值,也可以传递一个数组。

注意:动态后面不能有其它的参数,可以在前面声明。

 

Arrays下的asList就是使用了动态参数,

它的作用是将数组变成List集合。

注意:由数组变成的集合不能改变集合长度。

            如果数组中的元素是基本类型,那么它会将数组装入到集合中做为元素。

      如果是引用类型,将数组中的元素做为集合的元素。

 

反射

什么是反射?

• 剖析Java类中的各个组成部分映射成一个个java对象

•  java.lang.Class

• java.lang.reflect 包下

• 构造方法 Constructor

• 成员变量 Field

• 方法 Method

 

反射用在哪里

• 多用于框架和组件,写出复用性高的通用程序

Ø Class的获得

l Javajava.lang.Class类用于表示一个类的字节码(.class)文件

 

如何得到某个class文件对应的class对象

• 已知类和对象的情况下

• 类名.class

• 对象.getClass()

• 未知类和对象的情况下

• Class.forName(“包名.类名”) 

 

l Class类代表某个类的字节码,并提供了加载字节码的方法:forName(包名.类名”)

• forName方法用于加载类字节码到内存中,并封装成一个Class对象

Constructor

Constructor类的实例对象代表类的一个构造方法

 

得到某个类所有的构造方法

Constructor [] constructors= Class.forName("java.lang.String").getConstructors();

 

得到指定的构造方法并调用

Constructor constructor = Class.forName(java.lang.String).getConstructor(String.class);

String str = (String)constructor.newInstance(abc);

 

Class类的newInstance()方法用来调用类的默认构造方法

String obj =(String)Class.forName("java.lang.String").newInstance();

Field

l Field类代表某个类中的一个成员变量,并提供动态的访问权限

l Field对象的获得

• 得到所有的成员变量

• Field[] fields = c.getFields(); // 取得所有public属性

• Field[] fields = c.getDeclaredFields(); // 取得所有声明的属性

• 得到指定的成员变量

• Field name = c. getField("name");

• Field name = c. getDeclaredField("name");

设置Filed变量是否可以访问

• field. setAccessible(boolean);

l Field变量值的读取、设置

• field.get(obj)

• filed.set(obj,value);

Method

Method代表某个类中的一个成员方法

得到类中的某一个方法:

• char charAt(int index)

• 例子:     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对象对应的是一个静态方法!

l jdk1.4jdk1.5invoke方法的区别:

• Jdk1.5public Object invoke(Object obj,Object... args)

• Jdk1.4public Object invoke(Object obj,Object[] args),即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码也可以用Jdk1.4改写为 charAt.invoke(str, new Object[]{1})形式。

 

JDK1.7新特性

二进制符号

你可用作二进制字符前加上 0b 来创建一个二进制类型。

int binary = 0b1001_1001; 

在数字中使用下划线

int billion = 1_000_000_000; 

对字符串进行switch case

String availability = "available";  

switch(availability) {  

 case "available":  

    //code  

    break;   

   

  case "unavailable":  

    //code  

    break;   

   

  case "merged":  

    //code   

   

  default:  

    //code  

    break;  

注意:在把字符串传进Switch case之前,别忘了检查字符串是否为Null

泛型实例创建过程中类型引用的简化

当声明你的对象的接口是,你肯定是不想重复指明泛型类型

看看下面的这种写法多好呀

Map hello = new Map<>(); 

对资源的自动回收管理

下面的代码看起来有点麻烦不是吗

BufferedReader br = new BufferedReader(new FileReader(path));  

try {  

   return br.readLine();  

} finally {  

   br.close();  

相信你一定会喜欢下面这种写法

try (BufferedReader br = new BufferedReader(new FileReader(path)) {  

   return br.readLine();  

一个catch里捕捉多个异常类型

try {  

Here comes your code....  

}  

catch(IOException | NullPointerException | ..........) {  

第二天 xmlxml约束

XML

什么是XML(Extensible Markup Language)

l XML 指可扩展标记语言

l XML 是一种标记语言,很类似 HTML

l XML 的设计宗旨是传输数据,而非显示数据

l XML 标签没有被预定义

使用约束的XML文档设计具有自我描述性。

l XML W3C 的推荐标准

XML企业端应用

存储和传输复杂的关系模型数据

在软件系统中,作为配置文件使用

XML HTML 的主要差异

l XML 不是 HTML 的替代。

l XML HTML 为不同的目的而设计:

l XML 被设计为传输和存储数据,其焦点是数据的内容。

l HTML 被设计用来显示数据,其焦点是数据的外观。

l HTML 旨在显示信息,而 XML 旨在传输信息。

XML树形结构

XML 文档必须包含根元素。该元素是所有其他元素的父元素。XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端

Everyday Italian

Giada De Laurentiis

2005

30.00

Learning XML

Erik T. Ray

2003

39.95

 

XML的组成部分

Ø 文档声明

在编写XML文档时,需要先使用文档声明,声明XML文档的类型。

最简单的声明语法:

encoding属性说明文档的字符编码:

 

standalone属性说明文档是否独立:

Ø 元素    XML 以及 HTML 文档的主要构建模块

XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:

包含标签体:www.itcast.cn

不含标签体的:, 简写为:

一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:

welcome to www.it315.org

格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。

对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的

第一段:

<网址>www.itcast.cn网址>

第二段:

<网址>

www.itcast.cn

网址>

由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变

XML 元素必须遵循以下命名规则:

区分大小写名称可以含字母、数字以及其他的字符

名称不能以数字或者标点符号开始

名称不能以字符 “xml”(或者 XMLXml)开始

名称不能包含空格

避免 ":" 字符。冒号会被转换为命名空间来使用(稍后介绍)。

 

Ø 属性    可提供有关元素的额外信息

一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

属性值一定要用双引号(")或单引号(')引起来

定义属性必须遵循与标签相同的命名规范

多学一招:在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,例如:

  text

避免 XML 属性?因使用属性而引起的一些问题:

属性无法包含多个值(子元素可以)

属性无法描述树结构(子元素可以)

属性不易扩展(为未来的变化)

属性难以阅读和维护

请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息

Ø 注释  

Xml文件中的注释采用:” 格式。

注意:

XML声明之前不能有注释

注释不能嵌套,例如:

……

-->  

Ø CDATA区 、特殊字符

在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。

遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。

语法:内容 ]]>


]]>

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。

 

Ø 处理指令(processing instruction

 

处理指令,简称PI processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。

 

例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。

 

处理指令必须以作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。

XML语法总结

XML 的语法规则很简单,且很有逻辑。这些规则很容易学习,也很容易使用。

所有 XML 元素都须有关闭标签

l XML 标签对大小写敏感

l XML 必须正确地嵌套

l XML 文档必须有根元素

l XML 的属性值须加引号

特殊字符必须转义

l XML 中的空格会被保留

XML约束介绍

什么是XML约束

• XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。

为什么需要XML约束

常用的约束技术

• XML DTD

• XML Schema

 

DTD

什么是DTD

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构. DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

拥有正确语法的 XML 被称为“式良好”的 XML。通过某个 DTD 进行了验证的 XML 是“合法”的 XML。

为什么使用 DTD

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。您还可以使用 DTD 来验证您自身的数据。

DTD示例

Xml文件内容

tom

99

thinking in c++

james

88

 

thinking in c++

james

88

Dtd文件内容

 

 

lang ID #REQUIRED

>

 

 

DTD校验

1. 使用eclipse工具自动校验

2. 使用js校验

<script type="text/javascript">

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")

xmlDoc.async = "false";

xmlDoc.validateOnParse = "true";

xmlDoc.load("bookstore.xml");

 

document.write("
Error Code: ");

document.write(xmlDoc.parseError.errorCode);

document.write("
Error Reason: ");

document.write(xmlDoc.parseError.reason);

document.write("
Error Line: ");

document.write(xmlDoc.parseError.line);

script>

DTDXML文档关联三种方式

DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写

使用内部DTD   

使用外部DTD   SYSTEM

使用公共DTD   PUBLIC

 

Ø 内部DTD

书架 [

书架 (+)>

(书名,作者,售价)>

书名 (#PCDATA)>

作者 (#PCDATA)>

售价 (#PCDATA)>

]>

<书架>

<>

<书名>Java就业培训教程书名>

<作者>张孝祥作者>

<售价>39.00售价>

>

...

书架>

 

Ø 外部DTD(文件的后缀名是 dtd

XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:

 

当引用的文件在本地时(外部DTD),采用如下方式:

文档根结点 SYSTEM "DTD文件的URL">

例如: 书架 SYSTEM “book.dtd”>。在xml文件中手写一下。

 

当引用的文件是一个公共的文件时(公共DTD)采用如下方式:

文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

 

例如:

"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

DTD元素

元素内容类型

DTD属性

商品

类别 CDATA #REQUIRED

颜色 CDATA #IMPLIED

>

#REQUIRED  这个代表属性必须有。

 

DTD实体

引用实体

实体名 “实体值”>

]>

引用时  &实体名;

 

DOCTYPE persons [

 company SYSTEM "entity_content.xml" >  //导入外部实体

]>

 

参数实体 (它只能应用在dtd)

<?xml version="1.0" encoding="UTF-8"?>

 % basic "name,age">

 company "传智播客">

 user (programer,manager)>

 programer (%basic;,birthday)>

 manager (%basic;,sal,company)>

 

SCHEMA

Schema介绍

l XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd

一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档

XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根结点的名称为Schema

编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束

Schema名称空间

       targetNamespace="http://www. itcast.cn"

       elementFormDefault="qualified"

       attributeFormDefault="qualified"

>

 

l targetNamespace元素用于指定schema文档中声明的元素属于哪个名称空间。

l elementFormDefault元素用于指定局部元素是否受到该schema指定targetNamespace所指定的名称空间限定

l attributeFormDefault元素用于指定局部属性是否受到该schema指定targetNamespace所指定的名称空间限定

 

XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URIUniform Resource Identifier,统一资源标识符)表示。 在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:

书架 xmlns:itcast=http://www.itcast.cn>

>……>

书架>

 此处使用itcast来指向声明的名称,以便于后面对名称空间的引用。

注意:名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URLhttp://www.itcast.cn根本没有指向任何文件,只是一个分配的名字。

为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定,例如:

书架 xmlns:itcast="http://www.itcast.cn"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=http://www.itcast.cn book.xsd">

l schemaLocation此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置,两者之间用空格分隔。

注意,在使用schemaLocation属性时,也需要指定该属性来自哪里。

Xml解析

Ø Xml解析概述

l XML解析方式分为两种:domsax

• dom(Document Object Model, 即文档对象模型) W3C 组织推荐的解析XML 的一种方式。

• sax(Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

 

l XML解析开发包

• Jaxp(sun)Jdomdom4j

 

Ø Sax解析与dom解析的区别

l DOM  支持回写

• 会将整个XML载入内存,以树形结构方式存储

• 一个300KBXML文档可以导致RAM内存或者虚拟内存中的3000000KBDOM树型结构

• XML比较复杂的时候,或者当你需要随机处理文档中数据的时候不建议使用

l SAX

• 相比DOM是一种更为轻量级的方案

• 采用串行方法读取 --- 逐行读取

• 编程较为复杂

• 无法修改XML数据

 

Ø 选择 DOM 还是 SAX,这取决于几个因素

应用程序的目的:如果必须对数据进行更改,并且作为 XML 将它输出,则在大多数情况下,使用 DOM

数据的数量:对于大文件,SAX 是更好的选择

将如何使用数据:如果实际上只使用一小部分数据,则使用 SAX 将数据抽取到应用程序中,这种方法更好些

需要速度:通常,SAX 实现比 DOM 实现快

 

Dom解析

解析器工厂类DocumentBuilderFactory

• DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

解析器类DocumentBuilder

• DocumentBuilder db = dbf.newDocumentBuilder();

解析生成Document对象

• Document doc = db.parse("message.xml");

通过Document对象查询节点

• document.getElementById   返回Node对象 --- 必须文档元素有ID属性

• document.getElementsByTagName  返回NodeList对象

 

Ø 查询节点API

通过Document对象查询节点

n document.getElementById   返回Node对象 --- 必须文档元素有ID属性

n document.getElementsByTagName  返回NodeList对象

Ø 什么是节点:元素、属性、文本、实体、注释

Node 子接口: ElementAttrTextDocument

Ø NodeList API

节点列表类NodeList就是代表了一个包含一个或者多个Node的列表,可以简单的把它看成一个Node的数组

常用方法

u getLength():返回列表的长度。

l  ArrayList size

u item(int):返回指定位置的Node对象

l ArrayList get(index)

 

Ø Node API

Node对象提供了一系列常量来代表结点的类型

当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象

n getAttribute(String):返回标签中给定属性的值(元素)

n getAttributeNode(name):返回指定名称的属性节点(元素)

n getNodeName():返回节点的名称(元素-- > 标签名)

n getNodeType():返回节点的类型

n getNodeValue():返回节点的值

n getChildNodes():返回这个节点的所有子节点列表

n getFirstChild():返回这个节点的第一个子节点

n getParentNode():返回这个节点的父节点对象

n appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去

n removeChild(org.w3c.dom.Node):删除给定的子节点对象

n replaceChild(org.w3c.dom.Node neworg.w3c.dom.Node old):用一个新的Node对象代替给定的子节点对象

n getNextSibling():返回在DOM树中这个节点的下一个兄弟节点

n getPreviousSibling()返回在DOM树中这个节点的前一个兄弟节点

 

Ø dom回写

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:

n javax.xml.transform.dom.DOMSource类来关联要转换的document对象,

javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。

Transformer对象通过TransformerFactory获得。

Ø Dom CRUD示例

 

Sax解析的

根据element可以获得元素名称与属性内容

根据character可以获取文本内容.

l  SAX 是事件驱动的 XML 处理方法

它是基于事件驱动的

l startElement() 回调在每次 SAX 解析器遇到元素的起始标记时被调用

l characters() 回调为字符数据所调用

l endElement() 为元素的结束标记所调用  

l DefaultHandler类(在 org.xml.sax.helpers 软件包中)来实现所有这些回调,并提供所有回调方法默认的空实现

 

Ø Sax解析步骤

使用SAXParserFactory创建SAX解析工厂

• SAXParserFactory spf = SAXParserFactory.newInstance();

通过SAX解析工厂得到解析器对象

• SAXParser sp = spf.newSAXParser();

通过解析器对象得到一个XML的读取器

• XMLReader xmlReader = sp.getXMLReader();

设置读取器的事件处理器

• xmlReader.setContentHandler(new XMLContentHandler());

解析xml文件

• xmlReader.parse("book.xml");

 

Dom4j解析

Dom4j介绍

l Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4jAPI相对要复杂一些,但它提供了比JDOM更好的灵活性

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

使用Dom4j开发,需下载dom4j相应的jar文件

 

Dom4j导包

 

 

Dom4j 常用API

Ø DOM4j中,获得Document对象的方式有三种:

 

1.读取XML文件,获得document对象           (解析)

         SAXReader reader = new SAXReader();
              Document   document = reader.read(new File("input.xml"));

 

2.解析XML形式的文本,得到document对象. (添加--创建一个xml片段)

                   String text = "";
              Document document = DocumentHelper.parseText(text);

 

3.主动创建document对象. (创建一个空文档对象 --- 生成)

                  Document document = DocumentHelper.createDocument();
             //创建根节点

                  Element root = document.addElement("members");

Ø DOM4J 常用API

节点对象操作API

1.获取文档的根节点.

      Element root = document.getRootElement();

2.取得某个节点的子节点.

Element element=node.element(“书名");

3.取得节点的文字

      String text=node.getText();

4.取得某节点下所有名为“member”的子节点,并进行遍历.
 List nodes = rootElm.elements("member");
 
  for (Iterator it = nodes.iterator(); it.hasNext();) {
     Element elm = (Element) it.next();
    // do something
 }

 

5.对某节点下的所有子节点进行遍历. root.elements();
    for(Iterator it=root.elementIterator();it.hasNext();){
       Element element = (Element) it.next();
       // do something
    }

 

6.在某节点下添加子节点.
Element ageElm = newMemberElm.addElement("age");

7.设置节点文字.
 element.setText("29");

 

8.删除某节点.
//childElm是待删除的节点,parentElm是其父节点

    parentElm.remove(childElm);

9.添加一个CDATA节点.
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());

节点对象属性

1.取得某节点下的某属性
    Element root=document.getRootElement();    
    //属性名name

         Attribute attribute=root.attribute(size);
//getValue()

2.取得属性的文字
    String text=attribute.getText(); === getValue();

 

 3.删除某属性
 Attribute attribute=root.attribute("size");
 root.remove(attribute);

4.遍历某节点的所有属性
   Element root=document.getRootElement();    
   for(Iterator it=root.attributeIterator();it.hasNext();){
         Attribute attribute = (Attribute) it.next();
         String text=attribute.getText();
         System.out.println(text);
    }

 

5.设置某节点的属性和文字.
   newMemberElm.addAttribute("name", "sitinspring");

 

6.设置属性的文字
   Attribute attribute=root.attribute("name");
   attribute.setText("sitinspring");

 

Dom4j CRUD

第三天 web服务器与HTTP协议

Web服务器

l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。

l Internet上供外界访问的Web资源分为:

• 静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变。

• 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。

静态web资源开发技术

• Html

常用动态web资源开发技术:

• JSP/ServletASPPHP等  ruby  python

• Java中,动态web资源开发技术统称为Javaweb,我们课程的重点也是教大家如何使用Java技术开发动态的web资源,即动态web页面。

但是我们做java开发,不是做网页。

 

网络上的资源分为两种

早期:静态页面   html实现。   观看

现在:动态页面   php asp jsp  交互.

 

lamp =linux +apache+ mysql+php----->个人网关或小型企业首选

asp现在没人用,但是网络上遗留下来的比较多。miscrosoft的技术

.net技术。

 

jsp--->java去做网页所使用的技术。jsp本质上就是servlet

使用jsp开发成本高。

 

BS====>浏览器+服务器   只要有浏览器就可以

CS----->客户端+服务器.  必须的在客户端安装程序.

 

现在基本上开发的都是BS程序

 

BS怎样通信:

必须有请求有响应。

有一次请求就应该具有一次响应,它们是成对出现的。

 

服务器介绍

大型服务器:websphere(IBM),weblogic(Oracle)J2EE容器 - 

支持EJB (EnterPrice Java Bean (企业级的javabean)) – Spring

weblogic BEA公司产品,被Oracle收购,全面支持JavaEE规范,收费软件,企业中非常主流的服务器 -------- 网络上文档非常全面

WebSphere 文档非常少,IBM公司产品,价格昂贵,全面支持JavaEE 规范

 

Tomcat- apache,开源的。Servlet容器。

tomcat 开源小型web服务器 ,完全免费,主要用于中小型web项目,只支持ServletJSP 等少量javaee规范 ,Apache公司jakarta 一个子项目

 

Jboss – hibernate公司开发。不是开源免费。J2EE容器

 

Tomcat安装

注意路径中不要包含空格与中文。

Ø 安装步骤

1tomcat.apache.org 下载tomcat安装程序

tomcat6 安装程序 ---- zip免安装版

2、解压tomcat

3、配置环境变量 JAVA_HOME 指向JDK安装目录  D:\Program Files\Java\jdk1.6.0_21

*CATALINA_HOME指定tomcat安装目录

4、双击tomcat/bin/startup.bat

5、在浏览器中 输入 localhost:8080 访问tomcat主页了

 

Ø 注意问题:

启动黑色不能关闭

1CATALINA_HOME 指定tomcat安装位置 --- 可以不配置

2JAVA_HOME 指定JDK安装目录,不要配置bin目录,不要在结尾加;

3、端口被占用

启动cmd

netstat -ano 查看占用端口进程pid

任务管理器 查看---选择列 显示pid -- 根据pid结束进程

* 有些进程无法关系(系统服务 --- 必须结束服务) win7 自带 World wide web publish IIS服务 默认占用端口80

* xp 安装apache服务器后,会占用80 端口 ,关闭apache服务

通过运行 services.msc 打开服务窗口 关闭相应服务

 

tomcatc目录结构

-----bin    它里面装入的是可执行的命令 如 startup.bat

-----conf    它里面是一个相关的配置文件,我们可以在里面进行例如端口,用户信息的配置

               connectionTimeout="20000"

               redirectPort="8443" />

 

-----lib     tomcat类库。

-----logs    tomcat 日志文件

-----temp    临时文件

-----webapps  它里面放的是的 web site(web项目)

-----work     存放的是页面(例如 jsp)转换成的.class文件。

创建网站,将网站发布到tomcat服务器上

创建网站根目录

在根目录下 创建静态web资源和动态web资源

Web site

  ---- *.html *.css *.js 图片 音频 视频 、*.jsp

  ---- WEB-INF目录 存放java程序和配置文件

          --- classes 存放.class文件

          --- lib 存放.jar 文件

          --- web.xml 网站核心配置文件

          

*** 如果静态网站可以不存在 WEB-INF目录的 ,WEB-INF目录,客户端无法直接访问(在服务器内存通过程序访问)

 

将网站发布到tomcat -----------虚拟目录映射

虚似目录的映射方式有三种

1.在开发中应用的比较多  直接在webapps下创建一个自己的web site就可以.

步骤 1.webapps下创建一个myweb目录

     2.myweb下创建WEB-INF目录,在这个目录下创建web.xml

     3.web.xml文件中的xml声明与根元素声明在其它的web sitecopy过来。

     4.myweb下创建一个index.html文件

     5.启动tomcat

     6.在浏览器中输入  http://localhost/myweb/index.html

以下两种方式,可以将web site不放置在tomcat/webapps下,可以任意放置

2.server.xml文件中进行配置

   

Host结束前配置

 

path:它是一个虚拟路径,是我们在浏览器中输入的路径

docBase:它是我们web sit的真实路径

 

 http://localhost/abc/index.html

3.不在server.xml文件中配置

而是直接创建一个abc.xml文件

在这个xml文件中写

 

将这个文件放入conf\Catalina\localhost

 

    http://localhost/abc/index.html

生成war文件

 

war文件是web项目的压缩文件。

要想生成,先将要压缩的内容压缩成zip文件,

然后将后缀改成war就可以,

war文件可以直接在服务器上访问。

 

关于tomcat-manager

可以在conf/tomcat-users.xml中进行用户信息添加

 

 

 

 

这样就添加了一个用户

 

注意,用户权限要是比较大的话,会出现安全问题.

 

 

虚拟主机

做自己的一个http://www.baidu.com

 

1.访问一个网站的过程

http://www.baidu.com

 

http   协议

www  服务器

.baidu.com 域名  IP

 

步骤

1.上网将baidu首页下载下来

 

2.做一个自己的web  site 首页就是下载下来的页面。

  别忘记创建WEB-INF在它下面的web.xml文件中

   

index.html

 

 这句话的作用是默认访问页面是index.html

 

3.tomcat中的conf文件夹下的server.xml中修改

 

    unpackWARs="true" autoDeploy="true"

    xmlValidation="false" xmlNamespaceAware="false">

 

      

 

4.windows/system32/drivers/etc/hosts中添加

 

127.0.0.1   www.baidu.com

 

    目的是当访问www.baidu.com时其实访问的是本机。

 

5.打开浏览器在地址栏中输入www.baidu.com

  这时其时访问的是我们自己

  web site中的页面。

使用myeclipse创建web projecttomcat集成

我们在myeclipse中创建web project有一个WebRoot目录。

但是我们发布到tomcat中没有这个,它其时就是我们工程的名称.

 

步骤

1.创建web工程

2.eclipse中配置tomcat服务器

window/属性/myeclipse/service中配置自己的tomcat目录.

注意到tomcat根目录就可以了。不要到bin中。

 如果不好使用,看一些jdk是否配置.

3. webproject部署到tomcat

 

HTTP协议

 

HTTPhypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。

HTTP协议是学习JavaWEB开发的基石,不深入了解HTTP协议,就不能说掌握了WEB开发,更无法管理和维护一些复杂的WEB站点。

 

示例1

telnet怎样使用

   1.telnet localhost 8080

 

   2 ctrl+]

 

   3.按回车

 

   注意 在里面写错的内容不能修改

 

   GET  /index.html HTTP/1.1

   host:localhost

 

   4.要敲两次回车

 

HTTP/1.0版本只能保持一次会话

HTTP/1.1版本可能保持多次会话.

 

   是根据telnet得到的响应信息

 

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

ETag: W/"7347-1184876416000"

Last-Modified: Thu, 19 Jul 2007 20:20:16 GMT

Content-Type: text/html

Content-Length: 7347

Date: Thu, 25 Apr 2013 08:06:53 GMT

Connection: close

 

   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

    

    Apache Tomcat