Spring AOP-面向切面编程
Spring-AOP
1、AOP 基本概念
(1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能
(3)使用登录例子说明 AOP
2、AOP底层原理
a)AOP 底层使用动态代理 ,动态代理有两种情况:
第一种 有接口情况,使用 JDK 动态代理 ;创建接口实现类代理对象,增强类的方法
第二种 没有接口情况,使用 CGLIB 动态代理;创建子类的代理对象,增强类的方法
3、JDK 动态代理
java.lang.Proxy
1)使用 Proxy 类里面的方法创建代理对象
调用 newProxyInstance 方法,方法有三个参数:
12public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
方法的参数说明
ClassLoader loader:类加载器
Class<?>[] interfaces :增强方法所在的类实现的接口,支持多个接口
比如 Class[] interfaces = {UserDao.class};
InvocationHandler h:实现这个接口 InvocationHandler,创建代理对象,写增强的部分
2)编写 JDK 动态代理代码
创建接口,定义方法
1234public interface UserDao { public int add(int a,int b); public String update(String id);}
创建接口实现类,实现方法
12345678910public class UserDaoImpl implements UserDao { @Override public int add(int a, int b) { return a+b; } @Override public String update(String i ...
Spring IOC-基于xml方式管理(2)Bean&注解方式管理Bean
Spring IOC容器-Bean管理——基于XML(续集)
IOC 操作 Bean 管理
1、FactoryBean
1、Spring 有两种类型 bean,一种普通 bean,另外一种工厂 bean(FactoryBean)
2、普通 bean:在配置文件中定义 bean 类型就是返回类型
3、工厂 bean:在配置文件定义 bean 类型可以和返回类型不一样 第一步 创建类,让这个类作为工厂 bean,实现接口 FactoryBean 第二步 实现接口里面的方法,在实现的方法中定义返回的 bean 类型
1234567891011121314151617181920public class MyBean implements FactoryBean<Course> { //定义返回bean @Override public Course getObject() throws Exception { Course course = new Course(); course.setCname("abc"); return course; }}<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean"></bean> @Testpublic void test3() { ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml"); Course course = context.getBean("myBean", Course.class);//返回值类型可以不是定义的bean类型! System.out.println(course);}
2、bean 作用域
在 Spring 里面,默认情况下,bean 是单实例对象,下面进行作用域设置:
在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
scope 属性值 第一个值 默认值,singleton,表示是单实例对象 第二个值 prototype,表示是多实例对象
123<bean id="b ...
javaweb用到的配置以及遇到的问题
版本
MySQL: 8.02
Tomcat :9.0.64
JDK:11
Maven:3.014 (Thymeleaf)
idea:2021.032
MySQL8.0设置
保存在jdbc.properties即可
1234public static final String DRIVER = "com.mysql.cj.jdbc.Driver" ;public static final String URL ="jdbc:mysql://localhost:3306/*****?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&useSSL=false";public static final String USER = "root";public static final String PWD = "*********" ;
Edit水果信息执行顺序
点击名称,
, 然后把fid发送给EditServlet
,EditServlet 内通过fid查找数据并保存(setAttribute ),然后EditServlet 跳转到 edit.html , 通过thymeleaf 获取 对象并填入 数据
,修改好之后 点击 修改(实际是一个form表单) 提交表单,
,将数据发送给updateServlet, updateServlet内完成 数据库的更新 ,然后跳转到index(经过thymeleaf渲染的界面,而不是直接index.html) , 修改操作完成
requests传参⚠️parameters
注意添加 -parameters,否则请求发过来的参数就会是arg0 ,arg1,arg2 ,arg3s…………, 无法获得具体的名称(导致参数全部为null , 无法加载页面,
原因:
private String index(String oper , String keyword , Integer pageNo , HttpServletRequest request )
FruitController index()方法在执行时 ,参数全部 ...
Spring IOC(1) IOC介绍&基于XMl方式管理Bean
spring IOC容器管理必须知道这些操作——基于XML方式
Spring—IOC(控制反转)
一、IOC容器
1、什么是IOC(控制反转)
a)把对象创建和对象之间的调用过程,交给Spring进行管理
b)使用IOC目的:为了降低耦合度
2、IOC底层
a)xml解析、工厂模式、反射
3、Spring提供的IOC容器实现的两种方式(两个接口)
a)BeanFactory接口:IOC容器基本实现是Spring内部接口的使用接口,不提供给开发人员进行使用(加载配置文件时候不会创建对象,在获取对象时才会创建对象。)
b)ApplicationContext接口:BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用(加载配置文件时候就会把在配置文件对象进行创建)推荐使用!
4、ApplicationContext接口的实现类(具体根据API文档查看☺)
二、IOC容器-Bean管理
1、IOC操作Bean管理
a)Bean管理就是两个操作 :(1)Spring创建对象;(2)Spring注入属性
2、基于XML配置文件创建对象
12<!--1 配置User对象创建--><bean id="user" class="com.atguigu.spring5.User"></bean>
3、基于XML方式注入属性(DI:依赖注入(注入属性))
a)set方式注入
12345678910//(1)传统方式: 创建类,定义属性和对应的set方法public class Book { //创建属性 private String bname; //创建属性对应的set方法 public void setBname(String bname) { this.bname = bname; } }
123456789<!--(2)spring方式: set方法注入属性--><bean id="book" class="com.atguigu.spring5.Book"> <!--使用property完成属性注入 name:类里面属性名称 value:向属性注入的值 ...
如何使用Jacman主题
主题介绍
Jacman 是一款扁平化,有着响应式设计的 Hexo 主题。本站正式使用了 Jacman 主题。Jacman 基于 Pacman 主题修改而来,目前已有很多特性与原主题不同。你可以前往 本站 和 Demo 预览更多关于本主题的更多效果。如果你有任何问题或意见欢迎到 GitHub 发表 issue。
距离当初我把 Jacman 开源至今已有半年零一周了,在这半年里也一直保持着对 Jacman 的更新。看到很多人用这款主题,fork&star 数也越来越好看,我也更有动力继续完善 Jacman。Jacman 自然还有很多改进空间,首先是文档问题,有许多人通过博客、微博、QQ 询问我有关主题的问题,我也意识到之前写的帮助手册可读性太差。正好趁着这次 Jacman 大更新,写篇更详尽、readable 的手册。
安装指南
安装
在博客根目录下执行如下命令。
1$ git clone https://github.com/wuchong/jacman.git themes/jacman
Jacman 需要安装 Hexo 2.7 及以上版本,请先升级您的 Hexo 程序,再启用此主题。
启用
修改你的博客根目录下的_config.yml配置文件中的theme属性,将其设置为jacman。同时建议设置stylus属性中的compress值为true,会自动压缩 CSS 文件,hexo默认配置中不包含这一项,建议开启。如下。
123theme: jacmanstylus: compress: true
更新
12cd themes/jacmangit pull origin master
请先备份您主题目录下的 _config.yml 文件后再升级。
配置指南
Jacman 主题提供了丰富的配置属性,可以实现您对主题的自定义。配置文件_config.yml位于主题根目录下。本次更新对配置文件进行了较大调整,如您之前就使用了 Jacman,也需要您根据以下指南进行相应的修改。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767 ...
java和cpp的forEach循环的区别
java和cpp的forEach循环的区别
众所周知,java内的函数传参方法只有一种—==值传递==,cpp分为值传递和地址传递
那么两者的forEach循环有什么区别呢?
java中的forEach与函数传参类似
对于基本数据类型(八大基本数据类型), forEach循环并不会改变他们实际的数值
byte:字节类型,Java中最小的数据类型,1个字节,占8位,取值范围-128127,默认值0
char:字符型,用于存储单个字符,2个字节,占16位,取值范围0~65535,默认值为空
short:短整型,2个字节,占16位,取值范围-3276832717,默认值0
int:整型,用于存储整数,4个字节,占32位,取值范围-2147483648~2147483647,默认值0
long:长整型,8个字节 占64位,-263~263-1,默认值0L
float:浮点型,占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
double:双精度浮点型,用于存储带有小数点的数字,8个字节 占64位,默认值0
boolean:布尔类型,1个字节 占8位,用于判断真或假(仅有两个值,即true、false),默认值false
对于引用数据类型
引用数据类型在被创建时,首先要在栈上给其引用(句柄)分配一块内存,而对象的具体信息都存储在堆内存上,
forEach内对于调出来的元素的操作==会改变==引用类型的实际的值
特殊的,对于==包装类==,包装类的值不会因为forEach内的操作被改变
==Integer 对象是不可变的==
java核心技术卷1 第11版 p194
==警告==: 有些人认为包装器类可以用来实现修改数值参数的方法, 然而这是错误的。在第4 章中曾经讲到, 由于Java 方法都是值传递, 所以不可能写一个下面这样的能够增加整型参数值的Java 方法。
问题是==Integer 对象是不可变的==: 包含在包装器中的内容不会改变: 不能使用这些包装器类创建修改数值参数的方法。
如果想编写一个修改数值参数值的方法, 就需要使用在org.omg.CORBA 包中定义的
持有者( holder ) 类型, 包括IntHolder、BooleanHolder 等。每个持有者 ...
vue.js简介
{{msg}}相当于innerText
v-bind:attr 绑定属性值。例如,v-bind:value - 绑定value值
简写: :value
v-model 双向绑定
v-model:value , 简写 v-model
v-if , v-else , v-show
v-if和v-else之间不能有其他的节点
v-show是通过样式表display来控制节点是否显示
v-for 迭代
v-for={fruit in fruitList}
v-on 绑定事件
其他:
trim:去除首尾空格 , split() , join()
watch表示侦听属性
生命周期
第一节 Vue.js简介
#1、框架
任何编程语言在最初的时候都是没有框架的,后来随着在实际开发过程中不断总结**『经验』,积累『最佳实践』,慢慢的人们发现很多『特定场景』下的『特定问题』总是可以『套用固定解决方案』**。
于是有人把成熟的**『固定解决方案』收集起来,整合在一起,就成了『框架』**。
在使用框架的过程中,我们往往只需要告诉框架**『做什么(声明)』,而不需要关心框架『怎么做(编程)』**。
对于Java程序来说,我们使用框架就是导入那些封装了**『固定解决方案』的jar包,然后通过『配置文件』**告诉框架做什么,就能够大大简化编码,提高开发效率。我们使用过的junit其实就是一款单元测试框架。
而对于JavaScript程序来说,我们使用框架就是导入那些封装了**『固定解决方案』的『js文件』**,然后在框架的基础上编码。
用洗衣服来类比框架:
典型应用场景:洗衣服
输入数据:衣服、洗衣液、水
不使用框架:手洗
使用框架:使用洗衣机,对人来说,只需要按键,具体操作是洗衣机完成的。人只是告诉洗衣机做什么,具体的操作是洗衣机完成的。
实际开发中使用框架时,我们也主要是告诉框架要做什么,具体操作是框架完成的。
#2、Vue.js
#①Vue.js的作者
在为AngularJS工作之后,Vue的作者尤雨溪开Vue.js。他声称自己的思路是提取Angular中自己喜欢的部分,构建出一款相当轻量的框架。
Vue最早发布于2014年2月。作者在Hacker News、Echo JS与 Reddit的JavaScript版块发布了最早的版本。一天之内,Vue 就登上了这 ...
Ajax简介
Ajax : 异步的JavaScript and XML
目的: 用来发送异步的请求,然后当服务器给我响应的时候再进行回调操作
好处: 提高用户体验;局部刷新:降低服务器负担、减轻浏览器压力、减轻网络带宽压力
开发步骤:
创建XMLHttpRequest
调用open进行设置:“GET” , URL , true
绑定状态改变时执行的回调函数 - onreadystatechange
发送请求 - send()
编写回调函数,在回调函数中,我们只对XMLHttpRequest的readystate为4的时候感兴趣
我们只对XMLHttpRequest的status为200的时候感兴趣
0: (Uninitialized) the send( ) method has not yet been invoked.
1: (Loading) the send( ) method has been invoked, request in progress.
2: (Loaded) the send( ) method has completed, entire response received.
3: (Interactive) the response is being parsed.
4: (Completed) the response has been parsed, is ready for harvesting.
0 - (未初始化)还没有调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,可以在客户端调用了
JavaScript RegExp参考手册
总览
正则表达式的使用三步骤:
1. 定义正则表达式对象
正则表达式定义有两个方式:
1) 对象形式
var reg = new RegExp(“abc”)
2) 直接量形式
var reg = /abc/;
3) 匹配模式:
- g 全局匹配
- i 忽略大小写匹配
- m 多行匹配
- gim这三个可以组合使用,不区分先后顺序
例如: var reg = /abc/gim , var reg = new RegExp(“abc”,“gim”);
1. 定义待校验的字符串
3. 校验
元字符
. , \w , \W , \s , \S , \d , \D , \b , ^ , $
[]表示集合
[abc] 表示 a或者b或者c
[ ^ abc] 表示取反,只要不是a不是b不是c就匹配
[a-c] 表示a到c这个范围匹配
出现的次数
表示多次 (0 ~ n )
至少一次 ( >=1 )
? 最多一次 (0 ~ 1)
{n} 出现n次
{n,} 出现n次或者多次
{n,m} 出现n到m次
JavaScript RegExp 参考手册
RegExp 对象
RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
直接量语法
1/pattern/attributes
创建 RegExp 对象的语法:
1new RegExp(pattern, attributes);
参数
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 attributes 是一个可选的字符串,包含属性 “g”、“i” 和 “m”,分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
返回值
一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。
如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 ...
cookie&&正则
cookie
1. 前言
朋友问我cookie是什么,用来干什么的,可是我居然无法清楚明白简短地向其阐述cookie,这不禁让我陷入了沉思:为什么我无法解释清楚,我对学习的方法产生了怀疑!在知乎上看到有人推荐使用费尔曼学习技巧,于是在重新学习cookie的过程中使用了该技巧来试验,效果有待验证!
在学习一个新的知识点前,我们应该明白自己的学习目标,要带着疑问去学习,该小节须要了解:
什么是cookie,cookie的作用
cookie的工作机制,即cookie是运作流程
cookie的基本属性(4个)以及我们如何使用cookie
2.什么是cookie
HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。
http协议的无状态
指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息。也就是说,HTTP请求只能由客户端发起,而服务器不能主动向客户端发送数据。
3. cookie机制
当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤:
客户端发送一个请求到服务器 --》 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 --》 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 --》服务器返回响应数据
image
为了探究这个过程,写了代码进行测试,如下:
我在doGet方法中,new了一个Cookie对象并将其加入到了HttpResponse对象中
1234567protected vo ...











