1. Listener监听器
- JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
- Listener 监听器它是 JavaWeb 的三大组件之一。
- Listener 它是 JavaEE 的规范,即接口。
- 监听器作用:监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。
ServletContextListener监听器
- ServletContextListener 可以监听 ServletContext 对象的创建和销毁。
- 其中 ServletContext 对象在 web 工程启动时创建,在 web 工程停止时销毁。
- 监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。
- 两种方法分别是:
contextInitialized
和contextDestroyed
。
public interface ServletContextListener extends EventListener {
/**
* 在ServletContext对象创建之后马上调用,做初始化
*/
public void contextInitialized(ServletContextEvent sce);
/**
* 在ServletContext对象销毁之后调用
* */
public void contextDestroyed(ServletContextEvent sce);
}
使用步骤
- 编写一个类去实现 ServletContextListener
- 实现其两个回调方法
- 到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 过滤器的使用步骤:
- 编写一个类去实现 Filter 接口
- 实现过滤方法 doFilter()
- 到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 的生命周期包含几个方法
- 构造方法
init
初始化方法doFilter
过滤方法:每次拦截到请求,就会执行destroy
销毁:停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器)
注:第1、2 步在 web 工程启动的时候执行(Filter 已经创建)
FilterConfig 类
- FilterConfig是 Filter 过滤器的配置文件类。
- 服务器(Tomcat) 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,其中包含了 Filter 的配置信息。
FilterConfig 类的作用是获取 filter 过滤器的配置内容
- 获取 Filter 的名称
filter-name
的内容 - 获取在 Filter 中配置的
init-param
初始化参数 - 获取 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=
表示下载的文件名。