当前位置: 首页 > news >正文

以SpringBoot作为后台实践ajax异步刷新

1.什么是ajax

1.Ajax全称:Asynchronous JavaScript And XML

2.是一种异步加载数据的技术

3.可以通过使用Ajax,实现页面的局部刷新

简单来讲就是通过ajax,你不需要重新刷新整个页面就能实现对局部页面的刷新操作。

2.AJAX的使用

使用ajax主要有以下四步骤

//1.创建ajax对象
var xhr=new XMLHttpRequest();
2.监听ajax对象
xhr.onreadystatechange=function(){}
3.打开对象
xhr.open()
4.发送请求
xhr.send()

ajax有get和post两种方式发送请求,下面通过java和ajax模拟异步刷新。java方面以SpringBoot作为后台。

3.SpringBoot后台的搭建

搭建SpringBoot后台不是一件困难的事情,下图是整个项目的结构图

3.1 创建项目,引入依赖

创建maven项目,引入SpringBoot相关的依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sdxb</groupId>
    <artifactId>ajaxtest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3.2 编写启动类和配置文件

编写SpringBoot的启动类AjaxtextApplication

@SpringBootApplication
public class AjaxtestApplication {
    public static void main(String[] args) {
        SpringApplication.run(AjaxtestApplication.class);
    }
}

所有html代码均放在resource文件夹下的templates中,在application.properties文件中表明静态文件路径

spring.resources.static-locations=classpath:/templates/
spring.mvc.view.suffix=.html

3.3 编写controller

新建indexController,首先写一个简单的方法,用于返回我们第一个静态页面index.html

@Controller
public class indexController {
    @RequestMapping("/test")
    public String index(){
        return "index";
    }
}

至此,一个简单的java后台就搭完了。

4.ajax的get请求

我们写一个简单的页面,只包含一个按钮和一行文本。然后通过ajax的get请求去后端请求一段数据,不断刷新到文本处。下面是html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<input type="button" id="btn" value="button">
<h1>test</h1>
<script type="text/javascript">
    var btn=document.getElementById("btn");
    btn.onclick=function () {
        //1.创建ajax对象
        var xhr=new XMLHttpRequest();
        //2.监听ajax对象
        xhr.onreadystatechange=function () {
            /*
            /当xhr对象的readystate属性发生了改变,这个事件就会触发
            readyState:
            0 ===>xhr对象已经创建,但是还没有进行初始化操作
            1===>xhr对象已经调用了open
            2===)xhr已经发出ajax请求
            3 ===>已经返回了部分数据
            4===>数据已经全部返回
            */
            if (xhr.readyState!=4){
                return;
            }
            //如果请求没有出错则会返回200-300的状态码
            if (xhr.status>=200&&xhr.status<=300){
                document.getElementsByTagName("h1")[0].innerHTML+=xhr.responseText;
            }
        }
        //3.打开对象,第三个参数表示是否使用异步
        xhr.open("get","http://localhost:8080/test2",true);
        //4.发送请求
        xhr.send();
    }
</script>
</body>
</html>

关键的ajax代码处已经用注解标出。还需要在controller中处理http://localhost:8080/test2的请求,在indexController中添加以下代码:

@GetMapping("/test2")
@ResponseBody
public String index2(HttpServletResponse response){
    return "hello world";
}

运行项目,输入http://localhost:8080/test,不断点击按钮,不断将文本刷新到页面上:

5.ajax的post请求

通常需要提交数据的场景都会使用post请求,通过表单提交数据,因此就来模拟登陆的场景。为了方便,我直接将用户名和密码写在前端代码中:login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<input type="button" id="btn" value="button">
<h1>test</h1>
<script type="text/javascript">
    var btn=document.getElementById("btn");
    btn.onclick=function () {
        //1.创建ajax对象
        var xhr=new XMLHttpRequest();
        //2.监听ajax对象
        xhr.onreadystatechange=function () {
            /*
            /当xhr对象的readystate属性发生了改变,这个事件就会触发
            readyState:
            0 ===>xhr对象已经创建,但是还没有进行初始化操作
            1===>xhr对象已经调用了open
            2===)xhr已经发出ajax请求
            3 ===>已经返回了部分数据
            4===>数据已经全部返回
            */
            if (xhr.readyState!=4){
                return;
            }
            if (xhr.status>=200&&xhr.status<=300){
                //处理后端传送的json对象
                var result=JSON.parse(xhr.responseText)
                if (result.res==true){
                    document.getElementsByTagName("h1")[0].innerHTML="登陆成功";
                } else {
                    document.getElementsByTagName("h1")[0].innerHTML="登陆失败";
                }
            }
        }
        //3.打开对象
        xhr.open("post","http://localhost:8080/test3",true);
        //使用post请求需要为xhr对象添加请求头部
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        //4.发送请求,数据写在参数中
        xhr.send("username=sdxb&password=123456");
    }
</script>
</body>
</html>

同样在indexController中再写两个方法:

@RequestMapping("/log")
public String login(){
    return "login";
}
@PostMapping("/test3")
@ResponseBody
public Result index3(HttpServletRequest request,HttpServletResponse response){
    String username=request.getParameter("username");
    String password=request.getParameter("password");
    Result result=new Result();
    if (username.equals("sdxb")&&password.equals("123456")){
        result.setRes(true);
        return result;
    }
    else {
        result.setRes(false);
        return result;
    }
}

这里的Result对象是自己写的类,只包含一个Res对象,当使用了@ResponseBody后,返回对象时会自动转化成json对象传递给前端。

 附上github代码:https://github.com/OliverLiy/springbootANDajax

相关文章:

  • 观察:阿里的VR实验室能解决什么问题?
  • JavaIO详解--JavaIO的整体结构以及File类的使用
  • 学习笔记:对象,原型和继承(1)
  • JavaIO详解--快速学懂字节流与字符流
  • 搭建IM服务 so easy
  • JavaIO详解--尽可能将BIO、NIO、AIO讲得通俗易懂
  • 用jedis获取redis连接(集群和非集群状态下)
  • Mysql的索引调优详解:如何去创建索引以及避免索引失效
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • 经验分享:JAVA实习生刚进公司主要做些什么?以及进入职场后我的心理变化
  • oracle迁移mysql数据库注意(转)
  • 实习工作经历:代码在本地明明可以跑通,怎么放到服务器上就不行了呢?
  • 搭建一个包含多种Get请求和Post请求的工具类
  • 一致性hash原理与实现
  • 作为一个程序员需要了解多少网络方面的基础?网络基础总结(不断更新)
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Fundebug计费标准解释:事件数是如何定义的?
  • Git 使用集
  • HTML中设置input等文本框为不可操作
  • java概述
  • js中forEach回调同异步问题
  • Python学习之路13-记分
  • 分布式熔断降级平台aegis
  • 关于for循环的简单归纳
  • 马上搞懂 GeoJSON
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 使用Gradle第一次构建Java程序
  • 算法---两个栈实现一个队列
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 新手搭建网站的主要流程
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 走向全栈之MongoDB的使用
  • 【干货分享】dos命令大全
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​ssh免密码登录设置及问题总结
  • $.each()与$(selector).each()
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (补)B+树一些思想
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计ssm电影分享网站
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .net 发送邮件
  • .NET 反射的使用
  • .net 无限分类
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET是什么
  • @SpringBootApplication 包含的三个注解及其含义
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [AIGC] 解题神器:Python中常用的高级数据结构