1Servlet规范有三个高级特性
分别是Filter、Listener和文件的上传下载。Filter用于修改request、response对象,Listener用于监听context、session、request事件。
熟悉Filter的生命周期
了解Filter及其相关API
掌握Filter的实现
掌握Filter的映射与过滤器链的使用
熟悉Listener及相关API
熟悉Servlet 3.0新特性
掌握文件上传和下载
怎么才能一个接一个跳转过滤器呢,Filter及其相关API
右击创建Filter,
这个名字就是Filtername
拦截的是什么,myserlet
在外面myserlet内容执行前就执行我们的Filter里面的内容
首先@WebFilter(filterName = "MyFilter01",urlPatterns = "/MyServlet")
//@WebFilter(filterName = "MyFilter",urlPatterns = "/*")//拦截用户所以请求
Filter接口:就可以用,init,doFilter,destroy,
FilterConfig接口:放在doFilter作为参数.doFilter()方法用于调用过滤器链中的下一个过滤器,如果这个过滤器是链上的最后一个过滤器,则将请求提交给处理程序或将响应发给客户端。
FilterChain接口:放在doFilter作为参数
有了上面就可以第一个过滤器调用 了doFilter()第二个过滤器,第二个过滤器调用 了doFilter()第三个过滤器
有什么用---不同的Web资源中的过滤操作可以放在同一个Filter中完成,这样可以不用多次编写重复代码,从而提高了程序的性能。
Filter过滤器]拦截,,,,客户端与处理程序servlet之间的可以有n个过滤器
创建阶段
,在一次完整的请求当中,Filter对象只会创建一次,init()方法也只会执行一次。
doFilter()方法可以执行多次。
服务器关闭时,Web服务器调用destroy()方法销毁Filter对象
拦截不同方式的请求,例如jsp界面
为什么还要这种方式呢因为一般都是拦截一个servlet的开始例如
dispatcherTypes = DispatcherType.FORWARD
@WebFilter注解有一个特殊的属性dispatcherTypes,它可以指定过滤器的转发模式,dispatcherTypes属性有4个常用值,REQUEST、INCLUDE、FORWARD和ERROR。
那么与有什么不同呢
这个forward是在转发的时候才拦截REQUEST、INCLUDE,ERROR都一样
这个是拦截我进入first.jsp的
过滤链使用(doFilter)
使用Filechain对象第一个过滤器调用 了doFilter()第二个过滤器,第二个过滤器调用 了doFilter()第三个过滤器
访问MyServlet后哎,就是按照MyFilter01MyFilter02MyFilter03MyFilter04MyFilter05MyFilter01MyFilter06执行
不存在MyFilter00
----
chain.doFilter(request, response);这个是到哪里去的到我们真实的MyServlet然后这句话结束你看
对cookie拦截注册案例:
需要:AutoLoginFilter,LoginServlet,login.jsp,index.jsp
先login.jsp的action跳转到LoginServlet进行校验用户名密码和几月份,
response.sendRedirect(request.getContextPath()+"/index.jsp");为什么要加getContextPath呢,我们要跳转到我们的项目目录下面,不是服务器 的根目录所以要加这个,如对cookie拦截:可以对所有请求进行拦截 那我们就可以获取用户名密码
action到我们的第一个servlet判断,用户名等正确创建User对象封装起来,用session设置属性,不是空加到cookie里面,跳转index.jsp
跳转到auto如果里面不为空
注销servlet
为什么要
request.getSession().setAttribute("user", user);发给用户看?
问题1getContextPath直接跳到我们的项目目录 ,不是服务器 的根目录所以要加这个
监听器
事件,对象,监听器,处理器(成员方法)
绑定到我们的源,
监听器有8个接口,分为3类
监听域对象创建和销毁ServletContextListener接口、HttpSessionListener接口和ServletRequestListener接口
监听域对象属性增加和删除的ServletContextAttributeListener接口、HttpSessionAttributeListener接口和ServletRequestAttributeListener接口
监听绑定到HttpSession域中某个对象状态的事件HttpSessionBindingListener接口和HttpSessionActivationListener接口。
4案例:
创建了一个请求就有多少个会话
如何让我们的session销毁呢,在lib里面设置session销毁时间
servlet3.0新特性以前都是没写一个html都要在web.xml配置
以前收到请求,处理,提交响应结束servlet线程
那么现在我们3.0可以异步请求,交给另外一个线程处理自己的逻辑,自己就可以直接释放出来了
两个方法
1.web.xml
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.itcast.chapter09.filter.MyServlet</servlet-class>
<async-supported>true</async-supported>
</servlet>
2.
@WebFilter(filterName = "MyFilter",urlPatterns = "/MyServlet",
asyncSupported = true)
案例5
添加文件的按钮,2在servlet读取文件保存在目标路劲
使用<input type="file">标签前提:
1 必须要设置 input 输入项的 name属性, 否则浏览器将不会发送上传文件的数据。2 必须把将表单页面的 method 属性设置为 post 方式, enctype 属性设置为“ multipart/form-data ”类型。例子:<%--指定表单数据的enctype属性以及提交方式--%>
<form enctype="multipart/form-data" method="post">
<%--指定标记的类型和文件域的名称--%>
选择上传文件:<input type="file" name="myfile"/><br />
</form>
用request的getInputstream提取交过来数据
Apache组织提供了一个开源组件Commons- FileUpload,该组件可以方便地将“multipart/form-data”类型请求中的各种表单域解析出来,
对于每一个表单都会封装在fileitem里面
工厂类,用于每一个文件都封装成fileitem
DiskFileItemFactory类的构造方法
ServletFileUpload类