AJAX学习总结+Axios异步框架+Filter拦截器学习+JSON介绍+Listener监听器介绍

news2024/11/26 2:27:17

壹、AJAX 

一、AJAX介绍

AJAX(Asynchronous JavaScript And XML):异步的JavaScript和XML

AJAX作用:

1. 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据。(原先是将Servlet中的数据存到request域中然后再转发到JSP中进行展示,现在使用了AJAX和服务器进行通信,可以使用HTML+AJAX来替换JSP页面,意思就是Servlet里的数据通过AJAX可以发送给前端html中的javascript即可进行展示)

2. 异步交互:在不重新加载整个页面的情况下,雨服务器交换数据并更新部分网页的技术,例如联想搜索。

二、AJAX快速入门

 第1步:创建核心对象代码:

var xhttp;
  if(window.XMLHttpRequest){
    xhttp = new XMLHttpRequest(); //获取xttp核心对象
  }else{
    xhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }

第2步:发送请求代码:

xhttp.open("GET","http://localhost:端口号/项目名/service文件名");
xhttp.send();

第3步: 获取响应代码:

 xhttp.onreadystatechange = function (){
    if(this.readyState == 4 && this.status == 200){
      alert(this.responseText); //执行代码
    }
};

在webapp下创建01-ajax-demo1.html,在里面写入如下java script代码,项目的名字是filter-demo,代码整合如下:

<script>
  //1.创建核心对象
  var xhttp;
  if(window.XMLHttpRequest){
    xhttp = new XMLHttpRequest();
  }else{
    xhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  //2.发送请求
  xhttp.open("GET","http://localhost:8080/filter-demo/ajaxServlet");
  xhttp.send();
  //3.获取响应
  xhttp.onreadystatechange = function (){
    if(this.readyState == 4 && this.status == 200){
      alert(this.responseText);
    }
  };
</script>

下面是AJAX的教程: 

三、案例

需求:在完成用户注册时,当用户名输入框失去焦点时,校验用户名是否在数据库已存在。

 

先在java-servlet下创建一个SelectUserServlet类,写入如下代码:

@WebServlet("/selectUserServlet")
public class SelectUserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");//1. 接收用户名
        boolean flag = true;//2. 响应标记,假设永远为true
        resp.getWriter().write(""+flag);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}

register.html写入如下代码:

