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的一个分支!性能优异!功能强大!
特殊符号:
<: <
>: >
": "
': '
&: &
编写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 根元素 [元素声明]>
<?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" 类型
外部文档声明
假如 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>
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
为什么使用 DTD?
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
在标记CDATA下,所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待,CDATA的形式如下:
<![CDATA[文本内容]]>
CDATA的文本内容中不能出现字符串“]]>”,另外,CDATA不能嵌套。
3、W3C(World Wide Web Consortium)
万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。
它基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
2)alt+shift+z----->把当前代码用模板包围,再进行后续操作(如try-catch或者for循环等)
如果 选定 int a=123;
alt+shift+z 选 try catch
就会变为
try
{
int a=123;
}
catch(Exception e)
{
}
转载于:https://www.cnblogs.com/wsnedved2017/p/6742868.html
2017年4月21号课堂笔记相关推荐
- 2017年6月21号课堂笔记
2017年6月21号 星期三 多云转雷阵雨 空气质量:中度污染~轻度污染 内容: JavaScript 原型式面向对象 01基于Object的对象的方式创建对象:02使用字面量赋值方式创建对象 03构 ...
- 2017年4月5号课堂笔记
2017年4月5号 晴 轻度雾霾 内容:Set,Map,遍历集合的方法,泛型,小Demo,Collections工具类的使用 一.Set 老师代码: package cn.bdqn.test; imp ...
- 2017年5月5号课堂笔记
2017年5月5号 星期五 沙尘暴转晴 内容:U2 HTML5第一节课 一.01第一个霸气的网页 1.老师代码: <!DOCTYPE html><html><head l ...
- 2017年3月13号课堂笔记
2017年3月13号 晴 空气质量:优 内容:双重循环,Java基础总结 一.Double01(3个班级各4名学员参赛,求每个班的平均分) 1.老师代码: public class Double01 ...
- 2017年6月23号课堂笔记
2017年6月23号 星期五 暴雨转阵雨 空气质量:良 内容: 01jQuery-Validate验证插件的使用:02bootstrap小例子: 03引用charisma代码小例子 一.jQuery- ...
- 2017年6月16号课堂笔记
2017年6月16号 星期五 空气质量:中度污染~轻度污染 内容:jQuery:remove,bind,attr,on和live,同辈和父辈节点的操作, keyup/keypress/keydown, ...
- 2017年06月07号课堂笔记
2017年06月07号 晴 空气质量:中度污染->良 内容:jQuery第二节:基本选择器,层次选择器,属性选择器, 基本过滤选择器,可见性过滤选择器 备注:代课老师:李老师 一.基本选择器 1 ...
- 2017年07月03号课堂笔记
2017年07月03号 星期一 多云 空气质量:轻度污染~中度污染 内容:MySQL第四节课 in和not in:两个表的内连接:exists和not exsits的使用:all,any和some: ...
- 2017年4月24号课堂笔记
2017年4月24号 晴 空气质量:中度污染 内容:反射及相关,java设计六大原则(自学) 一.反射机制 在 程序运行期间,对于任何一个类,都能获得它的所有方法和属性! 对于任何一个对象,都能调 ...
最新文章
- c语言作业雇人写,C语言作业的链表数据的读写
- Javascript设置cookie和获取cookie
- mysql select 缓存_mysql select缓存机制使用详解
- mysql union all sum_[数据库]SQL Server UNION ALL 结果 SUM函数造成精度丢失
- 【转帖】漫话C++0x(四) —- function, bind和lambda
- 升级系统服务器出错,win10更新失败80070002错误怎么办
- 印象笔记打开错误_只会用手机自带便签?这三款笔记软件分分钟秒杀
- 2.程序员的自我修养---编译和链接
- 计算机组成原理同步测试,计算机组成原理白中英单元练习题
- MATLAB图像处理之自动识别,并提取特征
- python修改pdf内容_python3.6调整字体Python处理pdf文件库 - PyPDF2详解
- 由三点画圆到未来日记:失控中的位置隐私
- 1038 Recover the Smallest Number
- crx插件转换火狐插件_关于Firefox插件
- win10连上wifi却上不了网
- Java中IO的快速复习(代码+注释)
- Win11本地时间与服务器时间不符怎么解决?
- Sci-Hub创始人收到苹果的通知:2年前就把她的账户数据给了FBI
- 前端js——金山打字通小游戏(屏幕随机下落字母,获取键盘按键)
- C语言 求m~n(m<n)之间所有整数的和
热门文章
- linux android build tools,build.gradle 文件中的 Android SDK Build Tools version
- 打印pdf就一页_Excel表格打印技巧汇总,看完才发现,你连基础打印技巧都不知道...
- 数组中一个属出现奇数次,其他数都出现偶数次.寻找出这个出现奇数次的数
- 计算机的好处和坏处的英语作文,电脑的利弊英语作文
- 打造最强加密工具之《绝密信息传递》
- java jar killed_容器中Java 程序OOMKilled原因浅析
- c语言逆序输出6A8F,【C语言】将二进制数逆序输出。比如6为000...0110,逆序后为0110....
- NS3Gym python侧代码分析
- 工业以太网交换机几点常见故障解析
- 飞畅科技-工业以太网的应用现状及前景展望