1.项目架构
【Client】/S【Server - Service】 - 放在这个程序的用客户端
```
用户需要单独安装客户端,客户端升级了用于需要重新更新
不能跨平台:不同的操作系统都需要相应版本的程序
性能和安全性:客户端与服务器直接交互
```
【Browser】/S【Server - Service】 - 访问这个项目/程序的时候用浏览器
使用浏览器充当客户端,用户不需要单独安装,浏览器一般不用更新
都用的是浏览器
户端与服务器不直接交互,而是通过http协议网络交互
Java语言主要用来开发BS架构的软件
2.网络编程
在网络环境中,实现前端与后端数据的交互编写的程序
是一种思想,需要技术去实现。在Java中使用Socket-套接字来实现
3.网络通信
? 网络编程中前后端要进行交互(前端传输数据到后端,后端响应数据给前端),这就叫网络通信
ip地址:
1. 公网IP是全球唯一的,而内网IP只是在局域网内唯一,不同的局域网可以存在形同的内网IP
2. 内网的IP地址是有交换机或路由器分配,公网的IP地址是由国际组织NIC(Network Information Center)负责统一分配的
port端口号:
1. 同一台机器上不能有两个程序使用同一个端口,会冲突。例如Java中报错端口号冲突:Address already in use
2. 以后开发中最好记住我们用到过的常用软件的端口,避免我们知己设定端口的时候和他们冲突。例如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是开源免费的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:英文名称Extensible Markup Language,中文名称是可扩展标记语言,通过标签为数据赋予意义的行为称为标记,为标记定义规则的语言叫做标记语言
- 传输数据
- 持久化数据
- 框架配置文件
XML声明
XML声明或文档申明并非是一种标签,其用于指明是什么文档、版本号和编码(除了XML还有HTML)
version:指定XML编码,XML从创建之初到目前都是1.0版本
encoding:避免中文乱码,所以指定编码为UTF-8
注意:文档声明必须在XML文件的第一行,且每个XML文件必须有文档声明,XML文件必须以xml结尾
<?xml version="1.0" encoding="UTF-8" ?>
标签命名规则
XML语法规则
XML中有且仅有一个根标签/元素:XML中的标签是以层级关系进行嵌套,内层如何嵌套都可以,但是外层必须有一个根标签
必须有闭标签:
严格区分大小写:在XML中,标签的名称必须一致
嵌套需要正确标签:在XML中可以进行标签嵌套,也就是双标签中定义标签
文本内容和属性:在XML中,所有的标签也被称为元素。双标签中的内容称为文本。标签中可以进行属性定义,属性值必须加引号,多个属性以空格隔开
转义字符
在文本中使用特殊字符会报错,所以我们需要使用转义字符进行代替,也可以使用转义标签进行代替
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
转义标签,特殊符号会进行原样展示:<![CDATA[ 这是转义标签,特殊字符会进行原样展示 < > & '' "" ]]>
约束概述
XML约束:限制一个XML文件中标签、属性值、以及顺序等的使用,只能按照某种指定的规则书写。其作用如下:
常见的约束有两种:DTD约束和Schema约束。DTD约束语法简单,Schema约束功能强大
DTD约束
DTD约束:Document Type Definition - 文档类型定义。DTD约束语法简单,可读性高,容易理解
Schema约束也叫做XSD约束:XML Schema Definition - XML模型定义,所以schema约束文件后缀是.xsd
一个XML文件中只能引用一个DTD约束,但是一个XML文件可以引用多个schema约束。Schema约束比DTD约束功能更加强大,但是编写更加复杂。
DOM:Document Object Mode文档对象模型
当结构化文档XML/HTML加载到内存中会形成一个一个的对象,而且这些对象会根据文档的层级关系虚拟一个树型机构的DOM模型,编译开发者进行解析(CRUD操作)
D | Document | 文档(XML文档) : 磁盘上面的xml文件 |
---|---|---|
O | Object | 对象(内存中对象) : 把xml文件封装成对象 |
M | Model | 模型:xml文件与对象对应关系模型 |
Document文档 | 文档对象,代表整个XML文档 |
---|---|
Node节点 | Node节点,也叫做Node对象,一切都是节点:元素,属性,文本 |
Element元素 | 元素/标签节点 |
Attribute属性 | 属性节点 |
Text文本 | 文本节点 |
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 支持以及用于大文档或流化文档的基于事件的处理
增删改查
新增数据
/** * @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();}
//需求2:向xml中新增一个学员{“id”:4,“name”:“阿狸”,“age”:20,“address”,“动物园”}
@Test
public void test2() throws Exception{
//将classes.xml加载到内存中
SAXReader reader = new SAXReader();
//相对路径从项目开始写
Document document = reader.read(“xml/classes.xml”);
//获取根元素
Element classes = document.getRootElement();
Element student = classes.addElement("student");
student.addAttribute("id","4");
student.addElement("name").setText("阿狸");
student.addElement("age").setText("20");
student.addElement("address").setText("动物园");
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("xml/classes.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
修改数据
```xml
/**
* @Description: 测试修改XML文档
* @Author: Neuronet
* @Date: 2023/5/7 14:45
* @Return:
**/
@Test
public void testUpdate() throws Exception{
// 1.通过SAXReader对象读取xml
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("D:\\IdeaWorkspace\\xml-demo\\src\\cn\\itsource\\dom4j\\user.xml");
// 2.获取到根标签,也就是users
Element 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标签,修改文本内容为20
element.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对象生成xml
xmlWriter.write(document);
// 5.4.关闭资源
xmlWriter.close();
}
//需求3:修改xml中阿狸的年龄
@Test
public void test3() throws Exception{
//将classes.xml加载到内存中
SAXReader reader = new SAXReader();
//相对路径从项目开始写
Document document = reader.read("xml/classes.xml");
//获取根元素
Element classes = document.getRootElement();
List<Element> elements = classes.elements();
Element student = elements.get(3);
Element age = student.element("age");
age.setText("40");
/*for (Element student : elements) {
List<Element> sons = student.elements();//name,age,address
for (Element son : sons) {
if(son.getName().equals("name") && son.getText().equals("阿狸")){
//获取当前元素的父元素【student】,再获取student里面的age
Element age = son.getParent().element("age");
age.setText("30");
break;
}
}
}*/
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("xml/classes.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}
获取数据
/**
* @Description: 获取标签属性
* @Author: Neuronet
* @Date: 2023/5/7 14:46
* @Return:
**/
@Test
public void testGetAttr() throws Exception{
// 1.通过SAXReader对象读取xml
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("D:\\IdeaWorkspace\\xml-demo\\src\\cn\\itsource\\dom4j\\user.xml");
// 2.获取到根标签,也就是users
Element 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());
}
}
//需求1:把classes.xml的所有数据获取出来
@Test
public void test1() throws Exception{
//将classes.xml加载到内存中
SAXReader reader = new SAXReader();
//相对路径从项目开始写
Document document = reader.read("xml/classes.xml");
//获取文档的根元素classes
Element rootElement = document.getRootElement();
//获取跟元素下所有的子元素
List<Element> list = rootElement.elements(); //3个student
//遍历
for (Element student : list) {
//获取每一个student的id属性值
String id = student.attributeValue("id");
System.out.println(id);
//获取student的所有子元素
List<Element> sons = student.elements();
//遍历
for (Element son : sons) {
//获取子元素的文本
String content = son.getTextTrim();
System.out.println(content);
}
System.out.println("===============================");
}
}
删除数据
/**
* @Description: 删除标签
* @Author: Neuronet
* @Date: 2023/5/7 14:46
* @Return:
**/
@Test
public void testDelElement() throws Exception{
// 1.通过SAXReader对象读取xml
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("D:\\IdeaWorkspace\\xml-demo\\src\\cn\\itsource\\dom4j\\user.xml");
// 2.获取到根标签,也就是users
Element 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对象生成xml
xmlWriter.write(document);
// 5.4.关闭资源
xmlWriter.close();
}
//需求4:删除xml中的阿狸
@Test
public void test4() throws Exception{
//将classes.xml加载到内存中
SAXReader reader = new SAXReader();
//相对路径从项目开始写
Document document = reader.read("xml/classes.xml");
//获取根元素
Element classes = document.getRootElement();
//获取根元素下所有的子元素
List<Element> students = classes.elements();
//遍历
for (Element student : students) {
//获取student元素下的name元素
Element name = student.element("name");
//name的内容是否是"阿狸"
if(name.getText().equals("阿狸")){
//通过根元素删除掉当前student元素
classes.remove(student);
}
}
//创建一个输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
//再使用输出流将文档按照指定的格式输出
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("xml/classes.xml"), format);
xmlWriter.write(document);
xmlWriter.close();
}