本帖最后由 小石姐姐 于 2019-7-4 09:46 编辑
第一部分:监听器(组成和分类)
1、监听器的概述
1.1 一个类监听另一个java的变化
1.2 组成
(1)事件源:汽车
(2)监听器:报警器
(3)在事件源绑定监听器:在汽车上安装报警器
(4)事件:踢汽车一脚,报警器会响
(5)在js里面 button,绑定事件 onclick
(6)点击button按钮,触发onclick事件,调用onclick里面的方法执行
1.2 javaweb中的监听器(三类)
(1)创建监听器步骤
= 创建servlet的步骤:
== 创建类继承HttpServlet,doget和dopost方法
== 在web.xml中配置
第一类:监听三个域对象的创建和销毁
(1)servletContext:范围整个web项目。服务器启动时候创建,服务器关闭销毁
= 创建类实现接口 ServletContextListener
== 两个方法
=== contextInitialized(ServletContextEvent sce) :servletcontext域对象创建时候执行这个方法
=== contextDestroyed(ServletContextEvent sce) :servletcontext域对象销毁时候执行这个方法
= 在web.xml中配置
<listener>
<listener-class>cn.itcast.listener01.TestContextListener</listener-class>
</listener>
(2)session:范围会话。request.getSession()创建。
session销毁有三种方式:调用方法;默认过期时间30分钟;非正常关闭服务器销毁
cookie分成两类:
= 会话级别的cookie:关闭浏览器cookie销毁
= 持久化的cookie:在一定时候一直有效,使用方法 setMaxAge(秒)
= 销毁持久化cookie:setMaxAge(0),路径一致 setPath("/");
关闭浏览器session是否销毁?不会销毁
= 创建列实现接口 HttpSessionListener
== 方法:
=== sessionCreated(HttpSessionEvent se) :session创建时候执行这个方法
=== sessionDestroyed(HttpSessionEvent se) :session销毁时候执行这个方法
= 在web.xml中进行配置
= 问题:
访问一个JSP会不会创建session? 默认会创建session对象
访问一个Servlet会不会创建session? 不写request.getSession(),不会创建session对象
访问一个html会不会创建session? 不会
(3)request:范围一次请求
= HttpServletRequest 和 ServletRequest
= 创建类实现ServletRequestListener 接口
= 两个方法:
== requestInitialized(ServletRequestEvent sre) :request创建时候执行这个方法
== requestDestroyed(ServletRequestEvent sre) :request域销毁时候执行这个方法
问题:
访问JSP的时候会不会创建request对象? 会创建request对象
访问Servlet的时候会不会创建request对象? 会创建request对象
访问一个html的时候会不会创建request? 会创建request对象
= 技巧:ctrl f5 无缓存刷新
= 如果在servlet里面向域对象设置值,在jsp获取域对象里面的值
== el表达式
== jstl标签库的forEach标签
<c:forEach var="" items="">
第二类:监听三个域对象里面的属性的变化(添加值,替换,移除)
= 向域对象添加值 使用setAttribute("itcast","aa")
= 替换值: setAttribute("itcast","bb")
= 移除:removeAttribute();
(1)实现接口
ServletContextAttributeListener:监听servletcontext域属性的变化
= attributeAdded(ServletContextAttributeEvent scab) :向域对象添加值执行这个方法
= attributeReplaced(ServletContextAttributeEvent scab) 替换域对象添加值执行这个方法
= attributeRemoved(ServletContextAttributeEvent scab) :移除域对象添加值执行这个方法
HttpSessionAttributeListener :监听HttpSession域属性的变化
= attributeAdded(HttpSessionBindingEvent se) :向域对象添加值执行这个方法
= attributeReplaced(HttpSessionBindingEvent se) :替换域对象添加值执行这个方法
= attributeRemoved(HttpSessionBindingEvent se) :移除域对象添加值执行这个方法
ServletRequestAttributeListener:监听Request域属性的变化
= attributeAdded(ServletRequestAttributeEvent se) :向域对象添加值执行这个方法
= attributeReplaced(ServletRequestAttributeEvent se) :替换域对象添加值执行这个方法
= attributeRemoved(ServletRequestAttributeEvent se) :移除域对象添加值执行这个方法
= 在jsp中嵌入java代码有三种方式
<%! %>: 定义的变量成员变量
<%= %>
<% %>
= 代码
<%-- 向session域里面设置值,替换值,移除值 --%>
<%
//设置值
session.setAttribute("aa", "itcast");
//替换值
session.setAttribute("aa", "itheima100");
//移除
session.removeAttribute("aa");
%>
第三类:监听session域里面javabean的变化
(0)两个特点:
第一个要求:不需要配置,自动感知到
第二个要求:在javabean里面直接实现接口
= 在javabean里面实现这个 HttpSessionBindingListener接口
(1)绑定 :把javabean放到session里面
(2)解除绑定 :从session域里面把javabean移除
= 在javabean里面实现HttpSessionActivationListener接口
(3)钝化 :正常关闭服务器,把session序列化到本地硬盘
(4)活化 :反序列化到项目中
= 如果进行session序列化的操作时候,session里面的对象必须实现序列化接口的对象
1.4 监听器总结
(1)监听器的组成
(2)javaweb中三类监听器
第三类:监听监听session域里面javabean的变化(绑定、解除绑定、钝化、活化)
= 不需要配置,实现接口在javabean里面实现
(3)三个域对象创建和销毁
(4)访问jsp、servlet、html是否会创建session对象?
(5)访问jsp、servlet、html是否会创建request对象?
第二部分:过滤器(重点)
1、什么是过滤器
1.1 发送请求,到目标资源之前,进行过滤
1.2 饮水机:到饮水机节水,最终的目的:到杯子中,到杯子之前,经过过滤网(过滤)
1.3 地铁安检:到列车上,到列车之前,安检(过滤)
1.4 烟:香烟主体(纸+烟草)+ 过滤嘴
1.5 过滤敏感词汇
1.6 javaweb的过滤器都可以过滤 servlet、jsp、html
2、实现过滤器
2.1 创建类实现接口 Filter接口,实现接口里面的三个方法
2.2 在web.xml中配置
<filter>
<filter-name>filter01</filter-name>
<filter-class>cn.itcast.filter01.TestFilter01</filter-class>
</filter>
<filter-mapping>
<filter-name>filter01</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.3 过滤器的入门案例
(1)在创建类中实现三个方法,doFilter方法,实现过滤的逻辑
(2)过滤之后,放行,只有放行到目标资源
//放行到目标资源
chain.doFilter(req, resp);
3、FilterChain对象的简介
3.1 方法:doFilter(ServletRequest request, ServletResponse response) ,放行操作
3.2 过滤链:一个请求可以 被 多个过滤器进行过滤,每个过滤器只有做放行才可以到下一个过滤器
3.3 如果配置多个过滤器,过滤器执行顺序与下面配置有关
<filter-mapping>
<filter-name>filter02</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、过滤器的生命周期
4.1 servlet的生命周期:
(1)第一次访问时候创建,init方法
(2)每次请求servlet,调用service方法
(3)servlet销毁时候,调用destroy方法
4.2 servlet在服务器启动时候创建
(1)<load-on-startup>2</load-on-startup>
4.3 过滤器的生命周期
(1)过滤器什么时候创建:服务器启动时候创建,执行init方法
(2)每次访问请求时候,如果过滤器可以过滤到,执行doFilter方法
(3)过滤器销毁,执行destroy()方法
5、FilterConfig对象的介绍
5.1 在servlet里面对象servletConfig
5.2 做三件事情
第一件:获取过滤器的名称 getFilterName()
第二件:获取初始化参数
(1)在过滤器里面配置初始化参数
<filter>
<filter-name>filter03</filter-name>
<filter-class>cn.itcast.filter01.TestFilter03</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>mary</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1314520</param-value>
</init-param>
</filter>
(2)String getInitParameter(String name) :根据参数的名称得到值
(3)Enumeration getInitParameterNames() :获取所有的初始化参数的名称
(4)代码
//获取初始化参数
//根据名称参数的值
String username = config.getInitParameter("username");
String password = config.getInitParameter("password");
System.out.println("************** "+username+" :: "+password);
System.out.println("==========================");
//得到所有的初始化参数的名称
Enumeration<String> enumration = config.getInitParameterNames();
//获取每一个名称
while(enumration.hasMoreElements()) {
String name = enumration.nextElement();
//根据名称得到值
String value = config.getInitParameter(name);
System.out.println("++++++++ "+name+" :: "+value);
}
第三件:获取servletcontext对象,getServletContext()
(1)直接使用 getServletContext()方法得到servletcontext对象
6、过滤器的配置
6.1 在 <filter-mapping>里面配置
(1)<url-pattern>
= 有三种
== 完全路径匹配 /servlet1
== 目录匹配 /aa/* /*
== 扩展名匹配 *.action *.do
== 优先级:完全 > 目录 > 扩展名
(2)<servlet-name>:专门过滤某一个servlet
(3)<dispatcher>:
REQUEST: 过滤请求,默认就是这个值
FORWARD:专门过滤转发的操作
INCLUDE:过滤包含
ERROR:异常 |
|