我的传智播客之javaweb_day05学习总结

表单提交方式

  • 使用submit提交:
type="submit" value="提交"/>
  • 使用button提交:
// html
"form1"> type="text" name="username"/> type="button" value="提交" onclick="form1();">
... // js // 实现提交方法 function form1() { // 获取form var form1 = document.getElementById("form1"); // 设置action form1.action="hello.html"; // 提交form表单 from1.submit(); }
  • 使用超链接提交
<a herf="hello.html?username=1234">使用超链接提交a>
  • 一些事件:
onclick:鼠标点击事件
onchange:改变内容(一般和select一起使用)
onfocus:得到焦点
onblur:失去焦点

xml的简介

eXtensible Markup Language: 可扩展标记型语言

  • 标记型语言:也是使用标签来操作
  • 可扩展:html里面的标签都是固定,每个标签都有特定的含义。标签可以自己定义,可以写中文的标签 <狗>
  • xml用途:html是用于显示数据,xml也可以显示数据(不是主要功能)。xml主要功能是为了存储数据。
  • xml是w3c组织发布的技术。
  • xml有两个版本 1.0,1.1。使用的都是1.0(1.1不能向下兼容)。

xml的应用

  • xml的文档声明
    • 创建一个文件,后缀名是.xml。必须要有文档声明,必须要写在第一行第一列。

      • 属性:
        • version:xml的版本
        • encoding:xml编码 gbk、utf-8、iso8859-1(不包含中文
        • standalone:是否需要依赖其他文件(yes/no)
      • xml的中文乱码问题解决:保存时候的编码和设置打开时候的编码一致,不会出现乱码。
  • 定义元素(标签)
  • 定义属性
  • 注释
  • 特殊字符
  • CDATA区
  • PI指令

xml的元素定义

  • 有开始必须要有结束
  • 标签没有内容,可以在标签内结束
  • 标签可以嵌套,必须要合理嵌套
  • 一个xml中只能有一个根标签,其他标签都是这个标签下面的标签
  • 在xml中把空格和换行都当前内容来解析
// 表示的内容不同
<aa>bbaa>
<aa>
    bb
aa>
  • xml中标签的命名规则
    • xml标签区分大小写
    • xml的标签不能以数字或下划线”_”开头
    • 不能以xml,XML,Xml等开头
    • 不能包含空格和冒号”:”

xml中属性的定义

  • 一个标签上可以有多个属性
  • 属性名称不能相同
  • xml属性的命名规范和元素的命名规范一致

xml中的注释

  • 注释不能嵌套
  • 注释也不能放到第一行,第一行第一列必须放文档声明

xml中的特殊字符

跟html里的差不多

CDATA区

可以解决多个字符都需要转义的操作,把这些内容放到CDATA区里面。

<b>if(a<b && b<c && c<d){}b>
// 写法

xml的PI指令(处理指令)

可以在xml中设置样式,设置样式只能对英文标签名称起作用。

xml的约束

  • 为什么需要约束?
    • xml的标签是自定义的,需要技术来规定xml中只能出现的元素。
  • xml的约束的技术:dtd约束和schema约束

dtd的快速入门

  • 创建一个文件,后缀名:.dtd
  • 步骤:
    • xml中有多少个元素就在dtd文件中写多少个
    • 判断元素是简单元素还是复杂元素
      • 复杂元素:有子元素的元素,子元素间用逗号”,”隔开
      • 简单元素:没有子元素
    • 在xml文件中引入dtd文件
  • 浏览器只负责检验xml的语法,不负责校验约束。想要校验xml的约束,需要使用工具(myeclipse)。

dtd的三种引用方式

// 引用外部的dtd文件


// 使用内部的dtd文件

    
    
]>

// 使用外部的dtd文件((网络上的dtd文件)

// struts2的配置文件用到

