2017年4月21号课堂笔记

2017年4月21号 星期五 空气质量:良

内容:XML,Dom4j解析XML文件,单例

一、XML

老师代码:

<?xml version="1.0" encoding="UTF-8"?>
<!-- XML的注释
xml是什么? 可扩展的标记语言 ! 开闭原则! 设计模式中的6大原则!
什么是标记? 确保数据的唯一性!
int age=5;
syso(age);

01.符合W3C标准
02.可扩展的标记语言
03.无需预编译
04.着重于数据的保存和传输

DTD:就是对xml文件的约束!是一种事先定义好的规范!

CDATA: Character Data 字符数据
语法: <![CDATA[
代码 (不会被解析器 解析! 不会当作标记!)
]]>

Dom(Document Object Model):文档对象模型 ! dom会把xml文件映射成一个 倒挂的树!

常见的4种解析器:
Dom: 基于xml文档树结构的解析,把文件中的内容读取到内存中,占内存,消耗资源!
SAX: 基于事件的解析!不需要将文件中的内容读取到内存中!占用资源少!
JDom: 第一个java特定的模型! 符合2 8原则!本身并不包含解析器!使用SAX2解析器解析!
Dom4j:就是JDom的一个分支!性能优异!功能强大!


特殊符号:
<: &lt;
>: &gt;
": &quot;
': &apos;
&: &amp;


编写xml标签的 注意事项:
01.所有的xml元素必须有闭合标签 /
02.xml标签对大小写敏感
03.xml标签必须正确的嵌套
04.xml同级标签 缩进对齐
001. table键 选中的部分整体 后移
002. shift+table 选中的部分整体 前移
05.元素名称 不能以数字和标点符号开始
06.元素名称 不能包含空格

-->



<学校>
<班级 name="1年级">
<学生 name="小黑1"></学生>
<学生 name="小黑2"></学生>
<学生 name="小黑3"></学生>
</班级>
<班级 name="2年级">
<学生 name="小红1"></学生>
<学生 name="小红2"></学生>
<学生 name="小红3"></学生>
</班级>
<班级 name="3年级">
<学生 name="小紫1"></学生>
<学生 name="小紫2"></学生>
<学生 name="小紫3"></学生>
</班级>
</学校>



二、Dom4j解析XML文件

1、导入Dom4j的jar包

2、老师代码:

package cn.bdqn.xml;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jTest {

/**
* Dom4j 解析 xml文件
* 思路:
* 01.创建解析器工厂
* 02.解析器工厂创建具体的解析器
* 03.解析器把xml文件转换成一个dom树
* 04.以dom树的根节点 为起点 操作dom树
*/
static Document document = null;
static Element root = null;

// 获取 dom树 以及 根节点 root
public static void main(String[] args) {
// 创建解析器对象
SAXReader reader = new SAXReader();
try {
document = reader.read("phone.xml");
// 获取根节点
root = document.getRootElement();
} catch (DocumentException e) {
e.printStackTrace();
}

// 新增手机信息 addPhone();
// 删除指定的手机信息 delPhone();
// 修改指定的手机信息
updatePhone();
// 查询所有的手机信息
showPhones();
}

// 查询所有的手机信息
private static void showPhones() {
// 从根节点开始 遍历所有的子节点
Iterator<Element> brands = root.elementIterator();
while (brands.hasNext()) {
Element brand = brands.next();
// 通过 节点获取属性名,以及获取属性值
System.out.println("手机的品牌是:" + brand.attributeValue("name")); // 你给我一个
// 再次遍历brand 获取手机的型号
Iterator<Element> types = brand.elementIterator();
while (types.hasNext()) {
Element type = types.next();
// 获取属性值
System.out.println("型号是:" + type.attributeValue("name"));
// 获取元素内容
if (!type.getText().equals("")) {
System.out.println("元素内容是:" + type.getTextTrim());
}
}
}
}

// 新增手机信息
private static void addPhone() {
/**
* 01.创建需要的元素
* 在内存中创建了
* <Brand></Brand>
*/
Element element = root.addElement("Brand");
/**
* 02.给元素增加属性
* 在内存中增加了
* <Brand name="小米"></Brand>
*/
element.addAttribute("name", "小米");
/**
* 03.在元素下面新增子元素
* 在内存中增加了
* <Brand name="小米">
* <Type></Type>
* </Brand>
*/
Element type = element.addElement("Type");
/**
* 04. 在内存中增加了
* <Brand name="小米">
* <Type name="红米Not7"></Type>
* </Brand>
*/
type.addAttribute("name", "红米Not7");
/**
* 上面的所有操作 都是 内存中的对象!并没有和xml文件进行关联?
*
* 持久化操作:
* 把内存中的内容保存到 xml文件中的过程!
* 增删改操作,都必须是操作xml文件!
*/
savePhone();

}

/**
* 把内存中的内容保存到 xml文件中的过程! 输出流
*/
private static void savePhone() {
// 创建转换器
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = null;
/**
* 创建输出流对象
* XMLWriter(Writer w,OutputFormat f)
* w:说 我们把内存中的内容输出到 哪个xml文件中去
* f:说 到xml文件后的 输出格式
* FileWriter是Writer 孙子类!
*/
try {
writer = new XMLWriter(new FileWriter("phone.xml"), format);
writer.write(document);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭资源
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

// 删除指定的手机信息
public static void delPhone() {
// 通过root获取所有的Brand元素
Iterator<Element> brands = root.elementIterator();
while (brands.hasNext()) {
Element brand = brands.next(); // 获取一个brand
if (brand.attributeValue("name").equals("苹果")) { // 找到了
// 删除
brand.getParent().remove(brand);
}
}
// 保存xml
savePhone();
}

// 修改指定的手机信息
public static void updatePhone() {
// 通过root获取所有的Brand元素
Iterator<Element> brands = root.elementIterator();
while (brands.hasNext()) {
Element brand = brands.next(); // 获取一个brand
if (brand.attributeValue("name").equals("小米")) { // 找到了
Iterator<Element> types = brand.elementIterator();
while (types.hasNext()) {
Element type = types.next();
if (type.attributeValue("name").equals("红米Not7")) {
type.attribute("name").setValue("红米Note7");
}
}
}
}
// 保存xml
savePhone();
}

}

三、单例

老师代码:

1、说明(readme):

单例设计模式:


概念:
01.是java中最简单的一个设计模式之一!
02.属于创建型模式!提供了一种创建对象的最佳方式!


特点:
01.涉及一个单一的类!该类负责创建自己的对象,同时确保只有一个对象!
02.这个类提供一种访问其对象的方式!可以供外部访问!

注意点:
01.单例类只能有一个实例!
02.单例类必须是自己创建自己的唯一实例!
03.单例类必须给所有的其他对象提供这个实例!

常见的实现方式:
01.懒汉
02.饿汉
03.双重锁

实现的步骤:
01.创建一个类本身 类型的静态属性
02.私有化构造(私有化无参构造,带参构造不用写了
03.提供对外部访问的接口

2、改成单例模式前(可创建多个对象)

1)学生类

package cn.bdqn.bean;

//学生类
public class Student {

private String name; // 姓名
private int age;// 年龄

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public Student() {
super();
}

public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}

}

2)测试类

