This commit is contained in:
2025-12-21 17:24:54 +08:00
commit e8c50a3d78
660 changed files with 29599 additions and 0 deletions

17
s_day13/books-schema.xml Normal file
View File

@@ -0,0 +1,17 @@
<books xmlns="http://www.example.org/books">
<book address="ddd">
<name></name>
<author></author>
<price></price>
</book>
<book address="ddd">
<name></name>
<author></author>
<price></price>
</book>
<book>
<name></name>
<author></author>
<price></price>
</book>
</books>

6
s_day13/books.dtd Normal file
View File

@@ -0,0 +1,6 @@
<!ELEMENT books (book+)>
<!ELEMENT book (name,price,author)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST book bid CDATA "check">

34
s_day13/books.xml Normal file
View File

@@ -0,0 +1,34 @@
<?xml version="1.0"?>
<!--
内部引用
<!DOCTYPE books [
<!ELEMENT books (book+)>
<!ELEMENT book (name,price,author)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST book bid CDATA "check">
]>-->
<!DOCTYPE books SYSTEM "books.dtd">
<books>
<book bid="j">
<name>java</name>
<price>99</price>
<author>小王</author>
</book>
<book bid="m">
<name>mysql</name>
<price>199</price>
<author>小李</author>
</book>
<book bid="m">
<name>mysql</name>
<price>199</price>
<author>小李</author>
</book>
<book bid="m">
<name>mysql</name>
<price>199</price>
<author>小李</author>
</book>
</books>

40
s_day13/books.xsd Normal file
View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
schema约束文件的根标签必须是schema
目标命名空间:类似java中的包名,用来在执行的xml中来导入约束文件
targetNamespace="http://www.example.org/books"
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/books"
elementFormDefault="qualified">
<!--
用来定义xml的根标签必须是books
-->
<element name="books">
<!--
声明books是复杂标签
复杂标签:拥有子标签或者属性的标签
-->
<complexType>
<!--
通过sequence标签指定子标签的顺序
用来指定books的子标签有哪些
-->
<sequence>
<element name="book" maxOccurs="3" minOccurs="1">
<!--设置book标签是复杂标签-->
<complexType>
<!--设置book标签的子标签顺序-->
<sequence>
<element name="name" type="string"></element>
<element name="author" type="string"></element>
<element name="price" type="string"></element>
</sequence>
<!--设置book标签有属性叫address-->
<attribute name="address"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>

29
s_day13/note.txt Normal file
View File

@@ -0,0 +1,29 @@
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
以上 DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

View File

@@ -0,0 +1,18 @@
package com.inmind.daynamic_proxy_01;
public class CaiXuKun implements Singer{
@Override
public void sing(int money) {
System.out.println("蔡徐坤收到了"+money+"钱,唱了鸡你太美");
}
@Override
public void dance(int money) {
System.out.println("蔡徐坤收到了"+money+"钱,跳了篮球舞");
}
@Override
public void eat() {
System.out.println("蔡徐坤吃了大盘鸡");
}
}

View File

@@ -0,0 +1,16 @@
package com.inmind.daynamic_proxy_01;
/*
1.类加载器:能够将字节码文件加载在JVM的方法区就在堆中产生一个一一对应的Class对象
类加载器的作用生成Class对象
应用场景:在动态代理中,它要作为参数
*/
public class Demo01 {
public static void main(String[] args) {
//反射的前提
Class clazz = Demo01.class;
//获取类加载器
ClassLoader classLoader = clazz.getClassLoader();
System.out.println(classLoader);
}
}

View File

@@ -0,0 +1,26 @@
package com.inmind.daynamic_proxy_01;
/*
装饰设计模式
装饰者 被装饰者 作用:装饰者增强被装饰者的功能
花瓶 花 花瓶增强了花的好看的程度
经纪人 蔡徐坤 经纪人增强了蔡徐坤的唱跳金额的判断功能
装饰设计模式的前提:装饰者需要与被装饰者拥有的功能要一致,继承同一个父类或者实现同一个接口
BufferedReader FileReader 底层封装了缓冲区,提高字符输入流的读取效率
*/
public class Demo02 {
public static void main(String[] args) {
//在美食城唱歌
CaiXuKun caiXuKun = new CaiXuKun();
/*
caiXuKun.sing(10);
caiXuKun.dance(20);*/
/*
蔡徐坤火了
需求:蔡徐坤的类的功能不能改变(.java内容不能改变,但是要给它的唱歌跳舞功能增加一些金额判定
*/
JingJiRen jingJiRen = new JingJiRen(caiXuKun);
jingJiRen.sing(120);
jingJiRen.dance(30);
}
}

View File