<script>
    document.getElementById("username").onblur = function(){ //1. 给用户名输入框绑定,失去焦点事件
        //2.发送ajax请求
        var username = this.value;//获取用户名的值
        //2.1. 创建核心对象xhttp
        var xhttp;
        if(window.XMLHttpRequest){
            xhttp = new XMLHttpRequest();
        }else{
            xhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        //2.2. 发送请求
        xhttp.open("GET","http://localhost:8080/filter-demo/selectUserServlet?username="+username); //带有参数要加上参数,同时类名要改
        xhttp.send();
        //2.3. 获取响应
        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>

四、Axios异步框架

Axios对原生的AJAX进行封装,简化书写

官网:https://www,axios-http.cn

axious({ 里面这一部分负责发送请求,指定发送方式和url }).then( ( 这里面定义一个返回参数resp ){ data是真正返回的结果 } )

赋值axios的原码粘贴到webapp的js包下,同时创建一个新的html文件:

第1步:引入axios源码文件,在<body>标签里写如下代码:

<script src="js/axios-0.18.0.js"></script>

第2步:分别响应Get和Post请求的数据:

<script>
  //1.get
    /*axios({
      method:"get",
      url:"http://localhost:8080/filter-demo/axiosServlet?username=zhangsan"
    }).then(function(resp){
        alert(resp.data);
    })*/
  axios({
      method:"post",
      url:"http://localhost:8080/filter-demo/axiosServlet",
      data : "username=zhangsan"
  }).then(function(resp){
      alert(resp.data);
  });
  </script>

axios.get("http://localhost:8080/filter-demo/axiosServlet?username=zhangsan").then(function(resp){
      alert(resp.data);
  })
  axios.post("http://localhost:8080/filter-demo/axiosServlet","username=zhangsan").then(function(resp){
      alert(resp.data);
  });

五、JSON

JSON(JavaScript Object Notation):JavaScript对象表示法。

键必须要加引号。

JSON基础语法:

<body>
  var json{
    "name":"zhangsan",
    "age":23,
    "addr":["北京","上海","西安"]
  };
  <script>
      alert(json.name);
  </script>
</body>

请求数据:JSON字符串转为Java对象

响应数据:Java对象转为JSON字符串

1. 导入坐标

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

2. Java对象转JSON

String jsonStr = JSON.toJSONString(obj);

3. JSON字符串转Java对象

User user = JSOON.parseObject(jsonStr,User.class);

 下面是具体实现:

public class FastJsonDemo {
    public static void main(String argv[]) {
        // 1.将Java对象转为Json字符串
        User user = new User();
        user.setId(1);
        user.setUsername("zhangsan");
        user.setPassword("123");
        String jsonString = JSON.toJSONString(user); //toJSONString方法
        System.out.println(jsonString);
        // 2.将JSON字符串转为Java对象
        User u = JSON.parseObject("{\"id\":1,\"password\":\"123\",\"username\":\"zhangsan\"}", User.class);
        System.out.println(u);
    }
}

六、综合案例

 在service中创建SelectAllServlet类编写如下代码:

@WebServlet("/selectAllServlet")
public class SelectAllServlet extends HttpServlet {
    private BrandService brandService = new BrandService();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1. 调用哪个Service查询
        List<Brand> brands = brandService.selectAll();
        //2 将集合转换为JSON数据,序列化
        String jsonString = JSON.toJSONString(brands);
        //3. 响应数据
        resp.setContentType("text/html;charset=utf-8");//处理中文
        resp.getWriter().write(jsonString);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

 注意几个点:1.url必须要填的是web层写的那个selectAllServlet,否则数据可能为空。2.记得要在function里填写resp。3.记得如果想出现表格必须要加table标签。

<body>
<a href="addBrand.html"><input type="button" value="新增"></a><br>
<table id="brandTable" border="1" cellspacing="0" width="100%"/>
<script src="js/axios-0.18.0.js"></script>
    <script>
        window.onload = function(){//1. 当页面加载完成后,发送ajax请求
            axios({// 2. 发送ajax请求
                method:"get",
                url:"http://localhost:8080/brand-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 +="\n" +
                        "        <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" +
                        "\n" +
                        "        <td><a href=\"#\">修改</a> <a href=\"#\">删除</a></td>\n" +
                        "    </tr>";
                }
                document.getElementById("brandTable").innerHTML = tableData; //设计表格的数据,展示数据可能
            })
        }
    </script>
</body>

贰、Filter与Listener

 一、Filter概述、入门和执行流程

1. 概念:Filter标示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。

2. 作用:过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。过滤器一般用于完成一些通用的操作,比如:权限控制,统一编码处理,敏感字符处理等等...

步骤:

在java-web-filter下创建类FilterDemo

在类中写下如下代码:

@WebFilter("/*")
public class FilterDemo implements Filter {//继承的Filter必须是java.servlet下面的包
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("FilterDemo...");
        chain.doFilter(request, response);//放行
    }
}

第1步:实现类,实现Filter接口,并重写其所有方法

public class FilterDemo implements Filter{
    public void init(FilterConfig filterConfig)
    public void doFilter(ServletRequest request)
    public void destroy(){}
}

 第2步:配置Filter拦截资源的路径:在类上定义@WebFilter注解,表示对哪些页面进行拦截:

@WebFilter("/*")
public class FilterDemo implemens Filter{}

 第3步:在doFilter方法中输出一句话,然后放行

public void doFilter(ServletRequest request,)
{
    System.out.println("filter被执行了...");
    chain.doFilter(request,response);
}

 注意:在doFilter放行后也可以写代码,执行放行后的逻辑。

二、Filter拦截路径配置&过滤器链

1. 拦截路径配置:写在@WebFilter注解里的路径会被拦截:

2. 过滤器链:配置多个过滤器,都会被执行,像个链条一样:

注意:先执行1,后执行2,返回来后,是先执行2,再执行1,类似堆栈。

输出结果:aaa - ccc - ddd - bbb

执行的顺序:优先级按照过滤器的类名(字符串)的字典序排序。字典序更小的先执行。

三、案例

在java-web下创建LoginFilter类:

@WebFilter("/*")
public class LoginFilter implements Filter {//继承的Filter必须是java.servlet下面的包
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //首先判断session中是否有user
        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");
        if(user != null){//判断user是否为null,不为null用户登录过
            chain.doFilter(request, response);//放行 
        }else{//没登录,拦截跳转到登录页面
            req.setAttribute("login_msg","您尚未登录!");
            req.getRequestDispatcher("/login.jsp").forward(req,response);
        }
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void destroy() {
    }
}

出现问题:将css样式都给拦截了:

因此要将登陆和注册的资源全部放行:

//判断访问的资源路径是否和登录注册相关
String[] urls = {"/login.jsp","/imgs/","/css/","loginServlet","register.jsp","regiserServlet","checkCodeServlet"};
String url = req.getRequestURL().toString();//获取当前访问的资源路径
for(String u : urls){
     if(url.contains(u)) { //如果访问的url包含上面
         chain.doFilter(request, response);//放行
     return; //退出
  }
}

四、Listener

Listener表示监听器,是JavaWeb三大组件之一。

监听器可以监听application,session,request三个属性创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

在java-web-listener下创建ContextLoaderListener,写入如下代码即可:

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

叁、学习总结

一、学习复盘

1. 查询数据原理:BrandMapper和BrandMapper.xml其实是在同一个目录下。mybatis-config.xml主要负责链接数据库。在BrandMapper里写了SQL语句,主要提供同数据库的交互,会将查询结果返回。在Service层中通过SqlSessionFactory获取SqlSession对象,然后再获得BrandMapper的对象,就可以直接通过对象来调用查询方法返回结果。web层创建了service的对象,于是可以直接通过调用方法来获取结果。

二、面试真题

三、常见问题
 

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

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

相关文章

过于依赖性的危机:探索品牌代理商背后的实质含义

据IDC中国报道称&#xff1a;2023年中国低代码与零代码软件市场规模将达到34.7亿元人民币&#xff0c;同比增长32.4%。预计到2027年市场规模将达到106.3亿元人民币&#xff0c;未来5年市场年复合增长率&#xff08;CAGR&#xff09;为32.3%。 随低代码市场规模不断扩大&#xf…

【计算机网络】 确认应答机制与超时重传

文章目录 ACK机制——确认应答机制超时重传 ACK机制——确认应答机制 当我们客户端发送了一个数据&#xff0c;seq是1100&#xff0c;那么服务端在收到时就会回一个ack101的ACK包&#xff0c;代表101之前的包我都收到了&#xff0c;下面请你从101继续发送。然后客户端就会发送1…

无涯教程-JavaScript - IMARGUMENT函数

描述 IMARGUMENT函数返回参数$\theta $(theta),以弧度表示的Angular,如- $$x yi \left | x yi \right | e ^ {i \theta} \left | x yi \right |(\cos \theta \sin \theta)$$ 语法 IMARGUMENT (inumber)争论 Argument描述Required/OptionalInumberA complex number f…

【C++基础】7. 控制语句

文章目录 【 1. 循环 】1.1 循环类型1.2 循环控制语句break 语句continue 语句goto 语句 1.3 无限循环 【 2. 选择 】switch 语句&#xff1f;&#xff1a;语句 【 1. 循环 】 1.1 循环类型 循环类型描述while 循环当给定条件为真时&#xff0c;重复语句或语句组。它会在执行…

floodfill算法(洪水灌溉算法)

一)floodfill算法简介: 二)图像渲染 733. 图像渲染 - 力扣&#xff08;LeetCode&#xff09; class Solution {int[] dx {1, 0, 0, -1};int[] dy {0, 1, -1, 0};//上下搜索的时候要使用向量数组int row0;int col0;int target0;public void dfs(int[][] image,int i,int j,int…

