动态代理,XML,Dom4j

news2024/11/30 10:30:21

文章目录

  • 动态代理
  • 概述
    • 特点
    • 代码实现
    • 实现的关键步骤
    • 优点
  • XML
    • 概述
    • 作用
    • 编写第一个XML文件
    • 组成
      • 声明
      • 元素(标签、标记)
      • 属性
      • 注释
      • 转义字符[实体字符
      • 字符区(了解)
    • 约束
      • DTD约束
      • Schema约束
      • 名称空间
  • Dom4j
    • XML解析
    • 解析方式和解析器
      • 解析方式
      • 解析器
      • Snipaste_2024-04-17_21-22-44.png
      • <br />解析器开发包
    • 基本使用
      • DOM解析原理及结构模型
      • 常用的方法
    • 使用xpath解析xml文件
      • 介绍
      • 使用步骤
      • Node接口中存在的方法
      • 路径表达式

动态代理

概述

提供一个代理的对象,有了代理对象后,当访问某个方法时,会被代理对象拦截(拦截后可以对方法进行前增强,后增强)[代理对象不会破坏原有方法的代码]

特点

  • 动态的创建.class文件(创建一个和被代理类实现相同父接口的子类[代理类])
  • 动态的加载.class文件到内存中(创建Class对象)
    • Proxy类需要一个类加载器
  • 对程序员来讲,不需要书写代理类

代码实现

代理对象 = Proxy.newProxyInstance(累加载器,父接口,处理器);
类加载器:动态的加载.class文件
父接口:代理类和被代理类共同的父接口
处理器:代理对象拦截了方法后,对方法进行前增强,后增强,是由处理器来书写逻辑

代理对象 = Proxy.newProxyInstance(.class.getClassLoader(),
                被代理类.class.getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        proxy:代理对象
                        method:被拦截的方法对象
                        args:被拦截的方法中的实参
                        return method.invoke("代理对象",args);
                    }
                }

        );

实现的关键步骤

  1. 被代理类:必须有实现接口
  2. 创建被代理类对象:交给代理对象使用

优点

  • 非常的灵活,支持任意接口类型的实现对象做代理,也可以直接为接口本身做代理
  • 可以为被代理对象的所有方法做代理
  • 可以在不改变方法源码的情况下,实现对方法功能的增强
  • 不仅简化了编程工作,提高了软件系统的可扩展性,同时也提高了开发效率

XML

概述

Extensible Markup Language 可扩展的标记语言,由各种(标记,元素)组成
可扩展:所有的标签都是自定义的,可以随意扩展的
标记语言:整个文档由各种标签组成,清晰,数据结构化

作用

  1. 数据交换:不同计算机之间,不同操作系统之间,不同数据库之间,进行数据交换
  2. 配置文件:主要用于各种框架的配置文件

编写第一个XML文件

  1. 先创建文件

Snipaste_2024-04-17_20-06-00.png

  1. 编写person.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<peopel>
    <person>
        <id>1</id>
        <name>张三</name>
        <age>18</age>
        <sex></sex>
    </person>
    
    <person>
        <id>2</id>
        <name>李四</name>
        <age>20</age>
        <sex></sex>
    </person>

</peopel>
  1. 通过浏览器解析xml的内容

** 注**:XML以后通过Java来进行解析,很少直接在浏览器上显示

组成

声明

<?xml version="1.0" encoding="utf-8" ?> 固定格式

文档声明必须为<?xml开头,以?>结束
必须在xml文档中的首行首列
常见的俩个属性:

  • version:指定XML文档版本,必须属性,这里选择1.0
  • encoding:指定当前文档的编码,可选属性,默认值为utf-8

元素(标签、标记)

格式1: 标签体 有标签体的标签(双标签)
格式2: 没有标签体的标签(空标签) (单标签)
元素体:可以是元素,也可以是文本
元素命名:和Java命名标识符保持一致
一个XML中有且仅有一个根元素

属性

  1. 是元素的一部分,必须出现在元素的开始标签中
  2. 定义格式: 属性名 = “属性值”
  3. 一个元素可以有0~N个属性,但一个元素中不能同名出现
  4. 属性名建议以Java的标识符定义规则做参考

注释

ctrl+/

