Javaweb的三大组件:Servlet,Filter,Listener;
复习JavaWeb filter流程 Listener八个:ServletRequest(2)、HttpSession(2)、ServletContext(2)
2:生命周期监听器,属性变化监听器
4(HttpSession):除了上面那两个外,还有额外的两个(活化钝化监听器、绑定解绑监听器)
掌握的监听器:
ServlertContextListener(生命周期):监听ServletContext的创建和销毁(监听服务器的启动和停止);服务器启动创建一个ServletContext对象,服务器停止,销毁创建的ServletContext对象;
ServletContext:
1、一个web项目对应一个ServletContext,它代表web项目的信息
2、还可以作为最大的域对象在整个项目的运行期间共享数据
监听器的使用方法:
1.先实现对应的监听器接口
2.去web.xml进行配置;注意:有两个Listener是JavaBean需要实现的接口,(HttpSessionActivitionListener,HttpSessionBindingListener)
AJAX和JSONJSON:(js对象表法)是一种轻量级的数据交换格式(与xml相比较)
一个复杂的js对象
var student = {
lastName: "张山",
age: 18,
car: {pp: "baoma", price: "15555555555"},
infos: [{bookName: "西游记", price: 19}, 18, true]
};
如果服务器返回给浏览器的样子是js对象这个样子的,浏览器使用js解析就很方便;
JSON
//json要求和js对象是一样的,只不过key必须是字符串
//js对象在声明的时候是否加双引号是可以选择的
var student2 = {
"lastName": "张山",
"age": 18
};
//JSON(js的内置对象)这个是js提供的将js对象转换成json(应该是js对象的字符串表示法)字符串
var strjson= JSON.stringify(student2);
alert(typeof strjson);
alert(strjson);
两个重要的API:
1、将js对象转换为JSON
JSON.stringify(js对象)
2、将JSON对象转换成js’对象
JSON.parse(JSON对象);AJAX
AJAX:synchronous Javascript And XML(异步Javascript和XML)
AJAX:是一种无刷新页面与服务器的交互技术。(保持页面不刷新就能得到服务器的数据)
原来的交互:
1、发送请求
2、服务器收到请求,调用队对应的servlet进行处理;servlet处理完成之后会有响应信息生成;
3、浏览器收到了服务器响应的数据,把之前的页面清空,展示新的数据;(效果就是页面刷新)
现在的交互:(XmlHttpRequest对象)
1、XmlHttpRequest对象帮我们发送请求
2、服务器收到请求后,调用对应的servlet进行处理;servlet处理完成会有响应信息生成;
3、XmlHttpRequest对象收数据(浏览器就感受不到这个数据了;xml对象收到这个数据)
将fJava中的Object对象转换成Json对象的包
代码演示:
Mapmap = new HashMap<>(); map.put("lastName","zs"); map.put("age",18); //1、转成json Gson gson = new Gson(); String str = gson.toJson(map); response.getWriter().write(str);
引入的依赖:(去maven仓库下载就可以了)
com.google.code.gson gson 2.8.6
改变了我们传统的交互反射光hi就
1、发请求;
2、服务器收到请求,处理请求经常要给页面携带数据。request.setAtteribute(“map”,map);转发到页面
3、浏览器收到页面数据,在页面中使用el表达式获取数据;
导致页面整个刷新,造成了很大的服务器负担;
只让服务器返回我们需要的部分数据即可;不用返回整个页面;xhr代替浏览器来接收响应,发送请求;利用dom增删给的方式改变页面的效果;
异步无刷新页面技术
异步:不会阻塞浏览器
同步:会阻塞浏览器;因为需要等到服务器处理完整个请求,完成响应后才能做其他事情
什么是ajax:
ajax就是xhr对象向服务器发送请求,并受到响应数据,利用dom增删改的方式改变页面效果
Ajax中get请求和post请求的用法是一样的,只是一个发送的是get请求一个发送的是post请求,区别是get请求时将数据封装在请求的?后面,而post请求是将数据封装在了请求体中
post请求封装的数据
get请求封装数据
IOC和DIIOC:(Inversion(反转) Of Control)控制反转;
控制:资源获取的方式;
主动式:(要什么资源都自己创建即可)
BookServlet{
BookService bs= new BookService();
AirPlane ap=new AirPlane();
}
被动式:资源的获取不是我们自己创建,而是交给一个容器来创建和设置;
BookService{
BookService bs;
public void test01(){
bs.checkout();
}
}
容器:管理所有的组件(有功能的类)
假设,BookServlet受容器管理,BookService也受容器管理;容器可以自动的探查出那些组件(类)需要用到另一写组件(类)﹔容器帮我们创建BookService对象,并把BookService对象赋值过去;
容器:主动的new资源变为被动的接收咨源·
(容器)婚介所:主动获取变为被动接收;
DI(Dependency Injection)依赖注入;
容器能知道哪个组件(类)运行的时候,需要另一个类(组件);容器通过反射的形式,将容器中准备好BookService对象注入(利用反射给属性赋值)到BookServce中
HelloWorld;(通过各种方式给容器中注册对象(类似于婚庆所的注册会员)),以前是自己new对象现在所有的对象都交给容器创建;给容器中注册组件
以后编写的流程;
HelloWorld
1、导包(4个jar包:spring-context、spring-core、spring-beans、spring-expression)
org.springframework
spring-context
5.3.9
org.springframework
spring-core
5.3.9
org.springframework
spring-beans
5.3.8
org.apache.logging.log4j
log4j-core
2.14.0
org.springframework
spring-expression
5.3.9
2、写配置(ioc.xml)
3、测试 (ClassPathXmlApplicationContext当前配置文件在ClassPath下)
@Test
public void test(){
//ApplicationContext:表示ioc容器
//当前应用的xml配置文件在内路径下
//ClassPathXmlApplicationContext当前配置文件在ClassPath下
//根据Spring的配置文件得到ioc容器对象
ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc.xml");
Person person = ioc.getBean("person", Person.class);
System.out.println(person);
}
//结果 Person{lastName='张三', age=18, gender='男', email='zs@guigu.com'}
HelloWorld的小总结
有几个小细节:(对象的创建都是通过反射来实现的)
1、ApplicationContext(IOC容器的接口)
2、给容器注册了一个组件;我们也从容器中按照id拿到了这个组件的对象?
组件的创建工作是容器来替我们完成的
* Person对象是什么时候创建好的呢?
* 容器中对象的创建是在容器创建完成之后就已经创建好了;
3、同一个组件在ioc容器中是单实例的,容器启动完成就已经创建好了
4、容器中如果没有这个组件,获取组件会报异常
* org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'person3' available
5、ioc容器在创建这个组件对象时,(property)会利用setter方法为JavaBean的属性赋值
6、JavaBean的属性名使用什么决定的?getter/setter方法,属性名是去掉set,后面那串字母首字母小写
* 注意不要随便该getter/setter,所有的getter/setter都要自动生成泛型依赖注入的原理 将数组转换成集合
Arrays.asList(数组名)AOP 如何将Spring中的一个类定义为一个切面类
将Spring中的一个类定义为切面类
在类上加上@Aspect 和 @Component这两个注解
其中@Aspect的作用是将这个类声明为一个切面类
@Component这个注解的作用是表示将这个类注入到IOC容器中
在以下方法上面加上这些注解之后,还得在注解里面加上execution()
@Before:在目标方法执行之前运行 前置通知
@After:在目标方法执行完成之后运行 后置通知
@AfterReturning:在目标方法正常返回后 返回通知 这个注解里面可能还要加上
@AfterReturning(value = "hahaMyPoint()" ,returning="result") @AfterReturning 这个注解里面可能还要加上returning的值用来表明返回的执行结果
@AfterThrowing:在目标方法抛出异常后执行 异常通知
@AfterThrowing(value = "hahaMyPoint()",throwing="exception") 这个注解也有可能要加上throwing,用来表示返回的异常信息
代码演示
//想在目标方法出现异常后执行
// @AfterThrowing(value = "execution(public int com.pzx2.impl.MyMathCalculator.*(int ,int ))",throwing="exception")
@AfterThrowing(value = "hahaMyPoint()",throwing="exception")
public static void logException(JoinPoint joinPoint , Exception exception) {
Signature signature = joinPoint.getSignature();
String name = signature.getName();
System.out.println("[LogUtils-异常]【"+name+"】方法出现异常了,异常信息是"+exception+ ":已经通知测试小组进行排查");
}
@Around:环绕 (这个功能最强大) 环绕通知
四个通知方法的执行顺序
try {
@Before
method.invoke(obj,args);
@AfterReturning
} catch (Exception e) {
@AfterThrowing
} finally {
@After
}
切入点表达式的几种常见的写法
切入点表达式的固定写法
固定格式:execution(访问权限符 返回值类型 方法的全签名(参数类型))
将切入点表达式抽取出来可重复使用(同一个类里面的引用直接用方法名加上参数列表即可,而不是同一个类之间的引用的话要用全类名)
@Pointcut("execution(* com.pzx2.impl..MyMathCalculator.*(..))")
public void hahaMyPoint(){
}
环绕通知代码演示
@Around("hahaMyPoint()")
public Object myAround(ProceedingJoinPoint pjp) {
Object proceed=null;
Signature signature = pjp.getSignature();
String name = signature.getName();
try {
Object[] args = pjp.getArgs();
//利用反射推进目标方法即可,就是method.invoke(obj,args);
//Before
System.out.println("【环绕前置】【" + name + "方法开始】");
proceed = pjp.proceed(args);
//@AfterReturning
System.out.println("【环绕返回通知】【"+name+"方法返回,返回值"+proceed+"】");
} catch (Throwable throwable) {
//@AfterThrowing
System.out.println("【环绕方法出现异常】【" + name + "】方法出现异常,异常原因:" + throwable);
//为了让外界知道这个原因,这个异常一定要抛出去
throw new RuntimeException(throwable);
} finally {
// @After()
System.out.println("【环绕后置通知】 【" + name + "】方法结束");
}
//反射调用后,返回值一定也返回出去
return proceed;
}
当普通方法与环绕方法一起执行的时候的方法执行顺序
Spring5的执行顺序
环绕前置–>普通方法前置–>目标方法执行–>普通正常返回/出现异常–>普通后置–>环绕正常返回/出现异常–>环绕后置
多切面执行顺序 xml格式配置通知方法
高版本的tomcat,在SpringMVC使用DELETE、PUT请求时爆错405
解决办法,在jsp页面上加上
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %> 其实主要是加上isErrorPage="true" ,告诉tomcat可能会报错
ModelAttribute原理
SpringMVC的运行流程SpringMVC和Spring进行整合时,Spring的Service不能自动装配SpringMVC的Controller是因为在Spring中默认讲Spring作为父容器,SpringMVC作为子容器。子容器可以拿父容器的东西,父容器不能拿子容器
mybatis中的知识点的简单记录https://199604.com/709
mybatis中一级缓存和二级缓存的示意图


