学习目标
第一章-Filter【重点】
知识点-Filter概述
1.目标
2.路径
- 什么是filter
- 过滤器的作用
3.讲解
3.1什么是filter
Filter:一个实现了特殊接口(Filter)的Java类. 实现对请求资源(jsp,servlet,html,)的过滤的功能.
过滤器是一个运行在服务器的程序, 优先于请求资源(Servlet或者jsp,html)之前执行. 过滤器是javaweb技术中最为实用的技术.
3.2过滤器的作用
对目标资源(Servlet,jsp,html)进行过滤.
应用场景:登录权限检查,解决网站乱码,过滤敏感字符 ...
4.小结
- Filter:过滤器,运行在服务器上的一个小程序,对请求资源进行过滤,优先于请求资源执行。
-
应用场景
-
权限控制
-
中文乱码处理
-
敏感字符过滤
......
-
知识点-Filter入门【重点】
1.目标
- 掌握配置文件方式和注解方式配置Filter
2.步骤
2.1配置文件方式
- 创建一个过滤器类,实现Filter接口
- 在web.xml中配置Filter
2.2注解方式
- 创建一个过滤器类,实现Filter接口
- 在Filter类上面添加@WebFilter("拦截路径")
建议:可以直接new Filter

3.代码
3.1 通过xml配置方式
- 创建一个类实现Filter接口
/**
* Filter入门
*/
public class FilterDemo01 implements Filter {
//init:初始化
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
//doFilter:执行过滤
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo01...");
//过滤器放行
filterChain.doFilter(servletRequest,servletResponse);
}
//destroy:销毁
@Override
public void destroy() {
}
}
- 在web.xml对过滤器进行配置
<!--配置过滤器-->
<filter>
<filter-name>FilterDemo01</filter-name>
<filter-class>com.itheima.web.filter.FilterDemo01</filter-class>
</filter>
<!--过滤器映射 配置过滤器过滤哪些请求资源 /*:过滤所有请求资源-->
<filter-mapping>
<filter-name>FilterDemo01</filter-name>
<!--配置过滤【拦截】路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
3.2通过注解方式
- 创建一个类实现Filter接口
- 直接在这个类上面添加注解进行配置
package com.itheima.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* Filter入门:
* 1.创建一个Filter类 实现Filter接口
* 2.在类上添加@WebFilter("拦截路径") eg:@WebFilter("/demo01"):表示只过滤/demo01的请求资源
*/
@WebFilter("/demo01")
public class FilterDemo02 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo02...");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
4.小结
4.1入门步骤
-
xml方式
- 创建一个java类,实现Filter接口,重写接口中的抽象方法
- 在web.xml配置文件中进行配置
<!--配置过滤器-->
<filter>
<filter-name>FilterDemo01</filter-name>
<filter-class>com.itheima.web.filter.FilterDemo01</filter-class>
</filter>
<!--过滤器映射 配置过滤器过滤哪些请求资源 /*:过滤所有请求资源-->
<filter-mapping>
<filter-name>FilterDemo01</filter-name>
<!--配置过滤【拦截】路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
-
注解方式
-
创建一个java类,实现Filter接口
-
在类上添加注解@WebFilter("拦截路径")
-
-
注意:过滤器一定要放行!!!
知识点-Filter的生命周期【重点】
1.目标
2.路径
- Filter生命周期介绍
- 生命周期方法
- Filter生命周期描述
- FilterConfig【了解】
3.讲解
3.1Filter生命周期介绍
过滤器从创建到销毁的过程。
3.2生命周期方法
init(FilterConfig):初始化
doFilter(ServletReqeust req,ServletResponse resp,FilterChain chain):执行过滤
destroy():销毁
3.3Filter生命周期描述
-
服务器启动的时候, 会调用init()方法进行初始化 【调用一次】
-
当每次请求路径和过滤器的拦截路径一致时就执行一次doFilter()方法,进行过滤 【调用多次】
-
服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁 【调用一次】
回顾一下Serlvet生命周期:
init:初始化 默认在来了第一次请求时初始化,可以配置启动项loadOnStartup在服务器启动提前加载
service:服务 当来了请求时,提供服务
destroy:销毁 服务器正常关闭或者项目从服务器移除
Servlet和Filter生命周期的区别:
Filter是在服务器启动时进行初始化,而Servlet是默认来了第一次请求时进行初始化。
Filter是在来了请求并且请求资源刚好是要拦截的资源,就会执行过滤。
3.4 FilterConfig【了解】
获得过滤器的初始化参数
- 配置初始化参数
<!--配置过滤器-->
<filter>
<filter-name>FilterDemo04</filter-name>
<filter-class>com.itheima.web.filter.FilterDemo04</filter-class>
<!--配置Filter初始化参数 只能在当前Filter中获取 -->
<init-param>
<param-name>akey</param-name>
<param-value>aaa</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo04</filter-name>
<!--配置过滤器要过滤的请求资源 过滤路径: /demo01:表示只过滤/demo01请求资源 -->
<url-pattern>/demo01</url-pattern>
</filter-mapping>
- 在Filter的init()方法里面获得了
package com.itheima.web.filter;
import javax.servlet.*;
import java.io.IOException;
/**
* FilterConfig:过滤器配置对象
* 1.获取Filter的初始化参数
* 2.获取ServletContext对象
* 使用web.xml方式配置filter初始化参数
*/
public class FilterDemo04 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//1.获取Filter的初始化参数
String akey = filterConfig.getInitParameter("akey");
System.out.println("FilterDemo04-akey = " + akey);
//2.获取ServletContext对象
ServletContext servletContext = filterConfig.getServletContext();
System.out.println("FilterDemo04-servletContext = " + servletContext);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo04...");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
4.小结
- Filter生命周期
- init():当服务器启动时,过滤器执行init方法初始化 【执行一次】
- doFilter():当请求路径和过滤器要过滤的请求资源匹配时,执行doFilter方法进行过滤 【执行多次】
- destroy():服务器正常关闭或项目从服务器移除,执行destroy销毁Filter对象 【执行一次】
- Filter和Servlet生命周期的区别
- Filter在服务器启动时进行初始化,Servlet默认在来了第一次请求时,进行初始化
- FilterConfig对象作用
- 获取初始化参数
- 获取servletContext对象
知识点-拦截路径【重点】
1.目标
2.路径
- 完全路径匹配
- 目录匹配
- 扩展名匹配
- 全局匹配
3.讲解
假设有一个管理员权限的过滤器,它应该对用户发出的管理员功能的请求进行条件的过滤。但是当用户发出登录、注册等请求的时候,不应该进行过滤。所以我们过滤器,应该有选择的过滤请求。这就需要学习配置过滤器不同的映射路径,从而让过滤器过滤希望过滤的请求。
3.1完全路径匹配
以"/"开始
/demo01 ---> 过滤器只能拦截路径/demo01;
3.2目录匹配
以"/"开始 以 *结束 .
/* --->当前项目下的所有的路径都可以拦截; /user/* ---> 可以拦截 /user/login, /user/register
3.3扩展名匹配
以"*"开始 例如: *.jsp *.do ,注意前面不要再有路径限制
*.do--->可以拦截路径的后缀是 do的 ; *.jsp--->拦截所有JSP
3.4全局匹配
/* 过滤所有请求
/ 当前Filter里面不支持, Servlet里面可行的. 后面在Servlet(SpringMVC)里面遇到
/
在Servlet中表示接收除了jsp以外的所有请求
/*
在Servlet中表示接收所有请求,当然如果存在具体路径匹配则选择具体路径匹配,否则选择/*
的servlet实际使用中:
在filter和servlet充当控制器时,filter拦截路径一般设置为
/*
,而Servlet一般设置/
(SpringMVC)
package com.itheima.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* 过滤器拦截路径
* 1.完全路径匹配:以/开头 /不能丢 eg:/demo01 表示只过滤/demo01的请求资源
* @WebFilter("/demo01")
* 2.目录匹配:以/开头 以*结尾 eg:/user/* 表示过滤user下的所有请求资源
* @WebFilter("/user/*")
* 3.扩展名匹配:以*开头 eg:*.do 表示过滤所有以.do结尾的请求资源
* @WebFilter("*.do")
* 4.全局匹配:/* 表示过滤所有请求资源
*
*/
@WebFilter("/*")
public class FilterDemo05 implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("FilterDemo05...");
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig config) throws ServletException {
}
}
4.小结
- 完全路径匹配:以/开头 eg:/demo01
- 目录匹配:以/开头 以结尾 eg:/user/
- 扩展名匹配:以开头 eg:.do
- 全局匹配:/*
知识点-拦截方式
1.目标
2.分析
有了上面学习的映射路径,我们可以控制过滤器过滤指定的内容,但是我们在访问资源的时候,并不是每次都是直接访问,有时是以转发的方式访问的,这就需要我们要让过滤器可以区分不同的访问资源的方式,有不同的拦截方式。 是通过 DispatcherType 来指定的.
转发 | 直接访问【重定向】
3.讲解
- DispatcherType.REQUEST
默认值,过滤从浏览器直接发送过来的请求和重定向 不过滤转发
- DispatcherType.FORWARD
只过滤转发过来的请求
package com.itheima.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* Filter拦截方式配置
* 1.Filter默认拦截直接访问的请求资源 默认DispatcherType.REQUEST 表示拦截直接访问和重定向
* 2.DispatcherType.FORWARD:表示只拦截转发方式的请求
* 3.实际使用中,一般不会进行拦截方式的配置,直接使用默认配置,拦截直接访问和重定向的请求
* 因为转发时服务器内部操作的,并且表示客户端一次请求,所以一般不作拦截
*/
@WebFilter(value="/demo04",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})
public class FilterDemo06 implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("FilterDemo06...");
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig config) throws ServletException {
}
}
3.小结
-
通过dispatcherTypes配置拦截方式
-
DispatcherType.FORWARD: 【只】过滤转发请求
-
DispatcherType.REQUEST: 表示过滤浏览器的直接请求和重定向【默认值】
-
-
拦截方式的这个值,我们可以配置多个
@WebFilter(value="/demo01",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
一般情况下, 转发我们不会过滤的. 转发属于服务器内部的行为. 直接使用默认值的情况偏多
知识点-过滤器链
1.目标
2.分析
过滤器链:一个项目中多个过滤器一起工作就组成了过滤器链。过滤器链中就记录了过滤器的信息。
过滤器链作用:当一个filter收到请求的时候,调用chain.doFilter()才可以访问下一个匹配的filter,若当前的filter是最后一个filter,调用chain.doFilter()才能访问目标资源
3.讲解
3.小结
- 过滤器链:一个项目中,多个过滤器一起工作,就组成了过滤器链,在过滤器链中就记录的过滤器的信息,以及过滤器的执行顺序,过滤器链对象 FilterChain通过doFilter()方法调用下一个过滤器执行,如果当前过滤器是最后一个,则会调用web资源处理请求。
- 过滤器执行顺序
- xml配置先执行,注解配置后执行
- xml配置的按照filter-mapping的先后顺序执行
- 注解配置的按照filter的名称字母先后顺序执行
案例一:统一全网站中文乱码的处理
1,需求分析
在整个网站中,可能会有get请求或post请求向服务器提交参数.参数中往往有中文信息.在后台每个Servlet中都需要去处理乱码.
我们想做的是:请求到达Servlet中.就可以直接调用getParameter方法获得请求参数,请求参数已经没有乱码了.
2,思路分析
3,代码实现
package com.itheima.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.强转两个对象
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 2.中文乱码处理
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 3.过滤器放行【放行强转后的对象】
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException {
}
}
4.小结
-
关键点
- 拦截路径:/* 拦截所有请求
- 一定要放行
-
思路
- 强转两个对象
- 中文乱码处理
- 放行【放行强转后的两个对象】
案例二:非法字符过滤
1,需求分析
当用户发出非法言论的时候,提示用户言论非法。
效果:
2,思路分析
1.创建一个表单用于发表言论。
2.创建一个txt文件,其中存入敏感字符。
3.创建一个Filter,拦截请求。在init方法中将txt文件中的非法字符读取到集合中。、
编写doFilter方法代码
4.获取请求中的参数,对请求的参数进行非法字符的校验。
5.如果言论中不含有非法字符,就放行。
6.如果言论中含有非法字符,就拦截,并且使用***替换掉。
3,代码实现
- IllegalFilter
package com.itheima.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
@WebFilter("/illegal")
public class IllegalFilter implements Filter {
private List<String> list = new ArrayList<>();
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.强转两个对象request和response
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//2.获取请求参数 【用户发表言论】
String message = request.getParameter("message");
//3.遍历敏感词list集合
//设置一个标识 如果包含敏感词为true 不包含为false
boolean flag = false;
for (String word : list) {
//4.判断用户发表言论中是否包含敏感词
if(message.contains(word)){
flag = true;
break;
}
}
//5.1:包含 给出提示 5.2:不包含:放行
if(flag){
response.getWriter().print("您发表的言论含有非法词汇,请重新发表!");
}else{
chain.doFilter(request,response);
}
}
@Override
public void init(FilterConfig config) throws ServletException {
BufferedReader br = null;
try {
//读取敏感词文档 存入到list集合中
//1.获取ServletContext对象
ServletContext servletContext = config.getServletContext();
//2.使用ServletContext对象获取web目录下的资源文件输入流
InputStream is = servletContext.getResourceAsStream("IllegalWords.txt");
//3.将输入流转为字符缓冲流进行读取 添加到list集合中
br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
String line = null;
while((line=br.readLine())!=null){
list.add(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.小结
-
思路
- 准备页面表单、Filter、Servlet
- 在Filter的init方法中 读取敏感词文档加载内容到list集合中
- doFilter()
- 1.强转两个对象
- 2.获取用户发表言论
- 3.遍历list集合,判断用户发表言论中是否包含敏感词
- 4.处理 包含进行提示 不包含放行【放行强转后的对象】
-
注意事项
- 读取非法字符文件 指定utf-8
- 我这个案例里面没有处理请求和响应乱码, 因为我已经写了CharacterEncodingFilter已经处理好了, C在I的前面, 所以在IllegalFilter执行之前, CharacterEncodingFilter已经把乱码处理好了
- 要进行用户是否发表言论的判断,如果用户没有发布言论,则IllegalFilter过滤器直接放行
第二章-监听器Listener【了解】
知识点-Listener概述
1.目标
2.路径
- 什么是Listener
- 监听器的应用
- 监听器的术语
3.讲解
3.1什么是Listener
监听器就是一个Java类,用来监听其他的JavaBean对象的变化
在javaweb中监听器就是监听三个域对象的状态的。request,session,servletContext(application)
3.2监听器的应用
主要在Swing编程
在Android/ios大量应用
JS里面的事件
3.3监听器的术语
eg: 一个狗仔卓伟偷拍明星出轨
事件源 :被监听的对象.(目标对象) 明星
监听器对象:监听的对象. 卓伟
事件:事件源行为的称呼. 出轨
注册(绑定):将"监听器"对象注册给"事件源". 卓伟跟踪明星
4.小结
- 监听器:就是java中的一个类,用来监听javabean对象状态变化
- 应用:js中的事件
- 监听器术语
- 事件源:被监听的对象
- 监听器对象:监听者
- 事件:被监听的对象 发生了某件事
- 注册:将事件源对象和监听器对象进行绑定 这样监听器才能监听到被监听的对象发生某件事件,然后做后续处理
知识点-javaweb中的监听器
1.目标
2.路径
- 说明
- JavaWeb中的监听器类型
- JavaWeb的监听器使用步骤
3.讲解
3.1 javaweb的监听器
javaweb的监听器:监听ServletContext,HttpSession,HttpServletRequest三个域对象状态
事件源和监听器绑定的过程:通过配置web.xml或注解配置完成
3.2 JavaWeb中的监听器类型
- 三类8个
只讲解 监听ServletContext的创建和销毁.
ServletContext对象创建:表示服务器启动 方便提前加载资源
ServletContext对象销毁:表示服务器关闭或项目从服务器移除 关闭对象 释放资源
3.3JavaWeb的监听器使用步骤
- 创建一个类实现监听器接口【ServletContextListener】
- 在web.xml进行配置(将事件源与监听器绑定)
4.小结
- 学习监听器就学一个 监听ServletContext的创建和销毁
知识点-监听ServletContext的创建和销毁的监听器
1.目标
2.路径
3.讲解
说明: 监听ServletContext对象的创建和销毁
-
方法
-
问题
ServletContext对象何时创建和销毁:应用在,它就在
创建:服务器启动时候(前提是这个项目在这个服务器里面). 服务器为每个WEB应用创建一个单独的ServletContext.
销毁:服务器关闭的时候,或者项目从服务器中移除.
-
企业中应用
初始化工作:服务器启动时完成初始化工作,在后续使用时就可以直接调用,无需等待
加载配置文件:Spring框架,ContextLoaderListener
步骤:
- 创建一个java类,实现ServletContextListener接口,重写其方法
- 在web.xml中配置监听器
代码:
-
JAVA代码
package com.itheima.web.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; /** * Servlet、Filter、Listener javaweb的三大组件 用的最多Servlet,Listener基本很少使用 * Servlet: @WebServlet("请求路径") * Filter: @WebFilter("拦截路径") * Listener:@WebListener */ @WebListener public class MyListener implements ServletContextListener { //监听ServletContext对象初始化 服务器启动 初始化工作 @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("servletContext init 1111..."); } //监听ServletContext对象销毁 服务器关闭 关闭对象释放资源 @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("servletContext destroy 4444..."); } }
-
配置(web.xml)
<!--方式一:web.xml中配置--> <listener> <listener-class>com.itheima.web.listener.MyListener</listener-class> </listener>
4.小结
-
步骤
- 创建一个类,实现ServletContextListener接口,重写方法
- 使用web.xml配置或注解@WebListener配置
-
应用:在Spring框架中,通过监听ServletContext对象,提前加载Spring的配置文件
第三章-邮箱
1.邮件流程

2.邮件服务器
2.1服务器
数据库服务器:mysql数据库服务器 mysql软件+主机
web服务器:tomcat+主机
- 硬件+软件(eg: mysql, tomcat...)
2.2邮箱服务器
- 租(企业邮箱)
- 自己搭建 邮箱软件+主机
3.邮箱软件安装
- 服务端
- 客户端
4.邮件的发送
- 直接通过Foxmail发送
- 通过java代码发送
- 导入邮箱相关 jar包
- 添加工具类到项目
- 调用方法 发送邮件【注意:发件人账号及密码、收件人邮箱地址、邮件主题、邮件内容】
第四章-扩展
1.密码加密
- 可逆: 加密之后还可以解密 明文-->密文-->明文 RSA【私钥、公钥】
- 不可逆: 加密之后 不可以解密 明文-->密文 MD5
2.MD5加密算法
- 不可逆
- 步骤 直接拷贝工具类进行加密
3.保证MD5加密算法安全
- 前端控制(避免密码过于简单),加密多次(3次以上)
- 加盐(password+salt)
4.怎么登录
- 登录的时候 按照 注册那种方式加密一下, 再去查询数据库 就OK了
5.退出登录
5.1 思路
- 修改超链接 请求LogoutServlet
- 在LogoutServlet里面, 移除session里面存的user, 跳转到登录页面
5.2实现
- 超链接
<a href="logout">退出</a>
- LogoutServlet
package com.itheima.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(value = "/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.清理session中的用户信息
//request.getSession().removeAttribute("user");
//手动让session失效
request.getSession().invalidate();
//2.跳转到登录页面
response.sendRedirect("login.html");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
本章小结:
-
Filter
- 概念:过滤请求资源,优先于请求资源先执行
- 使用场景:中文乱码处理、敏感字符过滤、权限验证...
- 入门使用
- 创建一个类,实现Filter接口
- 使用xml或注解@WebFilter配置
- 生命周期
- init:初始化 在服务器启动时初始化 【执行一次】
- doFilter:执行过滤 在每次请求和过滤器拦截路径一致时,就执行 【执行多次】
- destroy:服务器正常关闭或项目从服务器移除 【执行一次】
- FilterConfig
- 获取初始化参数
- 获取ServletContext对象
- 拦截路径【重点】
- 完全路径匹配: /demo01
- 目录匹配:/user/*
- 扩展名匹配:*.do
- 全局匹配:/*
- 拦截方式【了解】
- 过滤器链【了解】
- 过滤器的执行顺序(xml配置的先执行,注解配置的后执行 xml中filter-mapping在前先执行,注解配置的字母顺序在前的先执行)
-
Listener
- 通过监听器对象监听在某个对象上发生某个事件 进行后续处理
- 编写ServletContextListener监听器
- 创建一个类 实现ServletContextListener接口
- 使用xml或注解配置
- 作用:可以监听到服务器的启动和关闭 方便在服务器启动时做一些初始化工作
- 应用:Spring加载配置文件就使用到了ServletContextListener监听器
-
邮箱
- 邮箱软件的安装
- java代码发送邮件
- 添加jar包
- 拷贝工具类
- 调用方法 发送邮件
-
练习:
- Filter入门
- Filter生命周期
- Filter拦截路径
- 案例一
- 编写一下ServletContextListener监听器
- 用户注册登录案例
- 邮箱配置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!