Servlet复习笔记(5)——监听器、过滤器、文件的上传和下载

1. Listener监听器

  • JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
  • Listener 监听器它是 JavaWeb 的三大组件之一。
  • Listener 它是 JavaEE 的规范,即接口。
  • 监听器作用:监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

ServletContextListener监听器

  • ServletContextListener 可以监听 ServletContext 对象的创建和销毁。
  • 其中 ServletContext 对象在 web 工程启动时创建,在 web 工程停止时销毁。
  • 监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。
  • 两种方法分别是:contextInitializedcontextDestroyed
public interface ServletContextListener extends EventListener { 

	/** 
	* 在ServletContext对象创建之后马上调用,做初始化
 	*/
	public void contextInitialized(ServletContextEvent sce); 
	
	
	/** 
	* 在ServletContext对象销毁之后调用 
	* */
	public void contextDestroyed(ServletContextEvent sce); 
}

使用步骤

  1. 编写一个类去实现 ServletContextListener
  2. 实现其两个回调方法
  3. 到web.xml中配置监听器
public class MyServletContextListenerImpl implements ServletContextListener {

	@Override 
	public void contextInitialized(ServletContextEvent sce) { 
		System.out.println("ServletContext 对象被创建了");
	}
	
	@Override 
	public void contextDestroyed(ServletContextEvent sce) { 
		System.out.println("ServletContext 对象被销毁了");
	} 
}

xml配置监听器:

<!--配置监听器--> 
<listener> 
	<listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>

2. Filter 过滤器

介绍

  • Filter 是 JavaWeb 的三大组件之一
  • Filter 过滤器它是 JavaEE 的规范。也就是接口
  • Filter 过滤器它的作用是:拦截请求,过滤响应

拦截请求 常见应用场景: 1. 权限检查 2. 、日记操作 3. 事务管理等
在这里插入图片描述
Filter 过滤器的使用步骤:

  1. 编写一个类去实现 Filter 接口
  2. 实现过滤方法 doFilter()
  3. 到web.xml 中配置 Filter 的拦截路径
public class AdminFilter implements Filter { 

	/** 
	* doFilter方法,专门用于拦截请求。可以做权限检查 
	*/
	@Override 
	public void doFilter(ServletRequest servletRequest, ServletResponseservletResponse, FilterChainfilterChain) throws IOException,ServletException { 
		HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
		HttpSession session = httpServletRequest.getSession(); 
		Object user = session.getAttribute("user"); 
		// 如果等于null,说明还没有登录 
		if (user == null) {
			servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); 
			return;
		} else { 
			// 让程序继续往下访问用户的目标资源 
			filterChain.doFilter(servletRequest,servletResponse);
		} 
	} 
	
}
<!--filter标签用于配置一个Filter过滤器--> 
<filter> <!--给filter起一个别名--> 
	<filter-name>AdminFilter</filter-name> 
	<!--配置filter的全类名--> 
	<filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>

<!--filter-mapping配置Filter过滤器的拦截路径--> 
<filter-mapping> 
	<!--filter-name表示当前的拦截路径给哪个filter使用--> <filter-name>AdminFilter</filter-name> 
	<!--url-pattern配置拦截路径 / 表示请求地址为:http://ip:port/工程路径/ 
	映射到IDEA 的web目录 /admin/* 表示请求地址为:http://ip:port/工程路径/admin/*
	-->
 	<url-pattern>/admin/*</url-pattern>
</filter-mapping>

Filter 的生命周期

Filter 的生命周期包含几个方法

  1. 构造方法
  2. init 初始化方法
  3. doFilter 过滤方法:每次拦截到请求,就会执行
  4. destroy 销毁:停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)

注:第1、2 步在 web 工程启动的时候执行(Filter 已经创建)

FilterConfig 类

  • FilterConfig是 Filter 过滤器的配置文件类。
  • 服务器(Tomcat) 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,其中包含了 Filter 的配置信息。

FilterConfig 类的作用是获取 filter 过滤器的配置内容

  1. 获取 Filter 的名称 filter-name 的内容
  2. 获取在 Filter 中配置的 init-param 初始化参数
  3. 获取 ServletContext 对象

FilterChain 过滤器链

过滤顺序是其在xml文件中的配置顺序

在这里插入图片描述

Filter 拦截路径方式

  • 精确匹配
    <url-pattern>/target.jsp</url-pattern> 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
  • 目录匹配
    <url-pattern>/admin/*</url-pattern> 以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*
  • 后缀名匹配
    <url-pattern>*.html</url-pattern> 以上配置的路径,表示请求地址必须以.html 结尾才会拦截到;

Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!

3. 文件的上传

  • 要有 form 标签,且须method=post
  • form 标签的 encType 属性值须为 multipart/form-data
  • 在 form 标签中使用 input type=file 添加上传的文件
  • 编写服务器代码(Servlet 程序)接收,处理上传的数据。

其中属性 encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。
文件上传的HTTP 协议说明:
在这里插入图片描述

文件下载

文件下载示例:

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
	// 1、获取要下载的文件名 
	String downloadFileName = "2.jpg"; 
	
	// 2、读取要下载的文件内容(通过ServletContext对象可以读取)
	ServletContext servletContext = getServletContext(); 
	
	// 获取要下载的文件类型 
	String mimeType = servletContext.getMimeType("/file/" + downloadFileName); 
	System.out.println("下载的文件类型:" + mimeType); 
	
	// 4、在回传前,通过响应头告诉客户端返回的数据类型 
	resp.setContentType(mimeType);
	
	// 5、还要告诉客户端收到的数据是用于下载使用(还是使用响应头)
	// Content-Disposition响应头,表示收到的数据怎么处理 
	// attachment表示附件,表示下载使用 
	// filename= 表示指定下载的文件名 
	resp.setHeader("Content-Disposition", "attachment; filename=" + downloadFileName); 
	
	/** 
	* /斜杠被服务器解析表示地址为http://ip:prot/工程名/ 映射到代码的Web目录 
	**/
	InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" +
	downloadFileName); 
	
	// 获取响应的输出流 
	OutputStream outputStream = resp.getOutputStream(); 
	
	//3、把下载的文件内容回传给客户端
	// 读取输入流中全部的数据,复制给输出流,输出给客户端 
	IOUtils.copy(resourceAsStream,outputStream);
}
  • response.setHeader("Content-Disposition", "attachment; fileName=1.jpg");这个响应头告诉浏览器:这是需要下载的。
  • attachment 表示附件,也就是下载的一个文件
  • fileName=表示下载的文件名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值