一、监听器
概念:Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等作用域对象的创建于与销毁时间,以及监听这些作用域对象中属性发生修改的事件
作用:监听request、session、application三个域对象的创建、销毁和数据的变更
使用流程:
1.创建java类实现指定的接口
监听request的创建和销毁:ServletRequestListener
ServletRequestEvent可以获取当前监听到的request对象,对request对象的中的资源进行操作。
监听request作用域数据的变更:ServletRequestAttributeListener,可以获取当前被监听到的request中的数据。
getName()返回监听到的数据的键和getValue()返回监听的到的数据的值。
监听session的创建和销毁:HttpSessionListener
获取当前被监听到的session对象
监听session的作用域数据的变更:
获取当前监听到的session中的数据 getName()返回数据的键名,getValue()返回数据的值
监听application对象的创建和销毁:ServletContextListener
获取application对象
监听application对象的数据的变更:ServletContextAttributeListener
形参:获取当前被监听的数据 getName()返回数据的键名,getValue()返回数据的值
2.配置web.xml文件,写入实现类的全限定类名
eg:<!-- 配置监听器 -->
<listener>
<listener-class>要配置监听器的全限定类名</listener-class>
</listener>
二、ServletRequest和HttpServletRequest的区别
1.HttpServletRequest和ServletRequest都是接口HttpServletRequest继承自ServletRequest HttpServletRequestServletRequest多了一些针对于Http协议的方法。如getHeader(), getMethod(),getSession()等等。
2.客户端浏览器发出的请求被封装成为一个HttpServletRequest 对象。对象包含了客户端请求信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统都包含在其内。
3.当HTTP转发给Web容器处理时,Web容器会收集相关信息,并产生HttpServletRequest √对象,使用这个对象可以取得所有HTTP请求中的信息,可以在Servlet中进行处理,也可以转发给其他的Servlet/Jsp处理。
4.ServletRequestListener 用于监听ServletRequest对象的创建和销毁,一个ServletRequest可以注册多个ServletRequestListener接口,request创建时调用requestInitialized(),request销毁时调用requestDestroyed()
三、监听器案例之当前在线人数统计
每当有一个访问连接到服务器时,服务器就会创建一个session来管理会话。那么我们就可以通过统计session的数量来获得当前在线人数。所以使用到的是HttpSessionListener监听器。
四、过滤器
1.概念:过滤器是处于客户端与服务器 √资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应
2.使用
a、创建一个普通java类并实现过滤器接口Filter
b、在web.xml中配置过滤器
<!-- 配置监听器 -->
<filter>
<filter-name>过滤器名称</filter-name>
<filter-class>要配置的过滤器的全限定类名</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>url</url-pattern>
</filter-mapping>
3.方法:
a、doFilter方法,作用:服务器在接收到浏览器发过来的请求后,先解析请求信息,创建request对象和response对象,然后根据url地址判断如果符合过滤器的过滤范围,则会调用过滤器中的doFilter来进行请求拦截,并将request和response对象作为实参传递给doFilter方法,我们可以在doFilter方法中声明过滤器拦截代码
参数:ServletRequest:接收此次拦截的请求的request信息
ServletResponse:接收此次拦截的请求的response信息
FilterChain放行:
b、init方法,作用:服务器启动时调用
c、destory方法,作用:服务器关闭时调用,证明了过滤器的生命周期为服务器开启到服务器关闭
4.url配置
1.全部拦截 /*
2.部分拦截 *.xxxx
3.指定拦截 /xx.xx
5.注意:过滤器之间会出现多重拦截,访问顺序会和配置顺序有关
五、过滤器解决post乱码问题
方式一:
方式二、先在web.xml文件中配置
再次理解MVC分层思想
视图层(View,jsp页面)发送请求到控制器层(servlet),
控制层调用模型层执行相应操作(JDBC增删改查)
最后模型层将结果返回给servlet,serlvet在转发/重定向给视图层,jsp页面再将数据取出,展示处理