框架基础-网络编程+Tomcat服务器+XML

一. 网络编程 - 理论

1.项目架构

  • 【Client】/S【Server - Service】 - 放在这个程序的用客户端

    ```
    用户需要单独安装客户端,客户端升级了用于需要重新更新
    

不能跨平台:不同的操作系统都需要相应版本的程序
性能和安全性:客户端与服务器直接交互
```

  • 【Browser】/S【Server - Service】 - 访问这个项目/程序的时候用浏览器

    使用浏览器充当客户端,用户不需要单独安装,浏览器一般不用更新
    都用的是浏览器
    户端与服务器不直接交互,而是通过http协议网络交互
    Java语言主要用来开发BS架构的软件
    

2.网络编程
在网络环境中,实现前端与后端数据的交互编写的程序
是一种思想,需要技术去实现。在Java中使用Socket-套接字来实现

3.网络通信

​ 网络编程中前后端要进行交互(前端传输数据到后端,后端响应数据给前端),这就叫网络通信

ip地址:1. 公网IP是全球唯一的,而内网IP只是在局域网内唯一,不同的局域网可以存在形同的内网IP2. 内网的IP地址是有交换机或路由器分配,公网的IP地址是由国际组织NIC(Network Information Center)负责统一分配的port端口号:1. 同一台机器上不能有两个程序使用同一个端口,会冲突。例如Java中报错端口号冲突:Address already in use2. 以后开发中最好记住我们用到过的常用软件的端口,避免我们知己设定端口的时候和他们冲突。例如tomcat-8080、mysql-3306、http协议-80、https-443网络协议UDP(User Datagram Protocol):用户数据包协议特点:无连接、不可靠通信、通信效率高。适用于视频直播、语音通话、游戏等业务TCP(Transmission Control Protocol):传输控制协议特点:无连接、不可靠通信、通信效率高。适用于视频直播、语音通话、游戏等业务

http协议:了解了之后会在以后的项目中方便程序员去排错
http协议:规定了服务器与浏览器之间数据的传递格式/规范
请求数据包:请求行(请求方式,请求地址,协议)、请求头、请求体(post请求的参数就放在这里)
响应数据包:响应行(协议、响应码200)、响应头、响应体(服务器响应给你的数据,html,图片,json…)

get请求与post请求的区别:突破口:get请求把请求参数放在地址栏
1.get请求不安全
2.数据大小有显示,大约4kb左右

域名

DNS域名解析器:用于解析域名并将其转换为相应的IP地址

二. Tomcat服务器 - 操作

tomcat是开源免费的web服务器(部署项目-服务器开启别人就可以访问),同时也是Servlet容器
1.安装 - 解压安装
2.目录结构
bin - 命令【启动,停止的命令】
conf - 配置信息
lib - jar包
logs - 日志
webapps - 保存项目的地方
3.开启tomcat
4.访问:http://可以省略掉 - 因为浏览器地址栏默认是是http://
完整的地址:
http://ip:port/项目名/资源名 - http://可以省略,如果port是80可以省略掉,如果项目名ROOT也可以省略掉,资源名是index也可以省略掉
5.演示了修改端口号 - 重启有效

6.演示项目(有页面的项目/web项目)部署 - 纯java项目
java项目:只能写java代码
前端js项目:写前端代码
web项目:既能写java代码,也能写前端代码
1. 拷贝项目到tomat的webapps下,改名
2. 启动tomcat
3. 访问:http://ip:port/项目名/资源名

三. XML - 代码

XML概述

XML:英文名称Extensible Markup Language,中文名称是可扩展标记语言,通过标签为数据赋予意义的行为称为标记,为标记定义规则的语言叫做标记语言

XML作用

- 传输数据
- 持久化数据
-  框架配置文件

XML语法

  1. XML声明

    XML声明或文档申明并非是一种标签,其用于指明是什么文档、版本号和编码(除了XML还有HTML)

    • version:指定XML编码,XML从创建之初到目前都是1.0版本

    • encoding:避免中文乱码,所以指定编码为UTF-8