@@ -0,0 +1,97 @@
package com.inmind.daynamic_proxy_01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
/*
静态代理直接定义一个固定的类增强某个类的功能JingJiRen
动态代理:不用定义一个固定的类,动态地增强某个类的功能
需求蔡徐坤的类不能改变也不能定义新的经纪人类但是还想对蔡徐坤的唱跳功能进行增强金额判断此时只能使用动态代理API
装饰设计模式
装饰者 被装饰者 作用:装饰者增强被装饰者的功能
花瓶 花 花瓶增强了花的好看的程度
经纪人 蔡徐坤 经纪人增强了蔡徐坤的唱跳金额的判断功能
装饰设计模式的前提:装饰者需要与被装饰者拥有的功能要一致,继承同一个父类或者实现同一个接口
BufferedReader FileReader 底层封装了缓冲区,提高字符输入流的读取效率
------------------------------------------------------------------------------------------------------------------------------
动态代理模式
代理者 被代理者 作用:代理者拦截了被代理者的指定的功能,进行操作
singerProxy caiXuKun 拦截了caixukun的singdance功能进行金额判断
动态代理的前提条件:代理者与被代理者必须要拥有相同的功能,实现同一个接口
装饰设计模式与动态代理的区别:
1.装饰设计模型:注重功能的增强,拥有更多的功能代码,,它必须实现所有的抽象方法
2.动态代理:注重功能方法的拦截,它只需要针对想拦截的方法即可
*/
public class Demo03 {
public static void main(String[] args) {
CaiXuKun caiXuKun = new CaiXuKun();
//动态地创建出代理对象
//动态代理的参数一:类加载器
ClassLoader loader = caiXuKun.getClass().getClassLoader();
//动态代理的参数二代理对象与被代理对象要拥有相同的功能Singer接口
Class<?>[] interfaces = caiXuKun.getClass().getInterfaces();
//动态代理的参数三:处理器对象,用来处理代理对象(蔡徐坤)中的业务逻辑
InvocationHandler h = new InvocationHandler() {
//注意:动态代理对象(singerProxy)调用任意的方法都会引起以下的invoke方法执行一次
/*
invoke方法的三大参数的含义
参数一 proxy就是动态代理对象singerProxy不要使用它会引起递归导致栈内存溢出错误
参数二method反射中的Method类就是当前动态代理对象调用的方法sing,dance,eat,toString等
参数三args当前动态代理对象调用方法时传入的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*System.out.println("invoke方法执行了");
System.out.println(proxy);//打印时会调用proxy的toString方法
System.out.println(method.getName());
System.out.println(Arrays.toString(args));*/
/*
动态代理增强的代码实现
1.如果是sing方法判断是不是超过100
2.如果是dance方法判断是不是超过50
*/
String methodName = method.getName();
if ("sing".equals(methodName)) {
//获取sing的参数
int money = (int) args[0];
if (money > 100) {
// caiXuKun.sing(money);
// caiXuKun.sing(money);
method.invoke(caiXuKun, args);
}else{
System.out.println("钱不够,一遍玩去");
}
return null;//如果是sing单独处理并提前结束避免sing方法执行2次
}
if ("dance".equals(methodName)) {
int money = (int) args[0];
if (money > 50) {
// caiXuKun.dance(money);
method.invoke(caiXuKun, args);
} else {
System.out.println("钱不够,玩泥巴去吧");
}
return null;
}
//除了sing和dance以外的功能方法都保证原有功能即可
return method.invoke(caiXuKun, args);
}
};
Singer singerProxy = (Singer) Proxy.newProxyInstance(loader,interfaces,h);
singerProxy.sing(80);
singerProxy.dance(55);
singerProxy.eat();
}
}

View File

@@ -0,0 +1,39 @@
package com.inmind.daynamic_proxy_01;
public class JingJiRen implements Singer{
CaiXuKun caiXuKun;
public JingJiRen(CaiXuKun caiXuKun) {
this.caiXuKun = caiXuKun;
}
@Override
public void sing(int money) {
//金额判断超过100万才让蔡徐坤唱歌
if (money > 100) {
caiXuKun.sing(money);
} else {
System.out.println("钱不够,一边玩去");
}
}
@Override
public void dance(int money) {
//金额判断超过50万才让蔡徐坤跳舞
if (money > 50) {
caiXuKun.dance(money);
} else {
System.out.println("钱不够,一边玩去");
}
}
@Override
public void eat() {
System.out.println("坤坤没空,你看我怎么样");
}
public void method(){
}
}

View File

@@ -0,0 +1,13 @@
package com.inmind.daynamic_proxy_01;
/*
定义出一个歌手的规范,只要实现该接口的方法,那么对应的类,就算是一个歌手类
*/
public interface Singer {
void sing(int money);
void dance(int money);
void eat();
}

View File

@@ -0,0 +1,32 @@
package com.inmind.logback_03;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackTest {
//创建出一个logger对象
public static final Logger LOGGER = LoggerFactory.getLogger("LogbackTest");
public static void main(String[] args) {
try {
// System.out.println("test方法开始执行了");
LOGGER.info("test方法开始执行了");
test(1, 0);
// System.out.println("test方法执行结束了");
LOGGER.info("test方法执行结束了");
} catch (Exception e) {
// System.out.println("test方法执行失败出现了异常");
LOGGER.error("test方法执行失败出现了异常");
}
}
public static void test(int a ,int b) {
LOGGER.warn("注意算术除法异常");
LOGGER.debug("参数a:"+a);
LOGGER.debug("参数b:"+b);
int c = a/b;
System.out.println("结果是:"+c);
}
}

View File

@@ -0,0 +1,34 @@
package com.inmind.xml_02;
/*
XML 被设计用来传输和存储数据,可扩展标记语言
HTML 被设计用来显示数据。超文本标记语言,用来开发网页
可扩展:可以自定义
标记:标签,<开始标签>标签体</结束标签>
XML 与 HTML 的主要差异
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
book{
name
price
author
}
<book>
<name>java</name>
<price>99</price>
<author>小王</author>
</book>
为什么要了解学习XML
今后学习框架使用xml文件作为配置文件
*/
public class Demo01 {
}

42
s_day13/src/logback.xml Normal file
View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.out</target>
<encoder>
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度
%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
</encoder>
</appender>
<!-- File是输出的方向通向文件的 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志输出路径-->
<file>D:/log/inmind-data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>D:/log/inmind-data-%i-%d{yyyy-MM-dd}-.log.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!--
1、控制日志的输出情况开启日志 ALL取消日志 OFF
-->
<root level="info">
<!-- <root level="OFF">-->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>