回顾:
listener(了解)
监听器,监听javaweb中三个域对象
监听对象的创建和销毁
ServletContextListener
在项目启动的时候加载配置文件
ServletRequestListener
HttpSessionListener
监听对象的属性的变化
ServletContextAttributeListener
ServletRequestAttributeListener
HttpSessionAttributeListener
监听javabean在session中状态
注意:让javabean自动感知在session中的状态,不需要在配置文件配置
HttpSessionActivationListener(钝化和活化)
HttpSessionBindingListener(绑定和解绑)
编写:
1.编写监听器
2.编写配置文件
<listener>
<listener-class>
</listener>
///////////////////////////////////
filter(★)
过滤器,过滤请求和响应
filter编写步骤:
1.编写一个类
必须实现Filter接口
必须重写方法
2.编写配置文件
注册filter
绑定路径
filter生命周期方法:
doFilter(request,response,chain)
使用步骤:
1.强转
2.编写自己的业务
3.放行
url-pattern的配置:
完全匹配
目录匹配
后缀名匹配
多个filter都匹配到的时候,执行时机是根据在xml中的filter-mapping顺序决定 filter-mapping中的两个子标签
servlet-name:过滤指定的servlet
dispatcher:过滤那种方式过来的请求
REQUEST:只过滤从浏览器发送过来的请求 (默认) 一旦显式的写出来disparcher 默认的就不起作用了
FORWARD::只过滤请求转发过来的请求 ////////////////////////////////////////////////////////////////////
注解:了解注解,可以使用注解
servlet3.0:体验下注解,完成文件上传
类加载器(了解)
动态代理(★):加强方法
////////////////////////////////////////////////////////////////////
案例1-模拟junit测试
需求:
在一个类的方法中添加一个@MyTest,在另一个类的main方法中,就可以执行带有@MyTest的方法
技术分析:
注解
反射
////////////////////////////
注解:
jdk5之后提供了一个特性,和类 接口同级
格式:
@interface 注解名{}
作用:
编译检查
替代配置文件
定义注解(元注解:注解上的注解)
分析代码(用到反射)
////////////////////////
java中3个注解(理解)
@Override:声明该方法是从分类上继承过来的,执行编译期的检查
@SuppressWarnings:抑制警告 值有好多,只需要知道一个 all 抑制所有的警告
@Deprecated:声明 该方法不赞成使用
////////////////////////
自定义注解(理解)
注解属性:
注解本质就是一个接口,接口中可以有常量和抽象方法
抽象方法在注解中就称之为注解属性
注解属性类型:
基本类型
String
Class
Annotation
Enum:枚举
以上类型对应的一维数组
注意:
一旦注解有属性了,使用注解的时候必须赋值,(除非这个注解属性有默认值) 赋值的格式:
@注解名(属性名=属性值)
若注解类型为数组,且只有一个值的时候,可以有两种写法
方式1:
属性名 = { 值 }
方式2:
属性名=属性值
若属性名为value的时候,且只需要为这个value属性赋值的时候,value可以省略 元注解:(理解)
定义在注解上的注解
@Retention 规定注解保留到什么阶段 值为RetentionPolicy的三个枚举值
SOURCE:只在代码中保留,在字节码文件中就删除了
CLASS:在代码和字节码文件中保留
RUNTIME:所有阶段都保留 @Target 规定注解作用在什么上面 值为ElementType的枚举值
TYPE:作用在类 接口 等上面
METHOD:作用方法上面
FIELD:作用字段上面
/////////////////////////////////////////////////////
步骤分析:(了解)
1.定义一个注解 @MyTest
2.在一个测试类 MyTestTest 上的添加几个方法
在方法上添加@MyTest 3.在另一个有主方法的类上添加main方法
运行main方法的时候,需要将带有 @MyTest注解的方法执行 /////////////////////////////
案例扩展:
获取连接的工具类,通过配置四个参数
步骤分析:
1.自定义一个注解JDBCInfo
添加元注解:
在程序运行的时候使用 @Retention
只能作用在方法上 @Target
添加注解属性
String driverClass() default "com.mysql.jdbc.Driver";
String url();
String username() default "root";
String password();
2.在jdbcutils工具类中提供一个getConnection,在方法上面添加一个注解 @JDBCInfo(...)
getConnection方法需要进行的操作:获取注解上的四个属性值
获取字节码文件
获取该方法上的注解
获取注解的值
3.运行的时候可以通过getConnection获取一个连接
/////////////////////////////
案例2-完成文件上传
技术分析:
文件上传
servlet3.0
commons-fileupload
框架
////////////////////////////
servlet3.0
3.0支持注解开发,没有web.xml这个文件了
内嵌了文件上传功能
/////////////////////////
例如:
创建servlet
在类上面添加 @WebServlet(urlPatterns={ "/demo2", "/demo21" },loadOnStartup=2)
创建listener
在类上添加 @WebListener
创建filter
在类上添加 @WebFilter(urlPatterns="/*")
/////////////////////
文件上传
浏览器端的要求:
表单的提交方法必须是post
必须有一个文件上传组件 <input type="file" name=""/>
必须设置表单的enctype=multipart/form-data
服务器端的要求:
servlet3.0中
需要在servlet中添加注解
@MultipartConfig
接受普通上传组件 (除了文件上传组件):request.getParameter(name属性的值)
接受文件上传组件 request.getPart(name属性的值);
getName():获取的name的属性值
获取文件名:
part.getHeader("Content-Disposition"):获取头信息 然后截取
//////////
上传注意的问题:
名字重复 随机名称
在数据库中提供两个字段,
一个字段用来存放文件的真实名称 1.jpg
另一个字段用来存放文件存放路径 g:/sdfasdf.jpg
随机名称:
uuid
时间戳
文件安全
重要的文件存放在 web-inf 或者 meta-inf 或者 服务器创建一个路径
不是很重要的文件 项目下 文件存放目录
方式1:日期
方式2:用户
方式3:文件个数
方式4:随机目录
mkdirs
///////////////////////////////////
类加载器:(了解)
类加载:
我们编写的.java文件,jvm会将变成.class文件.该文件要想运行,必须加载内存中,然后会生成一个对象.Class对象
类加载器层次结构
引导类加载器 rt.jar
扩展类加载器 ext/*.jar
应用类加载器 我们自己编写类
全盘负责委托机制:
当一个类运行的时候,有可能有其他类,应用类加载器询问扩展类加载器:你加载过这些类吗?
扩展类加载器在向上问(引导类加载器):你加载过这些类吗?
引导类加载器:我查查,有一个是我负责,我加载.
扩展类加载器:接下来我来查,有几个是我负责,我加载,还有几个类我已经加载完成了,你可以直接使用
应用类加载器:收到了 剩下的我来
////////////////////////
案例3-统一编码
技术分析:
动态代理
/////////////////////
静态代理书写步骤:
1.要求被装饰者和装饰者实现同一个接口或者继承同一个类
2.在装饰者中要有被装饰者的引用
3.对需要加强的方法进行加强
4.对不需要加强的方法调用原来的方法
////////////////////////////
动态代理:
在项目运行的时候才创建一个代理对象,对方法进行增强(控制)
方式1:
jdk中Proxy类,前提:实现接口
方式2:
spring中cglib,前提:继承类 动态的在内存中创建一个代理对象
Object Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
参数说明:
ClassLoader:代理对象类加载器 一般我们使用的是被代理对象的类加载器
Class[]:代理对象需要实现接口 一般我们使用的是被搭理对象所实现的所有接口
InvocationHandler:执行处理类.在这里面对方法进行加强 invocationHandler中只有一个方法
Object invoke(Object proxy, Method method, Object[] args)
参数说明:
proxy:代理对象
method:当前执行的方法
args:当前方法执行的时候所需要的参数
返回值:就是当前method对象执行的返回值
//////////////////////////////////////////////////
步骤分析:
过滤器
doFilter(Request request,Response response) 将代理request传递过去
doFilter(Request requestPrxoy,Response response) ////////////////////////////////////////////////
////////////////////////////////////////////////
////////////////////////////////////////////////
上午回顾:
注解:
注释:给程序员看的
注解:给jvm看的 java中三个注解:
@Override:声明该方法是从父类上继承过来的
@SuppressWarnings:抑制警告
@Deprecated:声明该方法不赞成使用 自定义注解:
注解属性
类型:
基本类型
string
class
annotation
enum
以上类型的一维数组
若有属性,使用的时候必须有值 元注解
@Retention:声明注解保留到那个阶段
SOURCE:
CLASS:
RUNTIME:
@Target:声明注解作用在那个部分
TYPE:
METHOD:
FILED:
注解的格式:
@interface 注解名{ }
///////////////////////////////////
///////////////////////////////////
servlet3.0
注解开发
@WebServlet(urlPatterns="/demo1")
@WebListener
@WebFilter(urlPatterns="/demo2") 文件上传
浏览器端的要求:
表单的提交方式必须是post
表单必须有文件上传组件
表单的enctype属性值为 multipart/form-data 服务器获取的时候
servlet3.0要求
添加一个@MultipartConfig
获取普通的组件
request.getParameter(name属性的值)
获取文件上传组件
Part part=request.getPart("name属性的值") //获取文件的名称
Stirng sss=part.getHeader("content-disposition")
//然后截取才能获取文件名称
sss.substring(sss.indexof("filename=")+10,sss.length-1); //获取文件流
part.getInputStream(); //删除临时文件
part.delete() 上传时候需要注意的问题:
文件重名 随机名称
文件安全 重要的文件放在 web-inf meta-inf 服务器磁盘
目录分离
时间
用户
文件个数
随机目录 //////////////////////////////////////////
动态代理(★)
jdk中proxy
前提:实现接口 Proxy.newProxyInstance(被代理对象.getClass().getClassLoader(),被代理对象.getClass().getInterfaces(),new InvocationHandler(){
invoke(代理对象,当前执行的方法,需要的参数){ }
});

day-17(基础加强)的更多相关文章

  1. Django_ORM操作 - 查询

    ORM 操作 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(* ...

  2. Linux架构之Nginx 高可用

    第53章 Nginx之高可用Keepalived 一.Keepalived高可用基本概述 1.1)什么是高可用 一般是指2台机器启动着完全相同的业务系统,当有一台机器down机了,另外一台服务器就能快 ...

  3. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  4. [.net 面向对象编程基础] (17) 数组与集合

    [.net 面向对象编程基础] (17) 数组与集合 学习了前面的C#三大特性,及接口,抽象类这些相对抽象的东西以后,是不是有点很累的感觉.具体的东西总是容易理解,因此我们在介绍前面抽象概念的时候,总 ...

  5. linux基础-基本命令的讲解(1-7单元)

    基本命令的讲解 主要内容介绍 1.LINUX操作系统安装及初始化配置(熟悉):2.LINUX操作系统目录组成结构及文件级增删改查操作(重点):3.LINUX操作系统用户.权限管理(重点):4.开源软件 ...

  6. React JS 基础知识17条

    1. 基础实例 <!DOCTYPE html> <html> <head> <script src="../build/react.js" ...

  7. 从零开始之ecshop基础篇(17)

    目标:基于自定义的mvc框架开发的案例(项目) 项目周期    需求分析 典型的业务逻辑:    电子商务:商城(京东),B2C,C2C(淘宝),团购,秒杀,代购 内容管理:新浪门户类,优酷视频管理, ...

  8. Delphi一共封装(超类化)了8种Windows基础控件和17种复杂控件

    超类化源码: procedure TWinControl.CreateSubClass(var Params: TCreateParams; ControlClassName: PChar); con ...

  9. 重新想象 Windows 8 Store Apps (17) - 控件基础: Measure, Arrange, GeneralTransform, VisualTree

    原文:重新想象 Windows 8 Store Apps (17) - 控件基础: Measure, Arrange, GeneralTransform, VisualTree [源码下载] 重新想象 ...

  10. SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识

    原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息 ...

随机推荐

  1. Centos使用虚拟环境创建python django工程

    本地环境 通常我们登录就是后就是本地环境 本地环境下查看pip安装了那些包 pip3 list 可以看到本地环境下我们安装的是django1.11.16版本,现在我有个项目要使用django 2.0以 ...

  2. django CBV视图源码分析

    典型FBV视图例子 url路由系统 from django.conf.urls import url from django.contrib import admin from luffycity.v ...

  3. JAVA spring配置文件总结

    首先来看一个标准的Spring配置文件 applicationContext.xml <?xml version="1.0" encoding="UTF-8&quo ...

  4. 异步、+回调机制、线程queue、线程Event、协程、单线程实现遇到IO切换

    # from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor # import requests # import o ...

  5. 【XSY1591】卡片游戏 DP

    题目描述 有标有数字为\(1\)~\(9\)的卡片各\(a_1,a_2\cdots a_9\)张,还有标有乘号的卡片\(m\)张.从中取出\(n\)张按任意顺序排列,取出两个乘号相邻和乘法在边界上的非 ...

  6. MySql的CURRENT_TIMESTAMP

    在创建时间字段的时候 DEFAULT CURRENT_TIMESTAMP表示当插入数据的时候,该字段默认值为当前时间 ON UPDATE CURRENT_TIMESTAMP表示每次更新这条数据的时候, ...

  7. 基于 __new__ 方法的单例模式

    单例模式定义 首次实例化创建实例化对象 之后的每次实例化都用最初的实例化对象 即单实例模式 __new__ 的原理 __new__ 方法可以在 __init__ 方法执行 这样可以在初始化之前进行一系 ...

  8. MT【245】小概率事件

    (2011年AAA测试)将一枚均匀的硬币连续抛掷$n$次,以$P_n$ 表示未出现连续3次正面的概率.求$\{P_n\}$.并讨论$\{P_n\}$单调性和极限. 分类讨论:第$n$次反面则未出现连续 ...

  9. Nagios 监控 Mysql

    被监控机的Mysql监控创建专用数据库.专用数据库账户mysql -uroot -pcreate database nagios_monitor;grant select on nagios_moni ...

  10. Keepalived+Nginx搭建主从高可用并带nginx检测

    应用环境:部分时候,WEB访问量一般,或者测试使用,利用Keepalived给Nginx做高可用即可满足要求. 测试环境:   搭建步骤: 1. 安装软件 在Nginx-A和Nginx-B上: ~]# ...