注意:文档声明必须在XML文件的第一行,且每个XML文件必须有文档声明,XML文件必须以xml结尾

 <?xml version="1.0" encoding="UTF-8" ?>
  1. 标签命名规则

    • 标签名称只能以字母或下划线开头
    • 标签名称不能以xml/XML打头
    • 标签名称中间不能有空格
    • 标签名称之间不能使用冒号
  2. XML语法规则

    • XML中有且仅有一个根标签/元素:XML中的标签是以层级关系进行嵌套,内层如何嵌套都可以,但是外层必须有一个根标签

    • 必须有闭标签:

      • 第一种闭标签:此种标签无法编写文本以及其他标签,也被称为单标签 - xml基本没有,很少
      • 第二种闭标签:此种标签可以编写文本以及其他标签,也被称为双标签 - 开始标签与结束标签
    • 严格区分大小写:在XML中,标签的名称必须一致

    • 嵌套需要正确标签:在XML中可以进行标签嵌套,也就是双标签中定义标签

    • 文本内容和属性:在XML中,所有的标签也被称为元素。双标签中的内容称为文本。标签中可以进行属性定义,属性值必须加引号,多个属性以空格隔开

  3. 转义字符

    在文本中使用特殊字符会报错,所以我们需要使用转义字符进行代替,也可以使用转义标签进行代替

    &lt;	<	小于
    &gt;	>	大于
    &amp;	&	和号
    &apos;	'	单引号
    &quot;	"	引号转义标签,特殊符号会进行原样展示:<![CDATA[ 这是转义标签,特殊字符会进行原样展示 < > & '' "" ]]>
    

XML约束

  1. 约束概述

    XML约束:限制一个XML文件中标签、属性值、以及顺序等的使用,只能按照某种指定的规则书写。其作用如下:

    • 在编写XML时有提示
    • 写错会报错

    常见的约束有两种:DTD约束和Schema约束。DTD约束语法简单,Schema约束功能强大

  2. DTD约束

    DTD约束:Document Type Definition - 文档类型定义。DTD约束语法简单,可读性高,容易理解

Schema约束也叫做XSD约束:XML Schema Definition - XML模型定义,所以schema约束文件后缀是.xsd

一个XML文件中只能引用一个DTD约束,但是一个XML文件可以引用多个schema约束。Schema约束比DTD约束功能更加强大,但是编写更加复杂。

DOM模型

  1. DOM:Document Object Mode文档对象模型

    当结构化文档XML/HTML加载到内存中会形成一个一个的对象,而且这些对象会根据文档的层级关系虚拟一个树型机构的DOM模型,编译开发者进行解析(CRUD操作)

DDocument文档(XML文档) : 磁盘上面的xml文件
OObject对象(内存中对象) : 把xml文件封装成对象
MModel模型:xml文件与对象对应关系模型
  1. DOM关键字
Document文档文档对象,代表整个XML文档
Node节点Node节点,也叫做Node对象,一切都是节点:元素,属性,文本
Element元素元素/标签节点
Attribute属性属性节点
Text文本文本节点

XML解析(重点)

  1. 概述

XML解析:就是在Java代码中通过一些技术去操作XML,因为通常来说我们都需要对XML的数据进行CRUD,特别是框架中XML作为配置文件,我们填写了配置文件,框架要进行读取那么就一定需要某些技术进行XML解析