转义字符[实体字符

字符预定义的转义字符说明
<<小于(less than)
>>大于(greater than)
""双引号(quotation)
'单引号(apostrophe)
&&和号(ampersand )

字符区(了解)

当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时候使用CDATA段会好一些
CDATA(Character Data)字符数据区,格式如下
:::tips

<![CDATA[
文本数据 < > & ; " "
]]>

:::
特点:原样显示(书写的内容不会被xml解析器解析)
CD+enter

约束

DTD约束

<!ELEMENT 书架 (+)> <!-- 声明了根元素,并指定了根元素下必须有的一个子元素 -->

<!-- 声明子元素 书 -->
<!ELEMENT(书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
                           <!-- , 表示必须按照元素的顺序出现  -->

<!ELEMENT 书名 (#PCDATA)> <!-- #PCDATA  : 表示文本内容 -->
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

:::tips
引用
:::

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "bookshelf.dtd"><!--指定使用bookshelf.dtd文件约束当前xml文档-->
<书架>
    <>
        <书名>JavaWeb开发教程</书名>
        <作者>张孝祥</作者>
        <售价>100.00</售价>
    </>
    <>
        <书名>三国演义</书名>
        <作者>罗贯中</作者>
        <售价>100.00</售价>
        <测试>hello</测试><!--不符合约束,书的子元素必须为书名、作者、售价-->
    </>
</书架>

Schema约束

概念:Schema语言也叫做XSD(XML Schema Definition)
其本身也是xml格式文档,但Schema文档扩展名为xsd,而不是xml,它功能强大,数据类型约束更完善

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.itcast.cn"
           elementFormDefault="qualified">
        <xs:element name='书架' >
        <!--  complexType : 复杂元素 
              xml文档中的某个标签,有子标签或有属性,该标签就为:复杂元素
              例: <书架>   <>
              
              简单元素: 
                 没有子标签、没有属性。   例:书名、作者、售价
        -->
                <xs:complexType>
                        <xs:sequence maxOccurs='unbounded' >
                                <xs:element name='书' >
                                        <xs:complexType>
                                                <xs:sequence>
                                                     <xs:element name='书名' type='xs:string' />
                                                     <xs:element name='作者' type='xs:string' />
                                                     <xs:element name='售价' type='xs:double' />
                                                </xs:sequence>
                                        </xs:complexType>
                                </xs:element>
                        </xs:sequence>
                </xs:complexType>
        </xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<书架
xmlns="http://www.itcast.cn"    
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd"
><!--指定schema文档约束当前XML文档-->
    <>
        <书名>JavaScript网页开发</书名>
        <作者>张孝祥</作者>
        <售价>abc</售价>
    </>
</书架>

引入步骤
:::tips
<根元素 xmlns=“命名空间”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“命名空间 文件路径”
</根元素>
命名空间为约束文件中的targetNamespace中
:::

名称空间

一个XML文档最多可以使用一个DTD文件,但一个XML文档中使用多个Schema文件,若这些Schema文件中定义了相同名称的元素时,使用的时候就会出现名字冲突。
同理 , 在XML文档中就需要通过名称空间(namespace)来区分元素和属性是来源于哪个约束中的。
名称空间就在在根元素后面的内容 , 使用xmlns到引入约束 。
当一个XML文档中需要使用多个Schema文件的时候 , 有且仅有一个使用缺省的 , 其他的名称空间都需要起别名 。
:::tips
xmlns="http://www.itcast.cn"


xmlns:aa="http://java.sun.com"

:::

Dom4j

XML解析

当数据存储在xml中,我们希望通过程序获取xml的内容,使用io的话会比较繁琐,所有后来创造了解析器,方便开发人员操作xml

解析方式和解析器

解析方式

  1. DOM:将整个xml文件装入内存,并解析成一个Document对象
  2. SAX:边扫描边分析,只能读
  3. PULL:Android内置的xml解析方式,类似sax

解析器

就是根据不同的解析方式提供具体实现

Snipaste_2024-04-17_21-22-44.png


解析器开发包

Snipaste_2024-04-17_21-23-28.png

基本使用

DOM解析原理及结构模型

解析原理
将整个xml文档加载到内存中,生成一个DOM树,并获得Document对象,通过Document对象就可以对DOM数进行操作

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="0001"> 
        <name>JavaWeb开发教程</name>
        <author>张孝祥</author>
        <sale>100.00</sale>
    </book>
    <book id="0002">
        <name>三国演义</name>
        <author>罗贯中</author>
        <sale>100.00</sale>
    </book>
</books>

结构模型
DOM中的核心概念就是节点,在xml文档中的元素、属性、文本,在DOM中都是节点!所有的节点都封装到了Document对象中
Snipaste_2024-04-17_21-28-01.png
使用Document对象,就可以去访问DOM树中的每个节点

常用的方法

  1. SAXReader对象
    | 方法 | 作用 |
    | — | — |
    | SAXReader sr = new SAXReader(); | 构造器 |
    | Document read(String url) | 加载执行xml文档 |

  2. Document对象
    | 方法 | 作用 |
    | — | — |
    | Element getRootElement() | 获得根元素 |

  3. Element对象
    | 方法 | 作用 |
    | — | — |
    | List elements(String ele ) | 获得指定名称的所有子元素。可以不指定名称 |
    | Element element(String ele) | 获得指定名称第一个子元素。 |
    | String getName() | 获得当前元素的元素名 |
    | String attributeValue(String attrName) | 获得指定属性名的属性值 |
    | String elementText(Sting ele) | 获得指定名称子元素的文本值 |
    | String getText() | 获得当前元素的文本内容 |

使用xpath解析xml文件

介绍

XPath使用路径表达式来选取XML/HTML 文档中的元素节点或属性节点。节点是通过沿着路径 (path) 来选取的。XPath在解析XML/HTML文档方面提供了一独树一帜的路径思想。

使用步骤

  1. 导入jar包(dom4j和jaxen-1.1-beta-6.jar)
  2. 通过dom4j的SaxReader获取Document对象
  3. 利用Xpath提供的api,结合xpath的语法完成选取XML文档元素节点进行解析操作

Node接口中存在的方法

方法作用
List<Element> selectNodes("路径表达式")获取符合表达式的元素集合
Element selectSingleNode("路径表达式")获取符合表达式的唯一元素

Document,Element都是Node的子类型,也可以使用上述的方法

路径表达式

  1. 绝对路径表达式

例如: /元素/子元素/子子元素…

  1. 相对路径表达式

例如: 子元素/子子元素… 或者 ./子元素/子子元素…

  1. 全文搜索路径表达式

例如: //子元素//子子元素或者//子子元素

  1. 条件筛选表达式

例如: //元素[@属性名]或者//元素[@属性名=value]

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

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

相关文章

企业linux-堡垒机与跳板机测试案例-6140字详谈

在开始今天内容前&#xff0c;小编先把专栏前面学的Linux命令&#xff08;部分&#xff09;做了思维导图帮助各位平时的学习&#xff1a; 场景&#xff1a; 运维人员管理三台机器&#xff0c;通过远程连接工具连接上三台机器&#xff0c;也知道这三台机器root密码&#xff0c…

Xshell无法输入命令输入命令卡顿

Xshell是一款功能强大的终端模拟软件&#xff0c;可以让用户通过SSH、Telnet、Rlogin、SFTP等协议远程连接到Linux、Unix、Windows等服务器。然而&#xff0c;在使用Xshell的过程中&#xff0c;我们可能会遇到一些问题。比如输入不了命令&#xff0c;或者输入命令很卡。这些问题…

C++笔记:异常

文章目录 C 运行时错误处理机制及其不足之处C 异常概念异常的使用异常的抛出和匹配原则在函数调用链中异常栈展开匹配原则异常的重新抛出举例演示说明例子一&#xff1a;串联举例演示大部分原则例子二&#xff1a;模拟服务器开发中常用的异常继承体系例子三&#xff1a;异常的重…

千锤百炼之每日算法(一)

目录 题外话 正题 第一题 第一题思路 第一题代码详解 第二题 第二题思路 动态规划 解法一 解法一代码详解 解法二 第三题 第三题思路 第三题代码详解 小结 题外话 从今天开始,每天都会更新算法题,一天就三道题 大家最好采用码形结合的方式,也就是代码和图形结合…

最新最全的Jmeter接口测试必会技能:jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

git出现错误 fail to push some refs to “xxx“

问题产生原因&#xff1a;根据测试猜测造成这一错误的原因是在码云的远程仓库上删除了一个文件,本地没有pull下来,直接进行了commit,commit到本地仓库后,如果在pull下来,也是无法提交的 问题解决办法: 使用 git pull --rebase,拉取远程仓库,并将本地仓库新的提交作为最顶层的提…

C++ 并发编程指南(11)原子操作 | 11.5、内存模型

文章目录 一、C 内存模型1、为什么需要内存模型&#xff1f; 前言 C 11标准中最重要的特性之一&#xff0c;是大多数程序员都不会关注的东西。它并不是新的语法特性&#xff0c;也不是新的类库功能&#xff0c;而是新的多线程感知内存模型。本文介绍的内存模型是指多线程编程方…

(算法版)基于二值图像数字矩阵的距离变换算法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目展示了欧氏距离、城市街区距离和棋盘距离变换的实现方法。通过定义一个距离变换类&#xff0c;对输入图像进行距离变换操作&#xff0c;并生成对应的距离矩阵。在示例中&#xff0c;展示了在一个480x480的全黑背景图像上设…

GPT国内怎么用?4月最新版本来了

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

基于SpringBoot+Vue的疾病防控系统设计与实现(源码+文档+包运行)

一.系统概述 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对疾病防控信息管理的提升&a…

20240329-2-树模型集成学习TreeEmbedding

树模型集成学习 集成学习主要有两个思想&#xff0c;分别是bagging和boosting。树模型的集成模型都是使用树作为基模型&#xff0c;最常用的cart树&#xff0c;常见的集成模型有RandomForest、GBDT、Xgboost、Lightgbm、Catboost。 概要介绍 RandomForest 随机森林(Random …

spring的redis注解@Cacheable @Cacheput @CacheEvict的condition、unless

概述 redis的注解使用的过程中总会遇到condition和unless这两个属性&#xff0c;而且不同的注解使用注意事项不一样。本人也是错误使用之后详细查询了一下&#xff0c;作了如下的总结。 Cacheale 这个注解的使用和意义这里不多说&#xff0c;可以查看我的其他文档。这里主要说…

nginx安装在linux上

nginx主要用于反向代理和负载均衡&#xff0c;现在简单的说说如何在linux操作系统上安装nginx 第一步&#xff1a;安装依赖 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel 第二步&#xff1a; 下载nginx&#xff0c;访问官网&#xff0c;ngin…

在操作系统里面打开了Ubuntu 然后vi编辑器编辑内容后没有效果了

我在vi创建项目后编写 然后一直卡着动不了 如下&#xff08;界面没有卡住 可以其他操作&#xff09; 唉&#xff1a;这是一个初学者到悲哀&#xff1a; 原因&#xff1a;是Windows编写习惯 按了Ctrl s在该系统里面就是停止输入&#xff0c;需要按ctrl q恢复输入

Workerman开启ssl方法如下

参考地址 Workerman开启ssl方法如下-遇见你与你分享 准备工作&#xff1a; 1、Workerman版本不小于3.3.7 2、PHP安装了openssl扩展 3、已经申请了证书&#xff08;pem/crt文件及key文件&#xff09;放在了/etc/nginx/conf.d/ssl下 4、配置文件 location /wss { proxy_set…

使用Java调用音乐开放API,并进行播放

使用Java调用音乐开放API&#xff0c;并进行播放 背景描述 电脑没有下载音乐软件&#xff0c;使用网页播放又不太方便&#xff0c;所有就想着使用Java语言直接调用音乐开放API&#xff0c;然后进行播放音乐。 具体代码如下&#xff0c;包含了注释 package com.lowkey.comple…

基于改进遗传算法的配电网故障定位(matlab代码)

1 主要内容 该程序复现文章《基于改进遗传算法的配电网故障定位》&#xff0c;将改进的遗传算法应用于配电网故障定位中, 并引入分级处理思想, 利用配电网呈辐射状的特点, 首先把整个配电网划分为主干支路和若干独立区域, 再利用该算法分别对各独立区域进行故障定位, 然后进行…

node.js服务器动态资源处理

一、node.js服务器动态资源处理与静态资源处理的区别&#xff1f; 静态与动态服务器主要区别于是否读取数据库&#xff0c;若然在数据库中的资料处理中将数据转换成可取用格式的结构&#xff0c;也就是说把对象转化为可传输的字节序列过程称为序列化&#xff0c;反之则为反序列…

她在《繁花》大放异彩,“浪姐”暴瘦15斤,打脸了不看好她的观众

不知不觉&#xff0c;《浪姐》已经迎来第5季了。播到第4季的时候&#xff0c;改名成《乘风破浪2023》&#xff0c;这一季叫《乘风2024》&#xff0c;和前几季相比&#xff0c;热度依然不减。 都说3个女人一台戏&#xff0c;更何况这个节目&#xff0c;每次能请到30位姐姐&…