JavaWeb学习笔记05-表单提交方式以及xml

时间:2022-06-03 13:22:08
1、表单提交方式
* 使用submit提交
<form>
......
<input type = "submit"/>
</form>

* 使用button提交表单
- 代码
// 实现提交方法
function form1(){
//获取form
var form1 = document.getElementById("form1");
//设置action
form1.action = "hello.html";
//提交form表单
form1。submit();
}

* 使用超链接提交
- 代码
<a href = "*.html"?username=属性值">使用超链接提交</a>

* onclick :鼠标点击事件
 onchange :改变内容(一般和select一起使用)
 
 onfocus :得到焦点
 onblur :失去焦点
 
2、xml的简介
* eXtensible Markup Language:可扩展标记型语言
** 标记型语言:html是标记型语言
- 使用标签来操作
** 可扩展:
- html里面的标签是固定的,每个标签都有特定的含义
* xml的用途
** html是用于显示数据,xml也可以显示数据(不是主要用途)
** xml主要功能是为了存储数据
** 宗旨是传输数据

* xml是w3c组织发布的技术

* xml有两个版本 1.0 1.1
- 一般都是用1.0 (1.1版本不能向下兼容)

3、xml的应用
* 不同的系统之间传输数据
最早期用字符串传输数据,后用xml传输
* 用来表示生活中有关的数据
* 用在文件配置中

4、xml的语法
(1)xml的文档声明
* 创建一个文件 后缀名是 .xml
* 如果写xml,第一步必须要有一个文档声明(写了文档声明之后,表示写xml文件的内容)
<?xml version="1.0" encoding="gbk"?>
文档声明必须写在 第一行第一列

* 属性
- version xml的版本1.0(一般使用1.0)  1.1
- encoding xml编码 gbk  utf-8  iso8859-1
- standalone 是否需要依赖其他文件 yes/no

* xml的中文乱码问题解决
保存时候的编码和设置打开时候的编码保持一致,就不会出现乱码

(2)定义元素(标签)
* 标签定义有开始必须要有结束:<person></person>
* 标签没有内容,可以在标签内结束:<person/>
* 标签可以嵌套,必须要合理嵌套
- 合理嵌套<a><b></b></a>
- 不合理嵌套<a><b></a></b>
* 一个xml中,只能有一个根标签 其他的标签都是子标签或者孙标签等

* 在xml中把空格和换行都当成内容来解析
** 下面这两段代码的含义是不一样的
* <a>tough</a>
* <a>
tough
 </a>
 
* xml中标签的命名规则
(1)xml代码区分大小写
<f/>和<F/> 这两个标签是不一样的
(2)xml的标签不能以数字和下划线开头
<2a><_a> 这样的命名是不正确的
(3)xml的标签不能以xml,XML, Xml等开头
<xmla><XMLA><Xmla> 这些都是不正确的
(4)xml的标签不能包含空格和冒号
<a b> <b:c> 这些命名是不正确的

(3)定义属性
* html是标记型文档,可以有属性
* xml也是标记型文档,可以有属性
* 属性定义的要求
(1)一个标签上可以有多个属性
(2)属性名称不能相同
(3)属性名称和属性值之间使用"=",属性值使用""包起来(可以是单引号 也可以是双引号)
(4)xml属性的名称规范和元素的名称规范一直

(4)xml中的注释
* 写法<!-- xml的注释 -->
** 注意
* 注释不能嵌套
<!--  <!-- -->  -->
注释也不能放到第一行,第一行第一列必须放文档声明

(5)xml中的特殊字符
* 如果想要在xml中显示 a<b ,不能正常显示,因为把<当作标签
这种情况下需要对特殊字符 < 进行转义
** <  &lt;
  >  $gt;
分号一定要写不可以漏。

(6)CDATA区
* 可以解决多个字符都需要转义的操作 if(a<b && b<c && d>f)
* 把这些内容放到CDATA区里面,不需要转义了
** 写法 <![CDATA[ 内容 ]]>
** 把特殊字符当作文本内容输出,而不是标签

(7)PI指令(处理指令)
* 可以在xml中设置样式
* 写法:<?xml-stylesheet type="text/css" href="css的路径"?>
* 设置样式,只能对英文标签名称起作用,对于中文的标签名称不起作用

5、xml的约束
* 为什么需要约束
* 比如现在定义一个person的xml文件
<?version="1.0" encoding="UTF-8"?>
<person>
<name>tough</name>
<age>19</age>
<department>sell</department>
</person>
现在只想要这个文件里面保存的人的信息,比如<name><age>等,但是如果在xml中写了一个<department>标签,
发现可以正常显示,因为符合语法规范,但是<department>不是我们想要的信息,sml标签是自定义的,需要技
术来规定xml中只能出现的元素,这个时候需要约束

* xml的约束的技术: dtd约束 和 schema约束