使用dtd定义元素

  • 简单元素:
    • (#PCDATA):约束name是字符串类型
    • EMPTY:元素为空(没有内容)
    • ANY:任意
  • 复杂元素:
    • ,子元素只能出现一次。
    • 表示子元素出现的次数
      • +:表示1次或多次
      • ?:表示0次或1次
      • *:表示0次或多次
    • 子元素之间使用逗号进行隔开,表示子元素出现的顺序。
    • 子元素之间使用竖线”|”隔开 ,表示元素只能出现其中的任意一个。

使用dtd定义属性

  • 语法:
<!ATTLIST 元素名称
    属性名称 属性类型 属性的约束
>
  • 属性类型
    • CDATA:字符串
    • 枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个 (aa|bb|cc)
    • ID:值只能是字母或下画线开头
  • 属性的约束
    • #REQUIRED:属性必须存在
    • #IMPLIED:属性可有可无
    • #FIXED:表示一个固定值 #FIXED “AAA”,属性的值必须是设置的这个固定值
    • 直接值
      • 不写属性,使用直接值
      • 写了属性,使用设置那个值

实体的定义

  • 语法:
ENTITY 实体名称 "实体的值">
ENTITY TEST "AAA">
  • 使用实体 &实体名称;
  • 定义实体需要写在内部dtd里,,有些浏览器不能得到外部的dtd的实体。

xml的解析的简介(写到java代码)

  • xml的解析方式(技术):dom 和 sax
  • dom方式解析:
    • 解析过程:根据xml的层级结构在内存中分配一个树形结构。把xml的标签、文本、属性都封装成对象。
    • 优点:很方便实现增删改操作
    • 缺点:如果文件过大,造成内存溢出
  • sax方式解析:
    • 解析过程:采用事件驱动,边读边解析。从上到下,一行一行的解析,解析到某一个对象,返回对象名称。
    • 优点:不会造成内存溢出,方便实现查询操作
    • 缺点:不能实现增删改操作
  • 解析xml需要解析器
    • 不同组织提供api提供针对dom和sax的解析器
      • sun公司:jaxp
      • dom4j组织:dom4j (实际开发中使用)
      • jdom组织:jdom

jaxp的api查看

  • jaxp是javase的一部分,jaxp解析器在jdk的javax.xml.parsers包里面。
  • 四个类:分别是针对dom和sax解析使用的类
    • dom:
      • DocumentBuilder:解析器类,这个类是一个抽象类。通过DocumentBuilderFactory实例的newDocumentBuilder()方法获取。
      • 解析xml:parse(“xml路径”),返回是Document整个文档。
      • Document是一个接口,父节点是Node,Document找不到的方法可以在Node里面去找。
      • Document里面的方法
        • getElementsByTagName(String tagName):得到标签,返回的是集合 NodeList
        • createElement(String tagName):创建标签
        • createTextNode():创建文本
        • appendChild(Node newChild):把文本添加到标签下面
        • removeChild():删除节点
        • getParentNode():获取父节点
        • NodeList:getLength()、item(int index)
        • Node:getTextContent():得到标签里面的内容
      • DocumentBuilderFactory:解析器工厂,这个类也是一个抽象类,用newInstance()获取该实例。
    • sax:
      • SAXParser:解析器类
      • SAXParserFactory:解析器工厂

使用jaxp实现查询操作

  • 查询xml中所有的xxx元素的值
  • 查询xml中第一个name元素的值
// 查询所有name元素的值
private static void selectAll() throws Exception {
    /*
     * 1.创建解析器工厂
     * 2.根据解析器工厂创建解析器
     * 3.解析xml返回document
     * 4.得到所有的name元素
     * 5.返回集合,遍历集合,得到每一个name元素
     */
    // 创建解析器工厂
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    // 创建解析器
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    // 解析xml返回document
    Document document = builder.parse("src/person.xml");
    // 得到name元素
    NodeList list = document.getElementsByTagName("name");
    // 遍历集合
    for (int i = 0; i < list.getLength(); i++) {
        Node name1 = list.item(i); // 得到每一个name元素
        // 得到name元素里面的值
        String s = name1.getTextContent();
        System.out.println(s);
    }
}

// 查询xml中第一个name元素的值
public static void selectSin() throws Exception {
    /*
     * 1.创建解析器工厂
     * 2.根据解析器工厂创建解析器
     * 3.解析xml返回document
     * 4.得到所有的name元素
     * 5.使用返回集合的item,下标获取具体的元素
     * 6.得到具体的值
     */
    // 创建解析器工厂
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    // 创建解析器
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    // 解析xml返回document
    Document document = builder.parse("src/person.xml");
    // 得到所有的name元素
    NodeList list = document.getElementsByTagName("name");
    // 使用下标,得到第一个元素
    String s = list.item(0).getTextContent();
    // 得到name里面的具体的值
    System.out.println(s);
}

使用jaxp添加节点

在第一个下面(末尾)添加nv

// 在第一个p1下面(末尾)添加nv
public static void addSex() throws Exception {
    /*
     * 1.创建解析器工厂
     * 2.根据解析器工厂创建解析器
     * 3.解析xml返回document
     * 4.得到第一个p1
     * 5.创建sex标签
     * 6.创建文本
     * 7.把文本添加到sex下
     * 8.把sex添加到第一个p1下
     * 9.回写xml
     */
    // 创建解析器工厂
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    // 创建解析器
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    // 解析xml返回document
    Document document = builder.parse("src/person.xml");
    // 得到所有的p1
    NodeList list = document.getElementsByTagName("p1");
    // 得到第一个p1
    Node p1 = list.item(0);
    // 创建sex标签
    Element sex1 = document.createElement("sex");
    // 创建文本
    Text text1 = document.createTextNode("nv");
    // 把文本添加到sex1下
    sex1.appendChild(text1);
    // 把sex1添加到p1下
    p1.appendChild(sex1);
    // 回写xml
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}

使用jaxp修改节点

修改第一个下面的内容是nan

// 修改第一个p1下面的内容是nan
public static void modifySex() throws Exception {
    /*
     * 1.创建解析器工厂
     * 2.根据解析器工厂创建解析器
     * 3.解析xml返回document
     * 4.得到sex
     * 5.修改sex里面的值
     * 6.回写xml
     */
    // 创建解析器工厂
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    // 创建解析器
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    // 得到document
    Document document = builder.parse("src/person.xml");
    // 得到sex
    Node sex1 = document.getElementsByTagName("sex").item(0);
    // 修改sex值
    sex1.setTextContent("nan");
    // 回写xml
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}

使用jaxp删除节点

删除nan节点

// 删除nan节点
public static void delSex() throws Exception {
    /*
     * 1.创建解析器工厂
     * 2.根据解析器工厂创建解析器
     * 3.解析xml返回document
     * 4.得到sex
     * 5.获取sex的父节点
     * 6.使用sex的父节点删除sex
     * 7.回写xml
     */
    // 创建解析器工厂
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    // 创建解析器
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    // 得到document
    Document document = builder.parse("src/person.xml");
    // 得到sex
    Node sex1 = document.getElementsByTagName("sex").item(0);
    // 得到sex的父节点
    Node p1 = sex1.getParentNode();
    p1.removeChild(sex1);
    // 回写xml
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}

使用jaxp遍历节点

把xml中的所有元素名称打印出来

// 遍历节点,把所有元素名称打印出来
public static void listEelment() throws Exception {
    /*
     * 1.创建解析器工厂
     * 2.根据解析器工厂创建解析器
     * 3.解析xml返回document
     * 4.得到根节点
     * 5.得到根节点子节点
     * 使用递归实现
     */
    // 创建解析器工厂
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    // 创建解析器
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    // 得到document
    Document document = builder.parse("src/person.xml");
    // 编写一个方法实现遍历操作
    list1(document);
}

private static void list1(Node node) {
    // 判断元素类型的时候才打印
    if (node.getNodeType() == Node.ELEMENT_NODE) {
        System.out.println(node.getNodeName());
    }
    // 得到一层子节点
    NodeList list = node.getChildNodes();
    for (int i = 0; i < list.getLength(); i++) {
        // 得到每一个节点
        Node node1 = list.item(i);
        list1(node1);
    }
}

你可能感兴趣的:(我的传智播客之javaweb_day05学习总结)