package cn.bdqn.bean;

public class SingletonTest {

public static void main(String[] args) {
// 创建一个学生对象
Student student1 = new Student("学生1", 1);
// 再创建一个学生对象
Student student2 = new Student("学生2", 2);

System.out.println("学生1的姓名是:" + student1.getName());
System.out.println("学生2的姓名是:" + student2.getName());
}

}

3、懒汉式

1)学生类

package cn.bdqn.bean2;

/**
* 懒汉式
*/
public class Student { // 学生类

// 01.创建一个类本身 类型的静态属性
private static Student student = null;

// 02.私有化构造
private Student() {

}

// 03.提供对外部访问的接口
public static synchronized Student getInstance() {
if (student == null) {
student = new Student();
}
return student;
}

public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}

private String name; // 姓名
private int age;// 年龄

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}

}

2)测试类

package cn.bdqn.bean2;

public class SingletonTest {

public static void main(String[] args) {
// 创建一个学生对象
Student student1 = Student.getInstance();
student1.setName("学生1");
// 再创建一个学生对象
Student student2 = Student.getInstance();
// 再创建一个学生对象
Student student3 = Student.getInstance();
student3.setName("学生3");
// 再创建一个学生对象
Student student4 = Student.getInstance();

System.out.println("学生1的姓名是:" + student1.getName());
System.out.println("学生2的姓名是:" + student2.getName());
System.out.println("学生3的姓名是:" + student3.getName());
System.out.println("学生4的姓名是:" + student4.getName());
}
}

4、饿汉式

1)学生类

package cn.bdqn.bean3;

/**
* 饿汉式
*/
public class Student { // 学生类

// 01.创建一个类本身 类型的静态属性
private static Student student = new Student();

// 02.私有化构造
private Student() {

}

// 03.提供对外部访问的接口
public static synchronized Student getInstance() {
return student;
}

public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}

private String name; // 姓名
private int age;// 年龄

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}

}

2)测试类

package cn.bdqn.bean3;

public class SingletonTest {

public static void main(String[] args) {
// 创建一个学生对象
Student student1 = Student.getInstance();
student1.setName("学生1");
// 再创建一个学生对象
Student student2 = Student.getInstance();
// 再创建一个学生对象
Student student3 = Student.getInstance();
student3.setName("学生555");
// 再创建一个学生对象
Student student4 = Student.getInstance();

System.out.println("学生1的姓名是:" + student1.getName());
System.out.println("学生2的姓名是:" + student2.getName());
System.out.println("学生3的姓名是:" + student3.getName());
System.out.println("学生4的姓名是:" + student4.getName());
}
}

5、双重锁

1)学生类

package cn.bdqn.bean4;

