1.表单提交的方式(引入)
***通过type=“submit”
***通过type="button" οnclick=""来实现
***通过超链接来实现
***onclick:鼠标点击事件
onchange:改变内容(一般和select一起使用)
onfocus:得到焦点(兼容)
onblur:失去焦点
<!doctype html>
<html lang="en">
<head>
<title>Document</title>
</head>
<body>
<form id="form1">
<input type="text" name="username"/><br/>
<input type="button" value="提交" οnclick="form1();"/>
<form>
<hr/>
<a href="h.html?username=123456">ccccccc</a>
<hr/>
<input type="text" id="id1" name="text1" value="input" οnfοcus="focus2();" οnblur="blur2();"/>
</body>
<script type="text/javascript">
function form1(){
//获取form
var form1=document.getElementById("form1");
//设置action
form1.action="h.html";
//提交表单
form1.submit();
}
function focus2(){
var input1=document.getElementById("id1");
input1.value="";
}
function blur2(){
var input1=document.getElementById("id1");
input1.value="input";
}
</script>
</html>
2.xml简介
*****xml:可扩展标记性语言
****标记性语言:html 标签
****可扩展:
---html中的标签是固定的,每个有特定的含义
---xml的标签可以自己定义。可以是中文的标签 <preson></person> <猫></猫>
****xml用途
***html是用于显示数据,xml也可以是显示数据(不是主要功能)
***xml主要功能是存贮数据(小型的数据库)
***xml是w3c组织发布的技术
***xml版本1.0 1.1 (使用1.0,1.1不能向下兼容)
3.xml的应用
****不同的系统之间传输数据
****qq之间传输数据
****表示生活中有关的数据
****经常用在配置文件
******例如连接数据库的操作,肯定知道数据库的用户名和密码,数据名称。
******如果修改数据库的信息,不需要修改源代码,值需要修改配置文件就行了 4.xml的语法
(1)xml的问档声明(*******)
--创建一个文档,后缀名是.xml
--如果写xml,第一步必须要有一个文档声明(写了文档声明之后,表示xml文件的内容)
--<?xml version="1.0" encoding="gbk"?>
--注意:文档声明必须是第一行第一列
**属性:
--version:xml的版本一般用1.0
--encoding:xml的编码 utf-8,gbk,iso8859-1(不包含中文)
--standalone:是否需要依赖其他的文件 yes,no
****xml中文乱码问题的解决
****设置保存时候的编码和打开时候的编码一致
(2)定义元素(标签)(*******)
(3)定义属性(*******)
(4)注释
(5)特殊字符(*******)
(6)CDATA区(了解)
(7)PI指令(了解)
5.xml元素的定义(标签的定义)
***标签定义:
*****标签有开始就有结束<person></person>
*****标签中没有内容<person/>
*****标签可以嵌套,必须合理嵌套
*****合理嵌套<aa><bb></bb></aa>
*****不合理嵌套<aa><bb></aa></bb>
*****一个xml中只能有一个根标签,其他的标签都在下面来写
*****在xml中把空格和换行都当作内容来解析:
--- 下面两行代码是不一样的
<a>1111111</a>
<a>
11111
</a>
****xml中标签的命名规则
(1)区分大小写 <A></A> <a></a>不同
(2)xml的标签不能以数字和下划线开头
(3)xml标签不能以xml XML开头
(4)xml的标签不能包含空格和冒号
(5)xml可以是中文
6.xml中的属性的定义
***html是标记性文档,可以有属性
****xml也是标记型文档,可以有属性
--<person id=""aaaa></person>
****属性定义的要求
(1)一个标签上可以有多个属性
(2)属性名称不能相同
(3)属性和属性值之间用=号属性值用单引号多引号(html类似)
(4)属性的命名规范和标签的命名规范一样
7.xml中的注释
***写法:<!-- xml的注释 -->
***注意:注释不能嵌套 <!-- <!-- -->--> 这种不对
***注释也不能放在第一行,第一行第一列必须是文档声明。
8.xml中的特殊字符
***如果在xml中想要显示a<b,需要对<进行转义
*** < <
> >
" "
' '
& &
9.CDATA区
*****解决频繁转义if(a<b&&b<c&&d<f){}
*****利用CDATA区来解决转义
*****写法
<![CDATA[内容]]> 该内容就不需要转义
<![CDATA[<a>if(a<b&&b<c)</a>]]>
*****把特殊字符当成文本内容,而不是标签解析
10.PI指令(处理指令)
****可以在xml中设置样式
****写法:<?xml-stylesheet="text/css" href="css文件位置"?>
***设置样式,只能对英文标签起作用,对中文标签不起作用的。
***xml的语法总结
所有xml元素必须有关闭标签 例如:</person>
xml标签对大小写敏感
xml必须正确的嵌套顺序
xml文档必须只有一个根元素
xml的属性值需要加“”或‘’
xml中特殊字符转义用CDATA
xml中的空格回车换行会被解析时保留
11.xml的约束
***为什么需要约束?
***比如定义一个person的xml文件,只想保存人的信息,比如name,gae,但是若果在xml文件中写了<猫 ></猫>它可以正常的显示,但是不是人的信息,xml标签可以是自定义的,需要一种技术规范xml'中文件中出现的元素,这个时候需要约束
****xml约束 dtd约束和schema约束
12.dtd的快速入门
***创建一个文件后缀名 .dtd
步骤:
(1)xml中有多少个元素,有几个元素,在dtd文件中写几个<!ELEMENT>
(2)判断元素是简单元素还是复杂元素
---复杂元素:有子元素的元素
<!ELEMENT 元素名称(子元素,子元素)>
--简单元素:没有子元素的元素
<!ELEMENT 元素名称(#PCDATA)>
(3)需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd的文件路径">
***打开xml文件使用浏览器打开的,浏览器只负责校验语法,不校验约束
***如果想校验xml约束,需要使用工具(eclipse)
****打开eclipse
---创建javaproject
--在src中创建xml和dtd
13.dtd的三种引入方式
(1)引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM “dtd路径”>
(2)使用内部的dtd文件
<!DOCTYPE person [
<!ELEMENT person (age,name)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT gae (#PCDATA)>
]>
(3)使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" “DTD文档的URL”>
在struts2框架中使用
14.使用dtd定义元素
***语法格式: <!ELEMENT 元素名 约束>
***简单元素:没有子元素的元素
<!ELEMENT name (#PCDATA)>
***(#PCDATA):约束name是字符串
***(#EMPTY):元素为空,没有内容
<sex></sex>
***ANY:任意
****复杂元素:
<!ELEMENT person (name,age,sex,school)>
---子元素只能出现1次
--<!ELEMENT 元素名称 (子元素)>
--表示子元素出现的次数(符号)
+:表示一次或则多次
?:表示0次或则一次
*:表示0次或则多次
****子元素之间使用逗号隔开
---逗号表示子元素出现的顺序
*****子元素之间使用竖线隔开
---竖线表示子元素中只能出现任意一个
15.使用dtd定义属性
****语法格式:<!ATTLIST 元素名称
属性名称 属性类型 属性约束
>
****属性类型
--CDATA:字符串
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
--枚举:表示只能在一定的范围内出现值,但是每次出现其中的一个
***(aa|bb|cc)只能出现aa,bb,cc中的任意一个
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED
>
--ID:值自能是字母或则下划线开头
<!ATTLIST name
ID3 ID #REQUIRED
>
<name ID3="a1">张三</name>
****属性的约束
--#REQUIRED:属性必须存在
-- #IMPLIED:属性可有可无
-- #FIXED:表示一个固定值
<!ATTLIST sex
ID4 CDATA #FIXED "ABC"
>
--直接值
****不写属性直接使用直接值
*****写了属性使用设置的值
v <!ATTLIST school
ID5 CDATA "www"
>
-------------------------整体代码------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name,age,sex,school,birthday)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST sex
ID4 CDATA #FIXED "ABC"
>
<!ELEMENT school (#PCDATA)>
<!ATTLIST school
ID5 CDATA "www"
>
<!ELEMENT birthday (#PCDATA)>
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED
>
<!ATTLIST name
ID3 ID #REQUIRED
>
]>
<person>
<name ID3="a1">张三</name>
<age ID2="AA">12</age>
<sex ID4="ABC">111</sex>
<school ID5="aaa">111</school>
<birthday ID1="AAAA">2015</birthday>
</person>
16.实体的定义
****语法 <!ENTITY 实体名称 “实体的值”>
*****<!ENTITY TEST "HAHAHHEHE">
***使用实体: &实体名称; 比如:&TEST;
****注意:
****定义的实体需要写在内部的dtd里面,写在外部的dtd中,在某些浏览器中,值会得不到。
17.xml得解析简介(写到java代码)(************)
***xml是标记型文档
***js使用dom解析标记型文档
--根据html层级结构,在内存中分配一个树形结构,把html得标签,属性,文本都封装成队象
--document对象,element对象,属性对象,文本对象,node节点对象
***xml解析得方式 :dom和sax
******don解析和sax解析的区别:
---dom方式解析
----根据xml得层级结构在内存中分配一个树形结构,把xml得标签属性和文本封装成对象
-----优点:很方便实现增删改查
----缺点:如果文件过大,造成内存溢出
---sax方式解析
----采用事件驱动,边读变解析,一行一行得解析,解析到某个对象,返回对象名称
----缺点:不能实现赠三该操作
----优点:如果文件过大不会造成内存溢出,方便实现查询。
******想要解析xml,首先需要解析器
*****不同的公司和组织提供了针对dom和sax方式的解析器,提供api的方式提供
*****sun公司提供针对dom和sax解析器 jaxp
*****dom4j组织,针对dom和sax解析器 dom4j(实际开发)
****jdom组织,针对dom和sax解析器 jdom
18.jaxp的api的查看
***jaxp是javaSE的一部分
**jaxp解析器在jdk的java.xml.parsers包里面
---四个类;分别针对dom和sax解析使用的类
---dom:
DocumentBuilder:解析器类
----这个类是个抽象类,可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
----一个方法,可以解析xml,parse(xml路径)返回的是Document整个文档
---返回的document是一个接口,父接口是Node,在document找不到的方法在node中找
---在document中getElementsByTagName(String tagname)
----这个方法可以得到标签
-----返回结合NodeList
----在NodeList中有两个方法
----getlength()获取集合长度
---item(index)根据index获取元素
----createElement(String tagName)
----创建标签
---- createTextNode(String data)
---创建文本
---appendChild()
----把文本添加到节点
----getparentNode()
----获取父节点
----getTextContent()
----得到标签里面的内容
DocumentBuilderFactory:解析器工厂
----这个类是个抽象类,可以使用DocumentBuilderFactory.newInstance()方法
---sax:
SAXParser:解析类
SAXParserFactory:解析器工厂
19.使用jaxp来实现查询的操作
***查询xml中name的值
****操作步骤
/*
* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到所有的name元素
* 5.遍历NodeList集合
* */
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>lisi</name>
<age>30</age>
</p1>
</person>
package cn.itcast.jaxp;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class TestJaxp {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//查询所有name元素的值
/*
* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到所有的name元素
* 5.遍历NodeList集合
* */
//创建解析器工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder builder=builderFactory.newDocumentBuilder();
//解析xml返回document
Document document=builder.parse("src/person.xml");
//得到所有的name元素
NodeList list = document.getElementsByTagName("name");
//遍历NodeList
for(int i=0;i<list.getLength();i++) {
Node name1 = list.item(i); //得到每个name元素
//得到name元素里面的值
String s = name1.getTextContent();
System.out.println(s);
}
}
}
****查询person.xml中第一个name元素的值
***步骤:
/*
* 查询单个name元素的值
* 1.创建解析工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到所有name元素
* 5.使用集合的下标来获取具体的元素
* 6.得到具体的值使用getTextContent
* **/
public static void selectSin() throws Exception {
/*
* 查询单个name元素的值
* 1.创建解析工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到所有name元素
* 5.使用集合的下标来获取具体的元素
* 6.得到具体的值使用getTextContent
* **/
//创建解析工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//根据解析器工厂创建解析器
DocumentBuilder builder=builderFactory.newDocumentBuilder();
//解析xml返回document
Document document = builder.parse("src/person.xml");
//使用集合的下标来获取具体的元素
NodeList list= document.getElementsByTagName("name");
Node name1 = list.item(0);
//得到具体的值使用getTextContent
String string = name1.getTextContent();
System.out.println(string);
}
20.使用jaxp添加节点
******在第一个<p1></p1>末尾中添加<sex>nv</sex>
*****步骤:
/*
* 1.创建解析工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到第一个p1
* ---得到所有的p1,提供下标来得到
* 5.创建sex标签 createElement()
* 6.创建文本 createTextNode()
* 7.把文本添加到sex下面 appendChild
* 8.把sex添加到p1下面
* 9.回写xml
* **/
public static void addSex() throws Exception {
/*
* 1.创建解析工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到第一个p1
* ---得到所有的p1,提供下标来得到
* 5.创建sex标签 createElement()
* 6.创建文本 createTextNode()
* 7.把文本添加到sex下面 appendChild
* 8.把sex添加到p1下面
* 9.回写xml
* **/
//创建解析工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//根据解析器工厂创建解析器
DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();
//解析xml返回document
Document document = documentBuilder.parse("src/person.xml");
//得到第一个p1
NodeList list = document.getElementsByTagName("p1");
Node p1 = list.item(0);
//创建sex标签 createElement()
Element sex1 = document.createElement("sex");
//创建文本
Text text1 = document.createTextNode("nv");
//把文本添加到sex下面 appendChild
sex1.appendChild(text1);
//把sex添加到p1下面
p1.appendChild(sex1);
//回写xml
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
21.使用jaxp修改节点
***修改第一个p1下面的sex内容是nan
***步骤:
/* 1.创建解析工厂
* 2.根据解析工厂创建解析器
* 3.解析xml,返回document
* 4.得到sex item
* 5.修该sex里面的值setTextComtent
* 6.回写xml
* **/
public static void modifySex() throws Exception {
/* 1.创建解析工厂
* 2.根据解析工厂创建解析器
* 3.解析xml,返回document
* 4.得到sex item
* 5.修该sex里面的值setTextComtent
* 6.回写xml
* **/
//创建解析工厂
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//根据解析工厂创建解析器
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
//解析xml,返回document
Document document = documentBuilder.parse("src/person.xml");
//得到sex item
Node sex = document.getElementsByTagName("sex").item(0);
//修该sex里面的值setTextComtent
sex.setTextContent("nan");
//回写xml
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
22.使用jaxp删除节点
****删除person.xml中的sex节点
***步骤:
/*
* 1.创建解析工厂
* 2.根据解析工厂创建解析器
* 3.解析xml,返回document
* 4.获取sex标签
* 5.获取sex的父节点
* 6.根据父节点删除sex节点 removeChild()
* 7.回写xml
* **/
public static void delsex() throws Exception{
/*
* 1.创建解析工厂
* 2.根据解析工厂创建解析器
* 3.解析xml,返回document
* 4.获取sex标签
* 5.获取sex的父节点
* 6.根据父节点删除sex节点 removeChild()
* 7.回写xml
* **/
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("src/person.xml");
//获取sex标签
Node sex = document.getElementsByTagName("sex").item(0);
//获取sex的父节点
Node p1 = sex.getParentNode();
//根据父节点删除sex节点 removeChild()
p1.removeChild(sex);
//回写xml
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
23.使用jaxp来遍历节点
*****把person.xmlz中的所有元素名称打印出来
****步骤:
/* 1.创建解析工厂
* 2.根据解析工厂创建解析器
* 3.解析xml,返回document
*****使用递归来实现
* 4.得到根节点
* 5.得到根节点的子节点
* 6.得到根节点子节点的子节点
* **/
public static void listElement() throws Exception{
/* 1.创建解析工厂
* 2.根据解析工厂创建解析器
* 3.解析xml,返回document
*****使用递归来实现
* 4.得到根节点
* 5.得到根节点的子节点
* 6.得到根节点子节点的子节点
* **/
DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.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);
//继续得到node1的子节点(递归)
list1(node1);
}
}