6、dtd的快速入门
* 创建一个文件 后缀名 .dtd
步骤:
(1)看xml中有多少元素,有几个元素,在dtd文件写几个<!ELEMENT>
(2)判断元素是简单元素还是复杂元素
- 复杂元素:有子元素的元素
<!ELEMENT 元素名称(子元素)>
- 简单元素:没有子元素
<!ELEMENT 元素名称(#PCDATA)>
(3)需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">

** 打开xml文件使用浏览器打开,浏览器只负责校验xml的语法,不负责校验约束

** 如果想要校验xml的约束,需要使用工具(mueclipse)

7、dtd的三种引入方式
(1)引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">
(2)使用内部的dtd文件
<! DOCTYPE 根元素名称[
<!ELEMENT person(name,age)>
<!ELEMENT name(#PCDATA)>
<!ELEMENT age(#PCDATA)>
]>
(3)使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
- 后面学到框架 structs 使用配置文件 使用外部的dtd文件(网络上的dtd文件)


8、使用dtd定义元素
* 语法:<!ELEMENT 元素名 约束>
* 简单元素 :没有子元素的元素
<!ELEMENT 元素名称(#PCDATA)>
** (#PCDATA) 约束name是字符串类型
** EMPTY 元素为空(没有内容)
** ANY 任意元素类型都可以

* 复杂元素:
<!ELEMENT 元素名称(子元素)>
* 表示子元素只能出现的次数
+ 表示一次或者多次
? 表示零次或者一次
* 表示零次或者多次

* 子元素直接使用逗号进行隔开
表示元素出现的顺序
* 子元素直接使用|隔开
表示元素只能出现其中的任意一个

9、使用dtd定义属性
* 语法:<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>

* 属性类型
CDATA 字符串
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
枚举 表示只能在一定范围内出现值,但是每次只能出现其中的一个
(aa|bb|cc)
<!ATTLIST age
ID2 (aa|bb|cc) #REQUIRED
>
表示id的值只能是aa bb cc中其中一个
ID 值只能是字母或者下划线开头
<!ATTLIST name
ID3 ID #REQUIRED
>

* 属性的约束
#REQUIRED 属性必须存在
#IMPLIED 属性可有可无
#FIXED 表示一个固定值
属性值必须是设置的这个固定值
<!ATTLIST sex
ID4 CDATA #FIXED "ABC"
>
表示值只能为ABC
直接值
* 设置直接值后,若没有写属性,则直接使用直接值设置的值
 如果写了属性值,则使用设置的那个值
 <!ATTLIST school
ID5 CDATA "WWW"
 >
 
10、实体的定义
* 语法 <!ENTITY 实体名称 "实体的值">
** <!ENTITY 实体名称 "实体的值">
** 使用的时候  $实体名称; 如TEST;

*** 注意
定义实体需要卸载内部dtd,如果写在外部dtd里面,有些浏览器下 内容得不到。

11、xml的解析的简介(重点)
* xml是标记型文档
* js使用dom解析标记型文档
- 根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象
- document对象  element对象  属性对象  文本对象  Node节点对象

* xml的解析方式:dom和sax
** dom方式解析
* 根绝xml的层级结构在内存中分配一个属性结构,把xml的标签,属性和文本都封装成对象
* 优点 能够很方便的实现增删改操作
* 缺点 如果文件过大,容易造成内存溢出

** sax方式解析
* 采用事件驱动,边读边解析
从上到下 一行一行的解析 解析到某一个对象,返回对象名称
* 优点:如果文件过大,不会造成溢出。而且很方便的实现查询的操作
* 缺点:不能实现增删改操作

* 想要解析xml,首先需要解析器
** 不同的公司和组织提供了针对dom和sax方式的解析器,通过api方式提供
*** sun公司 jaxp
*** dom4组织 dom4j
*** jdom组织 jdom
dom4j原本是jdom下面的一个组织,后独立出来。

12、jaxp的api的查看
* jaxp是javase的一部分
* jaxp解析器在jdk的javax.xml.parsers包里面
** 四个类 分别是针对dom和sax解析使用的类
*** dom:
DocumentBuilder 解析器类
- 这个类是一个抽象类,不能new
此类的实例可以从DocumentBuilderFactory.newDocumentBuilder() 方法获取

- 一个方法,可以解析xml parse("xml路径") 返回是Document整个文档
- 返回的document是一个接口 父节点是Node 如果在document里面找不到想要的方法 可以到Node里面去找

- 在document里面方法
getElementByTagName(String tagname)
-- 这个方法可以得到标签
-- 返回集合 NodeList

createElement(String tagName)
-- 创建标签

createTextNode(String data)
-- 创建文本

appendChild(Node newChild)
-- 把文本添加到标签下面

removeChild(Node oldChild)
-- 删除节点

getParentNode()
-- 获取父节点

NodeList list
- getLength() 得到集合的长度
- item(int index) 下标取到具体的值

DocumentBuilderFactory 解析器工厂
- 这个类也是一个抽象类,不能new
newInstance() 获取DocumentBuilderFactory的实例

*** sax
SAXParser:解析器类
SAXParserFactory:解析器工厂

13、使用jaxp实现查询操作
* 查询xml中所有的name元素的值
<?xml version="1.0" enCoding="UTF-8"?>//创建路径为src下面的name.xml
<person>
<p1>
<name>tough</name>
<age>21</age>
</p1>
<p1>
<name>sarah</name>
<age>20</age>
</p1>
</person>

** 步骤:
1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
2、根据解析器工厂创建解析器
builderFactory builder = builderFactory.newDocumentBuilder();
3、解析xml返回document
Document document = builder.parse("src/name.xml");
4、得到name元素
NodeList list = document.getElementByTagName("name"); //NodeList 需要导入w3c的包
5、遍历集合,得到每一个name元素
for(int i = 0 ;i<list.getLength();i++){
Node name1 = list.item(i); //返回类型是Node 需要导入w3c的包
String s = name1.getTextContent();//得到元素里面的值,使用getTextContent()
System.out.println(s);
}

* 查询xml中第一个name元素的值
//重点注意getTextContent()
** 步骤:
1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
2、根据解析器工厂创建解析器
builderFactory builder = builderFactory.newDocumentBuilder();
3、解析xml返回document
Document document = builder.parse("src/name.xml");
4、得到所有的name元素
Document list = document.getElementByTagName("name");
5、使用下标,得到第一个元素
Node name1 = list(0);
6、得到name1里面的具体的值
String s1 = name1.getTextContent();

14、使用jaxp实现添加操作
<?xml version="1.0" enCoding="UTF-8"?>//创建路径为src下面的name.xml
<person>
<p1>
<name>tough</name>
<age>21</age>
</p1>
<p1>
<name>sarah</name>
<age>20</age>
</p1>
</person>
要在name.xml中的第一个<p1>标签末端添加一个<sex>的子标签
** 步骤:
1、创建解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
2、创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
3、解析xml返回document
Document document = builder.parse("src/name.xml");
4、得到所有<p1>
NodeList list = document.getElementByTagname("p1");
5、得到第一个<p1>
Node p1 = list.item(0);
6、创建标签
Element sex1 = document.createElement("sex");
7、创建文本
Text text1 = document.createTextNode("boy");
8、把文本添加到标签里
sex1.appendChild(text1);
9、把标签添加到p1里
p1.appendChild(sex1);
10、回写xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFoctory.newTransformer();
transformer.transform(new DOMSource(document),new streamResult("src/name.xml"));

15、使用jaxp实现修改操作  
<?xml version="1.0" enCoding="UTF-8"?>//创建路径为src下面的name.xml
<person>
<p1>
<name>tough</name>
<age>21</age>
<sex>boy</sex>
</p1>
<p1>
<name>sarah</name>
<age>20</age>
</p1>
</person>
//先要把<sex>标签里面boy改为man
** 步骤:
//重点注意setTextContent()
1、创建解析器工厂
DocumentBuilerFactory builderFactory = DocumentBuilderFactory.newInstance();
2、创建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
3、解析xml返回document
Document document = builder.parse("sec/name.xml");
4、得到<sex>标签 
Node sex1 = document.getElementByTagName("sex");//返回的是Node类型
5、修改属性
sex1.setTextContent("man");
6、回写
TransformerFactory transformerFactory = TransFormerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document),new streamResult("src/name.xml"));

16、使用jaxp实现删除操作
//删除上述<sex>标签
** 步骤:
1、创建解析器工厂
DocumentBuilderFactory documentBuilder = DocumentBuilderFactory.newInstance();
2、创建解析器
DocumentBuiler builder = documentBuilder.newDocumentBuilder();
3、解析xml返回document
Document document = builder.parse("src/name.xml");
4、得到<sex>返回node
Node sex1 = document.getElementByTagName("sex").item(0);
5、得到<sex>的父亲节点<p1> 返回node
Node p1 = sex1.getParentNode();
6、删除<sex>
p1.romoveChild(sex1);
7、回写
TransFormerFactory transformerFactory = TransFormerFactory.newInstance();
Transformer transformer = transformerFoctory.newTransformer();
transformer.transform(new DOMSource(document),new streamResult("src/name.xml"));


15、使用jaxp实现遍历节点操作
** 步骤:
1、创建解析器工厂
DocumentBuilderFactory documentBuilder = DocumentBuilderFactory.newInstance();
2、创建解析器
DocumentBuiler builder = documentBuilder.newDocumentBuilder();
3、解析xml返回document
Document document = builder.parse("src/name.xml");
//通过一个方法实现遍历
list1(document);
4、得到根节点
5、得到根节点的子节点
6、得到根节点的子节点的子节点
private static void list1(Node node){
//打印结果
//通过node元素类型进行判断
if(node.getNodeType == Node.ELEMENT_NODE){
System.out.println(node.getNodename());
}
//得到一层子节点
NodeList list = node.getChildNodes();
//遍历list
for(int i=0;i<list.getLength();i++){
//得到每一个节点
Node node1 = list.item(i);
//继续得到node1的子节点,通过递归方法
list1(node1);
}
}