java-web:xml简介-标签-规范-用途-xml与html区别-内容读取方式;解析-dom、Sax(了解)、dom4j、Xpath;http协议-B/S架构-请求和返回数据包-请求方式-响应码

1. xml简介

xml: (Extensible Markup Language)可扩展标记语言


2. xml中的标签

  • 单标签

    <标签名称/>
    
  • 双标签

    <标签名称></标签名称>
    

3. xml的规范

  • xml是区分大小写

  • xml的标签名称可以是任意的

  • xml单标签必须写 /

  • xml的标签名称一般建议使用小写英文

  • xml的开头必须是声明部分

    <?xml version="1.0" encoding="utf-8" ?>
    
  • xml的根标签必须是唯一的


4. xml的用处

  • 用于互联网通信中的数据传输(一般4,5年前都这样做,现在都使用json),无效数据太多了
  • 可以用于项目的配置文件

5. 在idea中编写xml

6. xml与html的区别在哪

html就是加了html约束的xml

Hyper Text Markup Language html


7. xml的约束(了解)

  • dtd
    在这里插入图片描述

  • schema


8. xml的内容读取方式

  • 使用原始的io流读取文件内容
  • 使用jdk自带的解析xml的方式
    • dom解析(重要)
    • sax解析(了解)
  • 使用第三方优秀的解析方式来解析xml(重要)
package com.tony.xml.demo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * 使用IO流读取文件内容
 */

public class IoOps {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("books.xml");

        BufferedReader bufferedReader = new BufferedReader(fileReader);

        String line = null;
        StringBuffer sb = new StringBuffer();
        while ((line = bufferedReader.readLine())!=null){
            sb.append(line);
        }
        System.out.println(sb.toString());
    }
}

9. 使用dom解析xml

dom方式解析xml是把xml加载到内存中形成树结构;

好处: 便于理解,解析速度快

弊端: 当文档过大时会出现内存溢出

package com.tony.xml.demo;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;

/**
 * 使用Dom解析xml
 */
public class DomOps {
    public static void main(String[] args) throws Exception {
        File file = new File("books.xml");
        //1. 创建dom解析器工厂
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        //2. 使用解析器工厂创建解析器
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        //3. 使用解析器来解析xml
        Document document = documentBuilder.parse(file);
        //4. 获取根节点
        Element rootElement = document.getDocumentElement();
        //5. 获取子节点或者属性
        NodeList bookNodes = rootElement.getChildNodes();
        //6. 遍历所有的books的子节点
        for (int i = 0; i < bookNodes.getLength(); i++) {
            //7. 筛选出元素节点(<book></book>)
            if (bookNodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
                //7.1 我们在这完全就可以把Node--转换为-->Element
                Element bookElement = (Element) bookNodes.item(i);
                //7.2 获取book元素的id属性
                System.out.println(bookElement.getAttribute("id"));
                //7.3 获取book的所有子节点
                NodeList bookChildNodes = bookElement.getChildNodes();
                //7.4 遍历所有的book的子节点
                for (int j = 0; j < bookChildNodes.getLength(); j++) {
                    //7.4.1 筛选出元素节点  <name></name>   <author></author>  <price></price>
                    if (bookChildNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
                        //7.4.1.1 如果执行到这里,则说明Node是  Element(元素)
                        Element infoElement = (Element) bookChildNodes.item(j);
                        System.out.print(infoElement.getNodeName());
                        //7.4.1.2  获取name|author|price的子节点,即name  author   price中的文本
                        Node textNode = infoElement.getFirstChild();
                        //7.4.1.3  获取文本节点的值
                        System.out.println("=>" + textNode.getNodeValue());
                    }
                }
            }
        }
    }
}

10.Sax解析(了解)

基于事件驱动的模型进行xml解析;

好处:不会出现内存溢出

弊端:不容易理解

    package com.xzy;

    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;

    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    import java.io.File;

    /**
     * Sax解析
     */
    public class SaxOps {
        public static void main(String[] args) throws Exception {
            File file = new File("books.xml");
            //1. 创建sax解析器工厂
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            //2. 使用解析器工厂创建sax解析器
            SAXParser saxParser = saxParserFactory.newSAXParser();

            //3. 使用解析器解析xml
            saxParser.parse(file, new DefaultHandler() {
                @Override
                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    System.out.println("标签开始解析:" + qName);
                    if (qName.equals("book")) {
                        System.out.println(attributes.getValue("id"));
                    }

                }

                @Override
                public void endElement(String uri, String localName, String qName) throws SAXException {
                    System.out.println("标签结束解析:" + qName);
                }


                @Override
                public void characters(char[] ch, int start, int length) throws SAXException {

                    System.out.println("内容:" + new String(ch, start, length));
                }
            });


        }
    }

