Filter Listener Ajax学习笔记

news2024/11/24 19:53:56

1 Filter

Filter用于请求的过滤,如请求时,做登录的全局性校验

1.1 示例

在创建Filter前,可以通过启动Tomcat访问index.jsp

http://localhost:8080/Mvc-Demo/index.jsp

添加Filter后,重新启动Tomcat,并再次访问index.jsp

@WebFilter("/*")
public class TestFilter1 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("TestFilter1 doFilter");
    }

    @Override
    public void destroy() {

    }
}

此时浏览器不在展示Hello, World。 并且控制台输出doFilter()方法中的内容。
添加放行后, 重启Tomcat

filterChain.doFilter(servletRequest, servletResponse);

此时能够正常访问到webapp下的资源

1.2 拦截路径配置

  • 拦截具体资源: /index.jsp 只有访问index.jsp时才会拦截
  • 目录拦截: /user/*, 访问/user下的所有资源,都会被拦截
  • 后缀名拦截: *.jsp, 范文后缀名为jsp的资源,都会被拦截
  • 拦截所有: /*, 访问所有资源,都会被拦截

1.3 过滤器链

每个web应用,可以配置多个过滤器,多个过滤器链式调用执行
代码演示:

两个过滤器

@WebFilter("/*")
public class TestFilter1 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("TestFilter1 doFilter enter");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("TestFilter1 doFilter end");
    }

    @Override
    public void destroy() {

    }
}


@WebFilter("/*")
public class TestFilter2 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("TestFilter2 doFilter enter");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("TestFilter2 doFilter end");
    }

    @Override
    public void destroy() {

    }
}

index.jsp页面

<html>
<body>
<h2>Hello World!</h2>

<% System.out.println("index.jsp"); %>
</body>
</html>

启动tomcat后,访问index.jsp,日志输出

TestFilter1 doFilter enter
TestFilter2 doFilter enter
index.jsp
TestFilter2 doFilter end
TestFilter1 doFilter end

从日志可以看出,拦截器的执行逻辑是先执行放行前的逻辑,再执行拦截后的逻辑。

拦截器的执行顺序: 按照拦截器的名字来顺序执行

2 Listener

Listener是监听器,是JavaWeb三大组件(Servlet, Filter, Listener)之一
监听器可以监听application, session, request三个对象的创建,销毁

示例:

@WebListener
public class ContextLoaderListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("contextInitialized ...");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("contextDestroyed ...");
    }
}

启动服务器,则可以看到在控制台输出的初始化日志
关闭服务器,也可以看到控制台中输出的销毁日志

3 Ajax

AJAX(Asynchronous JavaScript And XMl) 异步的JavaScript和XML
作用: 与服务器进行数据请求
示例:
服务端Servlet

@WebServlet("/ajaxServlet")
public class AjaxServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("hello ajax~");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

前端

</head>
<body>
  <script>
    var xhttp;
    if (window.XMLHttpRequest) {
        xhttp = new XMLHttpRequest();
    } else {
        xhttp = new ActiveXObject("Microsoft.XML HTTP");
    }

    xhttp.open("GET", "http://localhost:8080/Mvc-Demo/ajaxServlet")
    xhttp.send();

    xhttp.onreadystatechange = function () {
        if(this.readyState == 4 && this.status == 200) {
            console.log(this.responseText)
        }
    }
  </script>
</body>
</html>

请求 http://localhost:8080/Mvc-Demo/test_ajax.html 后,会看到servlet接口也有被请求
在这里插入图片描述

示例: 当光标失去焦点是,请求服务端
前端代码

<script>
    document.getElementById("username").onblur = function () {
        var username = this.value;
        var xhttp;
        if (window.XMLHttpRequest) {
            xhttp = new XMLHttpRequest();
        } else {
            xhttp = new ActiveXObject("Microsoft.XML Http")
        }

        xhttp.open("GET", "http://localhost:8080/Mvc-Demo/selectUserServlet?username=" + username)
        xhttp.send();

        xhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                if (this.responseText == "true") {
                    document.getElementById("username_err").style.display = '';
                } else {
                    document.getElementById("username_err").style.display = 'none';
                }
            }
        }
    }
</script>

servlet

@WebServlet("/selectUserServlet")
public class SelectUserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //模拟结果, 写死成true
        boolean flag = true;
        resp.getWriter().write("" + flag);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

当输入框中失去焦点后,将会有用户名已存在的提示

4 axios

axios是对原生的ajax的封装
示例:
Servlet

@WebServlet("/axiosServlet")
public class AxiosServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println("username = " + username);
        resp.getWriter().write("hello axios~");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

Html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script src="js/axios-0.18.0.js"></script>
  <script>
    axios({
        method:"post",
        url: "http://localhost:8080/Mvc-Demo/axiosServlet",
        data: "username=lisi"
    }).then(function (resp) {
        console.log("resp.data = " + resp.data)
    })
  </script>
</body>
</html>

请求http://localhost:8080/Mvc-Demo/test_axios.html后,日志输出

resp.data = hello axios~

5 JSON

JavaScript object Notation JavaScript对象表示法
定义示例:

{
	"name": "lisi",
	"age": 14,
	"city": "上海"
}

json解析

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    var jsonStr = '{"name" : "lisi", "age" : 15, "city" : "上海"}'
    var jsonObj = JSON.parse(jsonStr);
    console.log("name = " + jsonObj.name + ", age = " + jsonObj.age)
 	
 	let jsonStr2 = JSON.stringify(jsonObj)
    console.log("jsonStr2 = " + jsonStr2);
  </script>
</body>
</html>

日志输出

name = lisi, age = 15    
jsonStr2 = {"name":"lisi","age":15,"city":"上海"}

json作为异步请求参数

var jsObject = {name: "lisi"}
    axios({
        method:"post",
        url: "http://localhost:8080/Mvc-Demo/axiosServlet",
        data: jsObject
    }).then(function (resp) {
        console.log("resp.data = " + resp.data)
    })

fastJson
fastjson是用来实现Java对象和字符串的转换
首先引入fastjson的依赖

<dependency>
   <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>

测试代码

public class TestJson {

    public static void main(String[] args) {
        User user = new User();
        user.setId(1);
        user.setUsername("lisi");
        user.setPassword("876");

        String jsonStr = JSON.toJSONString(user);
        System.out.println("jsonStr = " + jsonStr);

        User user2 = JSON.parseObject(jsonStr, User.class);
        System.out.println("user2 = " + user2);
    }
}

日志输出

jsonStr = {"id":1,"password":"876","username":"lisi"}
user2 = User{id=1, username='lisi', password='876'}

6 案例

6.1 品牌列表示例

servlet代码

@WebServlet("/selectAllServlet")
public class SelectAllServlet extends HttpServlet {
    private BrandService service = new BrandService();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Brand> brands = service.selectAll();

        String jsonStr = JSON.toJSONString(brands);
        resp.setContentType("text/json; charset=utf-8");
        resp.getWriter().write(jsonStr);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

js代码

<%--
  Created by IntelliJ IDEA.
  User: yl
  Date: 2022/11/30
  Time: 5:11 PM
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>所有品牌</title>
</head>
<body>
  <h1>${user.username},欢迎您</h1>
  <hr>
  <a href="addBrand.jsp"> <input type="button" value="新增"></a><br>
  <table id="brandTable" border="1" cellspacing="0" width="80%">
    <tr>
        <th>序号</th>
        <th>品牌名称</th>
        <th>企业名称</th>
        <th>排序</th>
        <th>品牌介绍</th>
        <th>状态</th>
        <th>操作</th>
    </tr>
  </table>
  <script src="js/axios-0.18.0.js"></script>
  <script>
      window.onload = function () {
          axios({
              method: "get",
              url: "http://localhost:8080/Mvc-Demo/selectAllServlet"
          }).then(function (resp) {
              let brands = resp.data;
              let tableData = "<tr>\n" +
                  "   <th>序号</th>\n" +
                  "   <th>品牌名称</th>\n" +
                  "   <th>企业名称</th>\n" +
                  "   <th>排序</th>\n" +
                  "    <th>品牌介绍</th>\n" +
                  "    <th>状态</th>\n" +
                  "   <th>操作</th>\n" +
                  "</tr>";

              for (let i = 0; i < brands.length; i++) {
                  let brand = brands[i];

                  tableData += "<tr align=\"center\">\n" +
                      "              <td>" + (i + 1) + "</td>\n" +
                      "              <td>" + brand.brandName + "</td>\n" +
                      "              <td>" + brand.companyName + "</td>\n" +
                      "              <td>" + brand.ordered + "</td>\n" +
                      "              <td>" + brand.description + "</td>\n" +
                      "              <td>" + brand.status + "</td>\n" +
                      "              <td>\n" +
                      "                  <a href=\"/Mvc-Demo/selectByIdServlet?id=${brand.id}\">修改\n" +
                      "                  </a> <a href=\"#\"> 删除</a>\n" +
                      "              </td>\n" +
                      "          </tr>";
              }
              document.getElementById("brandTable").innerHTML = tableData;
          })
      }
  </script>
</body>
</html>

6.2 品牌添加示例

servlet代码

@WebServlet("/addServlet")
public class AddServlet extends HttpServlet {
    private BrandService service = new BrandService();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        BufferedReader br = req.getReader();
        String params = br.readLine();

        System.out.println("params = " + params);

        Brand brand = JSON.parseObject(params, Brand.class);
        service.add(brand);
        resp.getWriter().write("success");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
        this.doGet(req, resp);
    }
}

js代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加品牌</title>
</head>
<body>
    <h3>添加品牌</h3>
    <form action="" method="post">
        品牌名称: <input id="brandName" name="brandName"><br> <br>
        企业名称: <input id="companyName"  name="companyName"><br> <br>
        品牌排序: <input id="ordered" name="ordered"><br> <br>
        描述信息: <textarea rows="5" cols="20" id="description" name="description"></textarea> <br> <br>
        状态:
        <input type="radio" name="status" value="0">禁用
        <input type="radio" name="status" value="1">启用 <br><br>

        <input type="button" id="submit" value="提交">
    </form>

    <script src="js/axios-0.18.0.js"></script>
    <script>
        document.getElementById("submit").onclick = function () {
            var formData = {
                brandName: "",
                companyName: "",
                ordered: "",
                description: "",
                status: "",
            };
            let brandName = document.getElementById("brandName").value;
            let companyName = document.getElementById("companyName").value;
            let ordered = document.getElementById("ordered").value;
            let description = document.getElementById("description").value;

            formData.brandName = brandName;
            formData.companyName = companyName;
            formData.ordered = ordered;
            formData.description = description;

            let status = document.getElementsByName("status");
            for (let i = 0; i < status.length; i++) {
                if (status[i].checked) {
                    formData.status = status[i].value;
                }
            }

            console.log("formData = " + formData)
            axios({
                method:"post",
                url: "http://localhost:8080/Mvc-Demo/addServlet",
                data: formData
            }).then(function (resp) {
                if (resp.data == "success") {
                    location.href = "http://localhost:8080/Mvc-Demo/brand.jsp";
                }
            })
        };
    </script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8、java常见名词总结

一、JMM 1.1、JMM简介 JMM 是Java内存模型&#xff08; Java Memory Model&#xff09;&#xff0c;简称JMM。它本身只是一个抽象的概念&#xff0c;并不真实存在&#xff0c;它描述的是一种规则或规范&#xff0c;是和多线程相关的一组规范。通过这组规范&#xff0c;定义了…

babel-plugin-transform-remove-console 项目打包去除console

安装babel-plugin-transform-remove-console 项目打包去除console npm install babel-plugin-transform-remove-console --save-dev 在vue项目中babel.config.js中&#xff1a; module.exports {plugins: ["transform-remove-console",], }; 如果只想在生产环境…

Java+SSM影院订票系统|电影院购票系统(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用的技术实现如下 后台框架&#xff1a;Spring、SpringMVC、MyBatis UI界面&#xff1a;BootStrap、jQuery 、JSP 数据库&#xff1a;MySQL 系统分为前台订票和后台管理&#xff1a; 1.前台订票 用户注册、用户登录、查看电影列表、分类查看 电影搜索、查…

C语言基础篇 —— 5.0 详解C语言变量的四大属性

文章目录概述C语言变量四大属性存储类概念解析Linux 内存映像并解析作用域概念解析局部变量的代码块作用域函数名和全局变量的文件作用域同名变量的掩蔽规则生命周期概念解析栈变量的生命周期堆变量的生命周期数据段、bss段变量的生命周期代码段、只读段的生命周期链接属性概念…

Linux——虚拟机安装Linux系统

实验1-2 虚拟机安装Linux系统 VMware 9.0 虚拟机Linux镜像ISO文件相关工具可以在这里边找到 http://pan.baidu.com/s/1ntA18FJ 或者请自行下载使用 创建新的虚拟机&#xff0c;如下图&#xff1a; 下一步&#xff1a;选择安装配置类型为“典型”如下图&#xff1a; 下一步&…

k8s之Ingress

Ingress和Ingress控制器介绍 Ingress官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/ Ingress控制器官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/ 在k8s中将一个…

Multipartfile判断文件类型的简单处理办法。

通过浏览器上传的文件在后台需要验证文件类型。如果单纯匹配后缀名的方式是有风险的&#xff0c;容易被换了后缀的病毒文件给破坏掉。 比如&#xff1a; 如果我上传已修改的文件。&#xff08;把xlsx改成了jpg&#xff09; 这样&#xff0c;无法识别出来真实的内容。 所以为了…

java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分布式微服务+高并发高可用高性能知识序幕就此拉开(六:Hystrix之熔断、降级、限流)~整起

Hystrix 中文文档&#xff1a;https://www.apiref.com/spring-cloud-zh/dalston/#_circuit_breaker_hystrix_clients服务雪崩&#xff1a;服务 A 调用了服务 B&#xff0c;服务 B 再调用了服务 C&#xff0c;但是因为某些原因&#xff0c;服务 C 顶不住了&#xff0c;这个时候大…

Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Strimzi Kafka Bridge(桥接)实战》的第三篇&#xff0c;前文咱们掌握了Strimzi Kafka Bridge的基本功能&#xff1a;基于http提供各种kafk…

特海国际通过港交所上市聆讯:翻台率下滑明显,张勇夫妇为实控人

撰稿|汤汤 来源|贝多财经 近日&#xff0c;海底捞&#xff08;HK:06862&#xff09;海外业务分拆公司特海国际控股有限公司&#xff08;下称“特海国际”&#xff09;通过港交所上市聆讯。据贝多财经了解&#xff0c;特海国际将以介绍形式于港交所主板上市。所谓介绍形式&…

数据挖掘Java——Apriori算法的实现

一、Apriori算法的前置知识 Apriori算法是一种挖掘关联规则的频繁项集算法&#xff0c;其核心思想是通过候选集生成和向下封闭检测两个阶段来挖掘频繁项集。 关联规则挖掘是数据挖掘中最活跃的研究方法之一&#xff0c;最初的动机是针对购物篮分析问题提出的&#xff0c;其目…

[附源码]Node.js计算机毕业设计工会会员管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【Linux学习】多线程

目录前言一、初识线程1. 线程的概念2. 线程的优缺点3. 线程异常4. 线程的用途二、Linux中的线程和进程1. 进程和线程的区别2. 进程中的线程共享三、Linux线程控制1. POSIX线程库2. 创建线程3. 线程终止4. 线程等待5. 线程分离四、Linux线程互斥1. 线程互斥的概念2. 互斥量mutex…

蓝桥杯基础算法(一)—— 快速排序

文章目录1. 基本思想2. 图解过程3. 代码模板4. 例题讲解&#x1f351; 快速排序&#x1f351; 第 k 个数1. 基本思想 快速排序是 Hoare 于 1962年 提出的一种二叉树结构的交换排序方法。 其基本思想为&#xff1a; &#xff08;1&#xff09;确定分界点&#xff1a;在数组中…

从零开始的MySQL(1)

目录1.MySQL的安装2.MySQL的基本操作2.1 展示数据库2.2 创建数据库2.3 选中数据库2.4 删除数据库2.5 常用数据类型2.5.1 整形2.5.2 浮点数2.6 创建表2.7 查看表2.7 查看表结构2.8 删除表3.数据库增删改查3.1 单行插入3.2 多行插入3.3 插入日期3.4 select查询3.4.1 select3.4.2 …

Jprofiler监控服务器的cpu

现象&#xff1a;压测过程中&#xff0c;发现应用服务器的cpu使用率比较高>80%&#xff0c;我们就可以判断服务器的cpu使用率太高了。 一般cpu太高有两种情况&#xff0c; 1.接口的性能非常好&#xff0c;比如响应时间<10ms&#xff0c;tps很高&#xff0c;此时的cpu使用…

CSDN官方插件猿如意可以用ChatGPT啦!

什么是 ChatGPT Chat GPT 是一种由 AI 技术驱动的自然语言处理工具&#xff0c;可让您与聊天机器人进行类似人类的对话等它是基于OpenAI的GPT-3架构进行构建的&#xff0c;并经过训练&#xff0c;以便能够回答人类的问题并进行自然对话ChatGPT可以回答关于各种话题的问题&#…

基于SSM广州旅游攻略网站的设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

【Unity】摄像机跟随鼠标移动以物体为中心旋转 物体根据视线方向移动

描述 实现摄像机根据鼠标移动跟随物体旋转&#xff0c;以摄像机前物体为中心&#xff0c;摄像机围绕物体旋转&#xff0c;并使摄像机时刻指向物体 实现效果 Unity 组件设置 Camera 组件设置 Body 组件设置 实现代码 CameraRotateMove.cs 摄像机跟随和旋转 using System.Co…

神经网络常用的训练方式,什么是神经网络训练法

1、神经网络中的模型训练是什么意思? 无导师学习网络 神经网络中的模型训练是通过自动寻找样本中的内在规律和本质属性,自组织、自适应地改变网络参数与结构。 神经网络在系统辨识、模式识别、智能控制等领域有着广泛而吸引人的前景&#xff0c;特别在智能控制中&#xff0c;…