1.// -->
path.split("")[path.split("").length - 1]
pos = lastIndexOf("") substring(pos)
subString
File
2.递归 返回 结果问题
要递归 你现在有返回了 下次我递归的时候我返回什么了?
所以将结果装到一个容器,通过调用它的程序给它一个容器,递归的时候将结果放到容器中
3.Filter
拦截的是服务器拿页面
javax.Servlet.Filter 接口
在web.xml中 注册和要拦截的资源
过滤器是给服务器调用的,要想给服务器调用,在web.xml中注册,设置要拦截的资源
//向服务器注册
<filter>
<filter-name></filter-name>
<filter-class></filter-class> 包.类名
<init-param>
<param-name></param-name>
<param-value></param-value>
</init-param>
</filter>
//告诉服务器要拦截的路径是啥
<filter-mapping> //多次
<filter-name></filter-name>
<url-pattern></url-pattern> /*和*.XXX
</filter-mapping>
filter链 ---> 对象
4.Servlet 实例化 load-on-startup 浏览器访问
销毁 服务器不关
Filter web容器在启动时,会自动扫描是否 配置filter
为多个用户 -->多个用户访问同一个资源
<url-pattern> 或 <servlet-name> 请求路径 或 名称
<dispatcher> 指定过滤器所拦截资源被web容器调用的方式
web容器调用的方式:
浏览器访问
forward
include
error 跳转
dispatcher:
FORWARD, REQUEST(default), INCLUDE, ERROR(要服务器报错,要是多个错咧,怎么办)
多个组合,看与老师的结论是够一致
5.Filter工作原理
创建 销毁 由web服务器调用
init(FilterConfig config)
FilterConfig
web容器会将初始化信息封装成对象config传给它
init-param ... 又回到了以前,用它的几种方法
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
和service()差不多嘛,每次访问拦截资源都会执行
拿到了:请求 、响应
FilterChain Filter链 --> 对象
chain.doFilter(request, response); //放行
放行 让web服务器去访问filter链接的下 一个filter,要是没有,web服务器就访问目标资源
优先级:注册时,最先能拦截的优先级高
destory
6.案例:统一全站字符编码的过滤器
配置文件 ---> 初始化
7.案例:禁止缓存,对JSP过滤
三句话
但是 图片 CSS要缓存
img src="XXX" 浏览器会向服务器发两次请求 第一次请求 第二次请求:发现有img,会向服务器发第二次请求
HTTP1.1 保持连接了?
一次请求+100张图片的请求+100张CSS的请求
减小服务器的链接数:把很多个合为一个
服务器会缓存
8.权限
实现URL级别的权限认证
动态代理:调用方法的拦截 颗粒度更精确
通过改变url-pattern
/admin/XXX
/visitor/YYY
init
substring contains
跳转后要return
9.中文空格和英文空格
10.this.getClass().getClassLoader().getResourceAsStream(XXX)
.getResource(XXX) 返回url,传给document = reader.read(url)
都在classpath
要是XXX有两个,放在不同的文件夹下,它找谁?
11.权限
大于什么的权限 manage 既有manage的权限又有user的权限
user的权限 的roles都有(admin,manager,user)
用过滤器的URL实现权限
只需将新的JSP/Servlet 映射就可以了
/admin/XXX
/manage/YYY
/user/ZZZ
12.注册 授权 checkbox EL JSTL
13.对request, response包装后传给chain.doFilter(request,response)
14.过滤器 乱码
对GET方式没办法 request.setCharacterEncoidng
getParameterValues getParameter(XXX)
问题:没有setParameter
用包装 将request包装了再放行
15.压缩 流量 包装
16.包装设计模式:
1.想对哪个对象增强,就在包装类里面定义一个相应类型的变量
2.定义一个构造函数接受相应的对象
3.想对 对象哪个方法进行增强,就覆盖相应的方法
4.包装类和被包装的类 所属于同一个父类
17.Filter
透明的 耦合性低
想它干就在web.xml中配置,不想它干就不在web.xml中配置
18.动态代理 CGLIB
动态代理 要一个父类
CGLIB 没有父类也可以,它是用的子类的思想