11. Dom解析与Sax解析的区别

  • dom解析是把整合xml文件加载到内存中,如果文件过大,可能会出现内存溢出的问题
  • sax解析是基于事件驱动模型的,不会把整个文档全部加载到内存中,不会出现内存溢出
  • dom适合解析小xml文件,sax适合解析大的xml文件;
  • 一般没有特殊需求选择dom

12. Dom4j解析xml

  • dom4j是一个优秀的开源项目
  • 我们在实际的商业应用中一般都会使用dom4j解析xml
package com.tony.xml.demo;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;
/**
 * 使用Dom4j解析xml
 */
public class Dom4jOps {
    public static void main(String[] args) throws DocumentException {
        //1.创建Dom4j的解析器
        SAXReader saxReader = new SAXReader();
        //2.解析xml
        Document document = saxReader.read(new File("books.xml"));
        //3.获取根节点
        Element rootElement = document.getRootElement();
        //4.获取子节点
        List bookElementList = rootElement.elements("book");
        //5.遍历每一个book元素
        bookElementList.forEach(bookElementNode -> {
            //5.1强制类型转换
            Element bookElement = (Element) bookElementNode;
            //5.2获取属性
            System.out.println(bookElement.attributeValue("id"));
            //5.3获取book元素下面的name元素
            Element nameElement = bookElement.element("name");
            //5.4获取name元素的内容
            System.out.println(nameElement.getStringValue());
            //5.5获取book元素下面的author元素
            Element authorElement = bookElement.element("author");
            //5.6获取author元素的内容
            System.out.println(authorElement.getStringValue());
            //5.7获取book元素下面的price元素
            Element priceElement = bookElement.element("price");
            //5.8获取price元素的内容
            System.out.println(priceElement.getStringValue());
        });
    }
}


13. Xpath解析xml

/:
表达式的开头:  代表文档的/
不是表达式的开头: 代表 "子"
//:
表达式的开头:  代表任意位置
不是表达式的开头: 代表 "后代"

@属性名称:  获取属性节点
text();获取文本节点
package com.tony.xml.demo;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.io.File;
/**
 * 使用Xpath解析xml
 */
public class XpathOps {
    public static void main(String[] args) throws DocumentException {
        //1.创建解析器
        SAXReader saxReader = new SAXReader();
        //2.使用解析器解析文档
        Document document = saxReader.read(new File("books.xml"));

        Node node1 = document.selectSingleNode("/books/book[@id=100]");
        System.out.println(node1.getStringValue());

        Node node2 = document.selectSingleNode("/books/book[@id=100]/price/text()");
        System.out.println(node2.getStringValue());
    }
}

14.其他的xml解析方式

  • jdom解析
  • pull解析

15. B/S架构在这里插入图片描述

服务器 = 服务器软件+高配主机

数据库服务器 = mysqlserver+主机


16. http协议

请求数据包 = 请求行+请求头+请求实体

响应数据包 = 响应行+响应头+响应实体
在这里插入图片描述
在这里插入图片描述

请求数据包:

GET http://172.18.0.4/a70.htm?mv6=2001:0da8:4004:0255:e01d:8e51:d6b3:d954&url=http://www.xupt.edu.cn/ HTTP/1.1
Host: 172.18.0.4
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
请求方式 请求url 协议的版本
key1: value1
key2: value2
key3: value3

请求实体(get请求不能有请求实体)

响应数据包

HTTP/1.1 200 OK
Server: DrcomServer1.0
Connection: keep-alive
Accept-Ranges: bytes
Content-Type: text/html
Cache-Control: no-cache
Content-Length: 4359

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta id="viewport" name="viewport" content="target-densitydpi=device-dpi,width=640px,user-scalable=1">
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE">
<title>上网登录窗</title>
<!--Dr.COMWebLoginID_0.htm-->
<link rel="stylesheet" type="text/css" href="b82.css" />

<script type="text/javascript" src="a42.js"></script>

<script>
document.write('<script language=javascript src="a41.js?version=1.4_'+(new Date()).valueOf()+'"><\/script>');
document.write('<script language=javascript src="'+window.location.protocol + '//' + window.location.hostname + ':801/eportal/extern/xupt-20171115/config.js?version=1.4_'+(new Date()).valueOf()+'"><\/script>');
</script>

