1.表单提交的方式(引入)
***通过type=“submit”
***通过type="button" onclick=""来实现
***通过超链接来实现
***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="提交" onclick="form1();"/> <form> <hr/> <a href="h.html?username=123456">ccccccc</a> <hr/> <input type="text" id="id1" name="text1" value="input" onfocus="focus2();" onblur="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); } }