Filter&Listener&Ajax

一、Filter

1.Filter 概述

1. Web三大组件

  • Servlet
  • Filter
  • Listener        

2. 过滤器:类似净化器中的过滤网/器 

3. Filter 是过滤器:可以把请求或者是响应资源拦截下来。Filter 是 WEB 的三大组件之一。 

  • filter 可以控制鉴权操作

 2.Filter基本使用

1. 自定义Filter 类实现Filter 接口

public class FirstFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    @Override
    public void destroy() {

    }
}

2. 配置资源的拦截路径

  • 拦截所有资源("/*")
@WebFilter("/*")
public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { }
    @Override
    public void destroy() { }
}

3. 操作 doFilter 方法(相当于收费站放行)

@Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        String username = req.getParameter("username");
        System.out.println(username);
        //放行
        filterChain.doFilter(req,resp);
    }

3.Filter 执行流程

1. 流程图

  •  放行后访问资源访问完成还是会回到 filter

A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both.

  • 回来是继续往下执行,并不是从头往下执行

  •  代码验证
 @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        String username = req.getParameter("username");
        System.out.println(username);
        System.out.println("=============刚进入 filter");
        //放行
        filterChain.doFilter(req,resp);

        //写代码
        System.out.println("=============最后执行的filter");

    }
<body>
    <h1>欢迎 index.jsp</h1>
    <%
        System.out.println("================filter 放行中");
    %>
</body>

4.Filter 拦截路径配置

1. 拦截路径概述:表示我们需要拦截的资源

  • 注意:一般我们使用注解配置@WebFilter(" ")

2. 配置如下

  • 具体化拦截:配置登录接口拦截("/login")
  • 全局拦截:/* 只要访问资源都会被拦截
  • 拦截后缀名:*.do *.action 以.do 或者 .action 结尾的资源都会被拦截
  • 目录拦截:/目录名/* /api/* 访问 api 目录下的资源都会被拦截

3. 代码演示

  •  具体化配置代码

@WebFilter("/login")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截登录方法=================");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
  • 拦截后缀名
@WebFilter("*.do")
public class DoFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截以.do 为结尾的=================");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
  • 拦截目录名下所有的
@WebFilter("/api/*")
public class DirFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截 api 下面的所有 =================");
        filterChain.doFilter(servletRequest,servletResponse);
    }

}

5.过滤器链

1. 概述:在 web 服务中配置了多个的过滤器

  • 先进后出的一个原则

  • 注意:具体的拦截的优先级是大于模糊的优先级的

  •  实操:做登陆拦截

@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        //放行需要放行的方法和接口
        String requestURI = req.getRequestURI();
        String[] urls = {"/login.jsp","/login"};
        for (String url : urls) {
            if(url.equals(requestURI)){
                filterChain.doFilter(servletRequest,servletResponse);
                return;
            }
        }
        //判断是否有资源需要放行


        HttpSession session = req.getSession();
        String username = (String) session.getAttribute("username");
        if(username != null && !username.trim().equals("")){
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            req.setAttribute("loginMsg","请登录");
            req.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
        }

    }

    @Override
    public void destroy() {

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

}

二、Listener

1.Listener 概述

1.Listener : 表示监听器,监听容器 application(ServletContext),session,request等对象的创建,销毁,元素的添加,元素的删除时可以执行的功能组件

2. 分类

3. 学习 ServletContextListener

  • 常用方法 
void	contextDestroyed(ServletContextEvent sce)//销毁容器
    
void	contextInitialized(ServletContextEvent sce)//初始化容器
  •  代码演示(创建监听器类,记得使用@ WebListener 实现 ServletContextListener 接口
@WebListener
public class FirstListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("容器已经初始化了==================");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("容器销毁了====================");
    }
}

三、Ajax

1. Ajax概述

1. Ajax:可以发送异步请求(在执行请求的同时执行的其他请求),AJAX = Asynchronous JavaScript And XML.

 

 2. 作用

3. 应用

  • 发起异步请求,可以做到部分数据更新

  • 可以去请求服务器获取服务器的数据

2. 同步请求与异步请求

 3. Ajax 使用

  • 1. 写一个 Servlet 服务,响应一串文字
@WebServlet("/ajax")
public class AjaxServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //响应一串字符串就行

        resp.getWriter().write("修改后的文字内容:hello ajax");
    }
}
  • 修改 index.jsp 里面的代码
<div id="demo">
    <h1>欢迎 index.jsp</h1>
    <button type="button" onclick="loadDoc()">修改内容</button>
</div>
<script>
    function loadDoc() {
        let xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function() {
            //获取响应数据
            if (this.readyState == 4 && this.status == 200) {
                document.getElementById("demo").innerHTML =
                    this.responseText;
            }
        };
    //建立连接
        xhttp.open("GET", "/ajax", true);
    //真正的发送请求    
    xhttp.send();
    }
</script>

4.Ajax封装工具axios

1. 概述:Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。

2. 官网地址 https://www.axios-http.cn/docs

3. 使用

  • 引入js文件  
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  •  直接调用
axios.get('/ajax')
        .then(function (response) {
            // 处理成功情况
            console.log(response);
        })
        .catch(function (error) {
            // 处理错误情况
            console.log(error);
        })
        .then(function () {
            // 总是会执行
        });
  • 可以进入官网的 Axios api 查看具体使用细节  
axios({
  method: 'get',
  url: 'http://bit.ly/2mTM3nY',
  responseType: 'stream'
})
  .then(function (response) {
    response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
  });

四、完成注册小案例

  • 流程分析图

  • 前端要完成的功能
    • 处理响应

    • 发送 ajax 请求

    • 给输入框绑定光标输入实践 onBlur

    • 后端

      • 接收用户

      • 判断是否存在

      • 返回

  • 代码实现

    • 后端

@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端传过来的数据
        String username = req.getParameter("username");
        //模拟数据库的查询
        List<String> list = new ArrayList<>();
        list.add("sy");
        list.add("sy666");
        list.add("123");
        boolean contains = list.contains(username);
        if(contains){
            resp.getWriter().write("no");
        }else{
            resp.getWriter().write("yes");
        }


    }
}
  •  前端
<script>
        //失去焦点触发事件
        document.getElementById("username").onblur=function () {
            console.log(this.value)
            console.log("==================")
            axios({
                method: 'get',
                url: '/register',
                params: {
                    username: this.value
                }

            })
                .then(function (response) {
                    console.log("=============")
                    console.log("no" == response.data);
                    console.log("no" === response.data);
                    if("yes" == response.data){//这里是有问题的
                        document.getElementById("username_err").style.display = ''
                    }else{
                        document.getElementById("username_err").style.display = 'none'
                    }

                });
        }
    </script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值