<script language="javascript">
sv=1;sv1=0;v6='http://[2001:da8:4004::998:4]:9002/v6                   ';myv6ip='                                       ';v4serip='172.18.0.4'     ;m46=0;v46ip='222.24.3.224'                           ;
vid=0   ;mip=222024003224;Gno=0000;vlanid="0"   ;AC="";                          ipm="ac120004";ss1="000d48466603";ss2="0000";ss3="de1803e0";ss4="000000000000";ss5="222.24.3.224"   ;ss6="172.18.0.4"     ;timet=00000000000;
osele=0;//1=不弹窗
domain='[2001:da8:4004::998:4]';// //

var programUrl = window.location.protocol + "//" + window.location.hostname + ":801/eportal/extern/xupt-20171115/";
newComm.setArgsCookies(programUrl,vlanid,ss5);

//判断pc/手机
if(normalFun.getTermType() == 2){
    newComm.setNessArg('mobile');
}else{
    newComm.setNessArg('pc');
}
newComm.setNessJs();

//广告统计设置
hnaSetAdCount('1000', ss4, '', ss5, ss4);
</script>
</head>

<body>
</body>
</html>
<script type="text/javascript">
$(function(){
	newComm.setNessSett();

	//自动登录初使化
	autoLoginObj.autoLogin();

	// 检查是否保存密码
	savePassword.check();

	//我已经阅读声明
	checkIReadObj.initialize();

	//公共账号登录的配置
	commonAccount.initialize();

	//发送短信
	smsSend.initialize();

	//HNA 切换 a70 与 a30
	qrCode.initJump();

	//自定义无感知初始化
	checkPerceivebj.initialize();

	//微信认证
	if(normalFun.getQueryString('wechat')==1){
		document.body.style.display='none';
		//portal
		if(newComm.loginMethod == 1){
			var GoTo = window.location.protocol + "//" + window.location.hostname+":801/eportal/?c=ACSetting&a=Login"+"&wlanuserip="+normalFun.getQueryString('wlanuserip')+"&wlanacip="+normalFun.getQueryString('wlanacip')+"&wlanacname="+normalFun.getQueryString('wlanacname')+"&port="+window.location.port+"&iTermType="+normalFun.getTermType()+"&mac="+normalFun.getCurrMAC()+"&ip="+normalFun.getCurrIP()+"&redirect="+normalFun.getQueryString('redirect')+"&session="+normalFun.getQueryString('session')+"&wechat_version="+com_version+"&commonUsername="+com_username+"&commonPassword="+com_password;
			//window.location = GoTo;
			document.write("<form name='wxform' method='post' action='"+GoTo+"'>");
			document.write("<input type='hidden' name='DDDDD' value='"+normalFun.getQueryString('DDDDD')+"' >");
			document.write("<input type='hidden' name='upass' value='"+normalFun.getQueryString('upass')+"' >");
			document.write("<input type='hidden' name='R1' value='0' >");
			document.write("<input type='hidden' name='R2' value='' >");
			document.write("<input type='hidden' name='R6' value='1' >");
			document.write("<input type='hidden' name='para' value='00' >");
			document.write("<input type='hidden' name='0MKKey' value='123456' >");
			document.write("</form>");
			document.wxform.submit();
		}else{
			GoTo = 'http://'+window.location.hostname+'/login?DDDDD='+normalFun.getQueryString('DDDDD')+'&upass='+normalFun.getQueryString('upass')+'&0MKKey=login';
			window.location=GoTo;
		}
	}
	//mac_guest登录
	   $('[name=mac_guestlogin]').on('click', function () {
		    var mac = normalFun.getQueryString('ss4') || (("undefined" != typeof ss4)?ss4:"000000000000");
      
            if(mac.indexOf('-')>=0)mac = mac.replace(/-/g,'');
            if(mac.indexOf(':')>=0)mac = mac.replace(/:/g,'');
            
				window.location = 'http://'+window.location.hostname+'/login?DDDDD='+mac+"_guest"+'&upass='+"123456"+'&0MKKey=login';
			
    });
			
  //v6参数加载
	on_load();
	
});
</script>
http协议的版本 响应码 响应信息
key1: value1
key2: value2
key3: value3

响应实体

17. http的请求方式

  • get
  • post
  • put
  • delete
  • head
  • option

18. Http协议的版本

  • http1.0
  • http1.1

19. http响应码

200 OK : 请求被成功的处理并且正确的返回
302 Found : 一般与响应头Location配合使用实现"请求重定向"
304 Not Modified : 一般用来实现缓存
404 Not Found:  找不到资源
405 Method Not Allowed: 请求不允许
500 Internal Server Error :服务端代码错误
502 Bad Gateway: 坏请求
504 Gateway Time-out : 网络超时
505 HTTP Version not supported : 协议版本不匹配
....
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值