/**
* 双重锁
*/
public class Student { // 学生类

// 01.创建一个类本身 类型的静态属性
private static Student student = null;

// 02.私有化构造
private Student() {

}

// 03.提供对外部访问的接口
public static synchronized Student getInstance() {//第一道锁
if (student == null) {
synchronized (Student.class) {//第二道锁
if (student == null) {
student = new Student();
}
}
}
return student;
}

public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}

private String name; // 姓名
private int age;// 年龄

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}

}

2)测试类

package cn.bdqn.bean4;

public class SingletonTest {

public static void main(String[] args) {
// 创建一个学生对象
Student student1 = Student.getInstance();
student1.setName("学生1");
// 再创建一个学生对象
Student student2 = Student.getInstance();
// 再创建一个学生对象
Student student3 = Student.getInstance();
student3.setName("学生666");
// 再创建一个学生对象
Student student4 = Student.getInstance();

System.out.println("学生1的姓名是:" + student1.getName());
System.out.println("学生2的姓名是:" + student2.getName());
System.out.println("学生3的姓名是:" + student3.getName());
System.out.println("学生4的姓名是:" + student4.getName());
}
}

四、老师课上提到的几个概念(网上查到的概况)

1、DTD ((Document Type Definition))

文档类型定义(Document Type Definition)是一套为了进行程序间的数据交换而建立的关于标记符的语法规则。

它是标准通用标记语言和[1]  可扩展标记语言1.0版规格的一部分,文档可根据某种DTD语法规则验证格式是否符合此规则。

文档类型定义也可用做保证标准通用标记语言、可扩展标记语言文档格式的合法性,可通过比较文档和文档类型定义文件来检查文档是否符合规范,元素和标签使用是否正确。

文件实例提供应用程序一个数据交换的格式。

使用各类文档类型定义是为了让标准通用标记语言、可扩展标记语言文件能符合规定的数据交换标准,因为这样,不同的公司只需定义好标准文档类型定义,就都能依文档类型定义建立文档实例,并且进行验证,如此就可以轻易交换数据,防止了实例数据定义不同等原因造成的数据交换障碍,满足了网络共享和数据交互。

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

带有 DTD 的 XML 文档实例

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

以上 DTD 解释如下:

!DOCTYPE note (第二行)定义此文档是 note 类型的文档。

!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"

!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型

!ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 类型

!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型

!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD: (在 IE5 中打开,并选择“查看源代码”命令。)

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

这是包含 DTD 的 "note.dtd" 文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

为什么使用 DTD?

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。

通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

您还可以使用 DTD 来验证您自身的数据。

2、cdata(character data)

在标记CDATA下,所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待,CDATA的形式如下:
<![CDATA[文本内容]]>


CDATA的文本内容中不能出现字符串“]]>”,另外,CDATA不能嵌套。


DTD实例:
指定类型为CDATA以后就可以在XML中被用于实例,
例如下面payment 元素的type属性被指定为CDATA类型后在XML中就可以赋于"check"的字符数据。
<!ATTLIST payment type CDATA "check">
XML 实例:
XML 解析器通常会解析 XML 文档中所有的文本。
当某个 XML 元素被解析时,其标签之间的文本也会被解析:
<message>此文本也会被解析</message>解析器之所以这么做是因为 XML 元素可包含其他元素,就像这个例子中,其中的 <name> 元素包含着另外的两个元素(first 和 last):
<name><first>Bill</first><last>Gates</last></name>
而解析器会把它分解为像这样的子元素:
<name>
<first>Bill</first>
<last>Gates</last>
</name>

3、W3C(World Wide Web Consortium)

万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。

到目前为止,W3C已发布了200多项影响深远的Web技术标准及实施指南,如广为业界采用的超文本标记语言(标准通用标记语言下的一个应用)、可扩展标记语言(标准通用标记语言下的一个子集)以及帮助残障人士有效获得Web内容的信息无障碍指南(WCAG)等,有效促进了Web技术的互相兼容,对互联网技术的发展和应用起到了基础性和根本性的支撑作用。

W3C为解决 Web 应用中不同平台、技术和开发者带来的不兼容问题,保障 Web 信息的顺利和完整流通,万维网联盟制定了一系列标准并督促 Web 应用开发者和内容提供者遵循这些标准。标准的内容包括使用语言的规范,开发中使用的导则和解释引擎的行为等等。
 
W3C也制定了包括XML和CSS等的众多影响深远的标准规范。 但是,W3C 制定的 web 标准似乎并非强制而只是推荐标准。因此部分网站仍然不能完全实现这些标准。特别是使用早期所见即所得网页编辑软件设计的网页往往会包含大量非标准代码。
 

4、JSON

 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。

它基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

5、Tips:

1)XML里双击后+F2----->查看底层

2)alt+shift+z----->把当前代码用模板包围,再进行后续操作(如try-catch或者for循环等)

demo:

如果 选定 int a=123;
alt+shift+z 选 try catch
就会变为
try
{
int a=123;
}
catch(Exception e)
{
}

五、作业

1、soso项目

2、做题

六、老师辛苦了!

 

原文地址:https://www.cnblogs.com/wsnedved2017/p/6742868.html