认识模块化

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组 合、分解和更换的单元。 1. 现实生活中的模块化 2.编程领域中的模块化 编程领域中的模块化&#xff0c;…

教你如何快速阅读葡萄酒标签

我们经常被问及葡萄酒标签上写了什么&#xff0c;总体而言这些信息可以分为四个关键部分&#xff0c;第一品牌或生产商&#xff1b;第二国家或地区&#xff1b;第三葡萄品种&#xff1b;第四年份。 第一品牌或生产商&#xff0c;在寻找葡萄酒的制造商时&#xff0c;著名的品牌名…

手机充值的功能测试框架 - 测试要点

手机充值有微信营销活动的、有 APP 页面应用等&#xff0c;以下是我以前公司的手机充值话费或流量应用的测试要点&#xff0c;分享给大家参考下。 一、手机号码输入框检查 1、手机号码框要控制成只能输入11位数字的文本框。 2、输入以非1开头的手机号&#xff0c;给出提示&a…

第 2 章 线性表 (设立尾指针的单循环链表(链式存储结构)实现)

1. 背景说明 循环链表(circular linked list)&#xff0c;是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点&#xff0c; 整个链表形成一个环。由此&#xff0c;从表中任一结点出发均可找到表中其他结点 。 2. 示例代码 1) status.h /* DataStruct…

