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

来源:互联网 发布:树莓派机器人和python 编辑:程序博客网 时间:2024/05/02 01:06

表单提交方式

  • 使用submit提交:
<input type="submit" value="提交"/>
  • 使用button提交:
// html<form id="form1">    <input type="text" name="username"/>    <input type="button" value="提交" onclick="form1();"></form>...// 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里面的标签都是固定,每个标签都有特定的含义。标签可以自己定义,可以写中文的标签 <person></person><狗></狗>
  • xml用途:html是用于显示数据,xml也可以显示数据(不是主要功能)。xml主要功能是为了存储数据。
  • xml是w3c组织发布的技术。
  • xml有两个版本 1.0,1.1。使用的都是1.0(1.1不能向下兼容)。

xml的应用

  • xml的文档声明
    • 创建一个文件,后缀名是.xml。必须要有文档声明,必须要写在第一行第一列。
    • <? xml version="1.0" encoding="gbk"?>
      • 属性:
        • version:xml的版本
        • encoding:xml编码 gbk、utf-8、iso8859-1(不包含中文
        • standalone:是否需要依赖其他文件(yes/no)
      • xml的中文乱码问题解决:保存时候的编码和设置打开时候的编码一致,不会出现乱码。
  • 定义元素(标签)
  • 定义属性
  • 注释
  • 特殊字符
  • CDATA区
  • PI指令

xml的元素定义

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

xml中属性的定义

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

xml中的注释

<!-- xml的注释 -->
  • 注释不能嵌套
  • 注释也不能放到第一行,第一行第一列必须放文档声明

xml中的特殊字符

跟html里的差不多

CDATA区

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

<b>if(a<b && b<c && c<d){}</b>// 写法<![CDATA[  内容  ]]>

xml的PI指令(处理指令)

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

<?xml-stylesheet type="text/css" href="xxx.css"?>

xml的约束

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

dtd的快速入门

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

dtd的三种引用方式

// 引用外部的dtd文件<!DOCTYPE 根元素名称 SYSTEM "dtd路径">// 使用内部的dtd文件<!DOCTYPE 根元素名称 [    <!ELEMENT person (name,age)>    <!ELEMENT name (#PCDATA)>    <!ELEMENT age (#PCDATA)>]>// 使用外部的dtd文件((网络上的dtd文件)<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">// struts2的配置文件用到

使用dtd定义元素

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

使用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添加节点

在第一个<p1>下面(末尾)添加<sex>nv</sex>

// 在第一个p1下面(末尾)添加<sex>nv</sex>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修改节点

修改第一个<p1>下面的<sex>内容是nan

// 修改第一个p1下面的<sex>内容是nanpublic 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删除节点

删除<sex>nan</sex>节点

// 删除<sex>nan</sex>节点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);    }}
0 0