XML解析四大技术

  • DOM解析:由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点进行操作。不仅可以对文档进行查询,还可以进行增删改。但对大型XML文件效果可能会不理想

  • SAX解析:SAX不用将整个文档加载到内存,基于事件驱动的API,他按照xml文件的顺序一步一步的来解析,解析速度快,但是无法对文档内容进行增删改

  • JDOM解析:JDOM具有树的遍历,又有SAX的java规则。JDOM是处理XML的纯JAVA-API,API大量使用了Collections类,且JDOM仅使用具体类而不使用接口

  • Dom4J解析:Dom4J是一个简单的开源库,用于处理XML、 XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM、SAX、JAXP。Dom4J是目前在XML解析方面是最优秀的,它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理

  1. Dom4J学习网站
  • Dom4j官网:https://dom4j.org/
  • XML解析学习网址:http://www.51gjie.com/java/736.html
  1. 增删改查

    新增数据

    /**     * @Description: 新增xml文档     * @Author: Neuronet     * @Date: 2023/5/7 14:06     * @Return:**/@Testpublic void testAdd() throws Exception{    // 1.创建一个文档对象    Document document = DocumentHelper.createDocument();    // 2.创建一个根标签    Element users = document.addElement("users");    // 3.从根节点中创建两个user标签    Element userOne = users.addElement("user");    Element userTwo = users.addElement("user");​    // 4.给user标签设置属性    userOne.addAttribute("id", "1");    userTwo.addAttribute("id", "2");​    // 5.添加user标签的子标签    userOne.addElement("name").setText("Neuronet");    userOne.addElement("age").setText("18");    userOne.addElement("sex").setText("男");​    userTwo.addElement("name").setText("李四");    userTwo.addElement("age").setText("8");    userTwo.addElement("sex").setText("男");​    // 6.生成xml文件    // 6.1.创建dom4j美化xml输出格式的对象    OutputFormat outputFormat = OutputFormat.createPrettyPrint();    // 6.2.指定生成的文件路径和名称    XMLWriter xmlWriter = new XMLWriter(new FileWriter(new File("D:\\IdeaWorkspace\\xml-demo\\src\\cn\\itsource\\dom4j\\user.xml")), outputFormat);    // 6.3.根据document对象生成xml    xmlWriter.write(document);    // 6.4.关闭资源    xmlWriter.close();}
    

    修改数据

      /*** @Description: 测试修改XML文档* @Author: Neuronet* @Date: 2023/5/7 14:45* @Return:**/@Testpublic void testUpdate() throws Exception{// 1.通过SAXReader对象读取xmlSAXReader saxReader = new SAXReader();Document document = saxReader.read("D:\\IdeaWorkspace\\xml-demo\\src\\cn\\itsource\\dom4j\\user.xml");// 2.获取到根标签,也就是usersElement rootElement = document.getRootElement();// 3.获取到所有user标签List<Element> user = rootElement.elements("user");// 4.修改李四的年龄为20岁for (Element element : user) {// 4.1.获取到user标签下name标签的文本值,判断是否是李四的user对象if ("李四".equals(element.elementText("name"))){// 4.3.根据名称获取到age标签,修改文本内容为20element.element("age").setText("20");}}// 5.生成xml文件// 5.1.创建dom4j美化xml输出格式的对象OutputFormat outputFormat = OutputFormat.createPrettyPrint();// 5.2.指定生成的文件路径和名称XMLWriter xmlWriter = new XMLWriter(new FileWriter(new File("D:\\IdeaWorkspace\\xml-demo\\src\\cn\\itsource\\dom4j\\user.xml")), outputFormat);// 5.3.根据document对象生成xmlxmlWriter.write(document);// 5.4.关闭资源xmlWriter.close();}
    

    获取数据

       /*** @Description: 获取标签属性* @Author: Neuronet* @Date: 2023/5/7 14:46* @Return:**/@Testpublic void testGetAttr() throws Exception{// 1.通过SAXReader对象读取xmlSAXReader saxReader = new SAXReader();Document document = saxReader.read("D:\\IdeaWorkspace\\xml-demo\\src\\cn\\itsource\\dom4j\\user.xml");// 2.获取到根标签,也就是usersElement rootElement = document.getRootElement();// 3.获取到所有user标签List<Element> user = rootElement.elements("user");// 4.遍历获取所有user标签的属性for (Element element : user) {Attribute id = element.attribute("id");System.out.println(id.getText());}}
    

    删除数据

      /*** @Description: 删除标签* @Author: Neuronet* @Date: 2023/5/7 14:46* @Return:**/@Testpublic void testDelElement() throws Exception{// 1.通过SAXReader对象读取xmlSAXReader saxReader = new SAXReader();Document document = saxReader.read("D:\\IdeaWorkspace\\xml-demo\\src\\cn\\itsource\\dom4j\\user.xml");// 2.获取到根标签,也就是usersElement rootElement = document.getRootElement();// 3.获取到所有user标签List<Element> user = rootElement.elements("user");// 4.删除李四对应的user标签for (Element element : user) {// 4.1.判断此user标签是否是李四if ("李四".equals(element.elementText("name"))){// 4.2.使用父标签对象删除子标签rootElement.remove(element);}}// 5.生成xml文件// 5.1.创建dom4j美化xml输出格式的对象OutputFormat outputFormat = OutputFormat.createPrettyPrint();// 5.2.指定生成的文件路径和名称XMLWriter xmlWriter = new XMLWriter(new FileWriter(new File("D:\\IdeaWorkspace\\xml-demo\\src\\cn\\itsource\\dom4j\\user.xml")), outputFormat);// 5.3.根据document对象生成xmlxmlWriter.write(document);// 5.4.关闭资源xmlWriter.close();}
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang --gin+websocket实现指定的数据点推送

这里提到的endpointId是一个负载了数据的逻辑点&#xff0c;就像一根水管的出口&#xff0c;有新数据来就会根据后端记录的endpointId推送到用户正在查看的endpointId。用户没有正在查看的endpoint就不会有新数据推送。这里如果如果对endpoint加上权限就相当于实现对实时数据的…

8个 Python 开发者必备的 PyCharm 插件

这8个顶级插件保证了更快、更轻松、更愉悦的开发过程。 在 PyCharm 插件列表中&#xff0c;我们发现了几个瑰宝插件&#xff0c;它们各自以独特的方式帮助开发者快速、简便、愉悦地开发。 今天我就给大家逐个介绍它们。 1. Key Promoter X 【下载链接】&#xff1a;https://…

01-15网络编程-XML

网络编程Web服务器XML 网络编程 项目架构&#xff1a; C[Client] /S[Server- Service] -访问这个程序时用客户端 缺点&#xff1a; 1.用户需要单独安装客户端&#xff0c; 2.客户端升级了用于需要重新更新不能跨平台: 3.不同的操作系统都需要相应版本的程序 优点&#xff1a;…

AtCoder abc336 A~D题解

A. 题目翻译&#xff1a; 对于正整数 X X X 级别的龙串&#xff0c; X X X 是长度为 ( X 3 ) (X3) (X3) 的字符串&#xff0c;由按此顺序排列的 o、n 和 g 的一次L、 X X X次出现形成。 你得到一个正整数 N N N。打印 N N N 级的龙串。 分析 按题目要求做即可……&am…

Openlayer【四】—— 控件

控件 控件是一个可见的小部件&#xff0c;其 DOM 元素位于 屏幕。它们可以涉及用户输入&#xff08;按钮&#xff09;&#xff0c;也可以仅供参考; 位置是使用 CSS 确定的。默认情况下&#xff0c;它们位于 容器&#xff0c;但可以使用 任何外部 DOM 元素。 其中ol/control是…

GO基础进阶篇 (十二)、反射

什么是反射 Go语言中的反射是指在程序运行时检查程序的结构&#xff0c;比如变量的类型、方法的签名等。Go语言的反射包是reflect。通过反射&#xff0c;你可以动态地检查类型信息、获取字段和方法、调用方法等。 反射可以在运行时动态获取变量的各种信息&#xff0c;比如变量…

linux系统nginx工具的一些应用

nginx高级应用 虚拟目录监控模块配置文件创建用户名密码客户端访问 限制传输速度&#xff08;服务层&#xff09; nginx配置文件中的每个语句要以 ; 结尾 虚拟目录 配置文件中的server块中编辑&#xff1a;location /test {alias /usr/share/nginx/html; //映射的是/usr…

定时器中断控制的独立式键盘扫描实验

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit S1P1^4; //将S1位定义为P1.4引脚 sbit S2P1^5; //将S2位定义为P1.5引脚 sbit S3P1^6; //将S3位定义为P1.6引脚 sbit S4P1^7; //将S4位定义为P1.7引脚 unsigned char keyval; /…

知识笔记(八十)———链式语句中join用法

join通常有下面几种类型&#xff0c;不同类型的join操作会影响返回的数据结果。 INNER JOIN: 等同于 JOIN&#xff08;默认的JOIN类型&#xff09;,如果表中有至少一个匹配&#xff0c;则返回行LEFT JOIN: 即使右表中没有匹配&#xff0c;也从左表返回所有的行RIGHT JOIN: 即使…

50天精通Golang(第18天)

web开发介绍、iris框架安装、HTTP请求和返回、Iris路由处理 一 Web项目开发介绍及实战项目介绍 1.1 引言 本系列课程我们将学些Golang语言中的Web开发框架Iris的相关知识和用法。通过本系列视频课程&#xff0c;大家能够从零到一经历一个完整项目的开发&#xff0c;并在课程…

[树莓派]给树莓派装pyinstaller环境

安装&#xff1a; sudo pip3 install pyinstaller 但是打包后会发现报错&#xff1a; Fatal error: PyInstaller does not include a pre-compiled bootloader for your platform. For more details and instructions how to build the bootloader see https://pyinstaller.…

Golang语言switch case

Golang语言使用switch语句可方便地对大量的值进行条件判断。 练习&#xff1a;判断文件类型,如果后缀名是.html输入text/html, 如果后缀名.css 输出text/css ,如果后缀名是.js 输出text/javascript Go语言规定每个switch只能有一个default分支。 extname : ".a"swit…

【栈】Leetcode 496 下一个更大元素I

【栈】Leetcode 496 下一个更大元素I 解法1 两个单调栈解法2 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法1 两个单调栈 两个栈进行操作&#xff0c;一个栈用来遍历寻找&#xff0c;一个栈用来保留 将nums2中的元素…

NLP论文阅读记录 - 2021 | WOS 利用 ParsBERT 和预训练 mT5 进行波斯语抽象文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提三.本文方法A. 序列到序列 ParsBERTB、mT5 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Leveraging ParsBERT and Pretrained …

1.6 面试经典150题 - 买卖股票的最佳时机

买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…

鸿蒙开发之组合手势

当我们需要支持多个手势的时候&#xff0c;可以通过GestureGroup来实现&#xff0c;如下实现了同时支持Tap和Pan手势 import Prompt from system.prompt Entry Component struct OfficialGestureGroupPage {State message: string Hello Worldbuild() {Column() {Column() {T…

STM32WL用户手册学习

介绍 STM32Cube是意法半导体的原创产品&#xff0c;通过减少开发工作量、时间和成本来显著提高开发人员的生产力。STM32Cube涵盖了整个STM32产品组合。 STM32Cube包括&#xff1a; 一套用户友好的软件开发工具&#xff0c;涵盖项目开发从设计到生产&#xff0c;其中&#xf…

算法第十九天-二叉搜索树节点最小距离

二叉搜索树节点最小距离 题目要求 解题思路 今天题目重点&#xff1a; 1.二叉搜索树&#xff08;BST&#xff09; 2.任意两个不同节点 遇到二叉搜索树&#xff0c;立即想到这句话&#xff1a;[二叉搜索树&#xff08;BST&#xff09;的中序遍历是有序的]。这是解决所有二叉搜…

1.1 面试经典 150 题-合并两个有序数组

合并两个有序数组 方法一&#xff1a;先合并再排序 class Solution:def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:"""Do not return anything, modify nums1 in-place instead."""# 先合并for i in range…

全网最细RocketMQ源码四:消息存储

看完上一章之后&#xff0c;有没有很好奇&#xff0c;生产者发送完消息之后&#xff0c;server是如何存储&#xff0c;这一章节就来学习 入口 SendMessageProcessor.processRequest private CompletableFuture<RemotingCommand> asyncSendMessage(ChannelHandlerCont…