Parsing error: The keyword ‘const‘ is reserved

Parsing error: The keyword ‘const’ is reserved 在文件.eslintrc.js中 因为eslint默认审查的es5&#xff0c;需要明确让他审查es6.&#xff0c;所以需要配置parserOptions 配置如下: module.exports {"plugins": ["prettier"],"rules": {…

【自学开发之旅】Flask-标准化返回-连接数据库-分表-orm-migrate-增删改查(三)

业务逻辑不能用http状态码判断&#xff0c;应该有自己的逻辑判断。想要前端需要判断&#xff08;好多if…else&#xff09;&#xff0c;所以需要标准化&#xff0c;标准化返回。 json标准化返回: 最外面&#xff1a;data,message,code三个字段。 data&#xff1a;返回的数据 co…

【Unity基础】2.网格材质贴图与资源打包

【Unity基础】2.网格材质贴图与资源打包 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;网格材质纹理 第一次接触3D物体的话&#xff0c;会觉得好神奇啊&#xff0c;这个物体究竟是由什么组…

教育志愿者的初心与担当

近日&#xff0c;有报道显示&#xff0c;在全球范围内&#xff0c;大约有6000万的儿童由于各种原因无法接受基础教育&#xff0c;其中非洲大陆的教育贫瘠现象尤为显著。然而&#xff0c;在这片土地上&#xff0c;有一位中国年轻志愿者Lily Zhu&#xff0c;以一种富有创新精神的…

Mysql中in和exists的区别 not in、not exists、left join的相互转换

文章目录 1. in 介绍1.1 in中数据量的限制1.2 null值不参与in或not in&#xff0c;也就是说in and not in 并不是全量值&#xff0c;排除了null值1.3 in的执行逻辑 2. exists介绍2.1 exists not exists 是全量数据2.2 exists的执行逻辑 3. 小表驱动大表的好处4. in、not in、e…

图像噪声--添加噪声

椒盐噪声 椒盐噪声就是给图片添加黑白噪点&#xff0c;椒指的是黑色的噪点(0,0,0),盐指的是白色的噪点(255,255,255)&#xff0c;通过num来控制噪声多少&#xff0c;值越大添加的噪声越多&#xff0c;图像损坏的更加严重。 void add_salt_pepper_noise(Mat& src,Mat& …

Mojo-SDK详细安装教程

Mojo-SDK安装 运行环境&#xff1a;windows11wsl2&#xff08;ubuntu1804&#xff09; 截至20230909&#xff0c;windows,mac系统暂时不支持 step1: Install VS Code, the WSL extension, and the Mojo extension. step2: Install Ubuntu 22.04 for WSL and open it. step…

Vue el-table 重置按钮设计模板

vue 文件演示模板 <template><el-button icon"el-icon-refresh" size"large" click"resetFunction">重置</el-button><el-tableheight"450"v-loading"loading":data"dataList":row-key&quo…

U盘插上就让格式化是坏了吗?数据怎么恢复

U盘插上就让格式化是坏了吗&#xff1f;当您遇到U盘插上后提示需要格式化的情况时&#xff0c;不要慌张。这种情况并不一定意味着U盘已经坏了。下面我们一起来了解下如何恢复里面的数据&#xff0c;并解决U盘提示格式化的问题。 U盘一插上就提示格式化是什么原因 许多人可能会有…

个人微信多账号聚合管理如何实现?

在日常工作中&#xff0c;您是否会遇到以下问题&#xff1a; 微信号多&#xff0c;需反复切换设备及账号&#xff0c;工作效率低。 无法快速响应客户消息&#xff0c;客户体验感差。 无法随时掌握员工与客户沟通情况&#xff0c;员工沟通质量难以控制&#xff0c;管理难。 员…

Spring系列文章:面向切面编程AOP

一、代理模式 1、代理模式使用场景引入 ⽣活场景1&#xff1a;⽜村的⽜⼆看上了隔壁村⼩花&#xff0c;⽜⼆不好意思直接找⼩花&#xff0c;于是⽜⼆找来了媒婆王妈妈。这 ⾥⾯就有⼀个⾮常典型的代理模式。⽜⼆不能和⼩花直接对接&#xff0c;只能找⼀个中间⼈。其中王妈妈是…