12_JavaWebAjax

文章目录

  • Ajax
  • 1. 同步请求异步请求
  • 2. Ajax实现方式
  • 3. 日程管理第四期
  • 4. 响应JSON串
    • 4.1 响应JSON串格式的一般格式
  • Appendix

Ajax

发送请求的一些方式

1.输入浏览器回车

2.html>head>script/link

​ img标签

3.a标签form表单标签等

用户手动控制提交产生;

4.通过js代码产生请求;

Ajax的原理,通过js技术向后端发送请求,通过响应来进行判断是否 进行页面跳转,是否生成数据展示到dom树中

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

1. 同步请求异步请求

在这里插入图片描述

2. Ajax实现方式

  • 假如按钮触发了一个名为getmesssgae的js函数

  • script部分

    <script>
        function getmessage(){
            // 1.实例化一个xmlHttpRequest对象
            var req  = new XMLHttpRequest;

            // 2.设置xmlHttpRequest回调函数

            // 3.设置发送请求的方式和请求资源路径
            req.open("GET","/hello?username=zhangsan");

            // 4.发送请求
            req.send();
        }
    </script>

第二部分的代码有点多,很难写

  • 往页面上做出响应的代码*
req.onreadystatechange = function(){
    if(req.readyState==4&&req.status==200);
    // alert("后端响应了")
    console.log(req.responseText)

    //将信息放到指定的位置
    var inputEle = document.getElementById("message")
    inputEle.value = req.responseText
}
  • 进行页面跳转*
window.location.href="http://www.atguigu.com"

3. 日程管理第四期

注册提交前进行校验用户名是否占用功能;

也就是前端checkUsername函数 校验完格式后,继续进行是否占用校验 并修改 usernameMsg信息

  • 创建XMLHTTPRequest对象
var req = new XMLHTTPRequest()
  • 设置回调函数
req.openstatechange = function(){

​	if(req.status ==200 && req.readyState = 4){

​		usernameMsg.innerText = req.responseText;

​	}

}
  • 设置请求方式和 资源路径映射
req.open(“GET”,”user/checkUserUsed?username=”+username)
  • 发送请求
req.send()

使用Ajax技术在不跳转的情况下响应到前端页面

//控制层新增函数checkUsernameUsed
    /**
     * 注册时接收要注册的username,目的是检测其是否 合法是否被占用
     * @param req
     * @param resp
     */
    protected void  checkUsernameUsed(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//        接收用户名
        String username = req.getParameter("username");
//        服务层进行查询该用户名是否存在用户
        int username1 = userService.findUsername(new SysUser(null, username, "******"));

//        如果有响应已占有
//        如果没有响应可用
        /**
         * 0表示没查出来 username
         * 1表示 占用
         */
        String info = null;
        if (username1==0){
            info="可用";
        }else if (username1==1){
            info="不可用";
        }
        resp.getWriter().write(info);

    }

注意:本次开发传参仅传入username,但是会设置一个密码,这个密码必须不为空,因为后续代码逻辑会送入MD5校验,为空报错;

密码直接设置为

******

前端代码 会进行校验格式;用户无法起此代码

4. 响应JSON串

JSON串解决问题如下

  • 响应乱码问题

  • 响应信息格式问题

​ 后端响应的信息应该是JSON格式,前后端共同尊守;

​ 如果响应可用不可用;前后端需要保持一致,就很麻烦,后端代码进行修改了,那么前端也需要跟着改;

​ 统一的格式是前后端商量好的

  • 校验不通过无法阻止表单提交

4.1 响应JSON串格式的一般格式

{

​ 响应行 状态码200,404…

​ 响应头

​ 响应体 { code:”1成功/0失败”, message:业务状态码,“data”:{} }

}

响应报文如上图所示;
所谓的JSON串格式写的是 响应体中的东西
响应行必须触发,把东西响应回来,因此响应行状态码必须是200
响应体中的码是前后端提前商量好的;
code		业务状态码
message		业务状态码的补充说明
data		本次响应数据			具体内容根据业务相关
  • 具体流程

我们使用jacksonlib包 转化json格式,减少后端程序员拼写字符串的难度

后端程序员撰写响应体的 class ,后续使用,直接new对象,将我们业务数据封装进去即可

public class Result<T> {
    private Integer code;
    private String message;
    private T data;
}
  • 后续会将Result对象使用jackon转化为json串

  • 关于业务码code使用枚举形式进行定义,用的时候直接拿来用即可

public enum ResultCodeEnum {
    /**
     * 此处创建枚举对象,自动的调用下面的构造器;
     */
    SUCCESS(200,"success"),
    USER_ERROR(501,"usernameError"),
    PASSWORD_ERROR(503,"passwordError"),
    NOT_LOGIN(504,"notLogin"),
    USER_USED(505,"usernameUsed");

    private Integer code;
    private String message;

    ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}
  • 此处创建枚举对象,自动的调用下面的构造器;
  • 枚举常量通常使用大写字母表示,默认常量 不可修改;
  • 枚举本身是一个类,具有类的所有成分,每一个枚举常量都是枚举类的实例,因此可以看出上面写法;
  • 创建Result类 未来后端传递数据使用Result对象即可;
package schedule.common;

/**
 * 全局统一响应的JSON格式处理类
 *
 */
public class Result<T> {
    // 返回码
    private Integer code;
    // 返回消息
    private String message;
    // 返回数据
    private T data;

    public Result(){}
    // 返回数据
    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<T>();
        if (data != null)
            result.setData(data);
        return result;
    }


    /**
     * 对上一个build的重载,除了设置data以外,还要进行code,message的设置;
     * @param body
     * @param code
     * @param message
     * @return
     * @param <T>
     */
    public static <T> Result<T> build(T body, Integer code, String message) {
        Result<T> result = build(body);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }
    /**
     * 操作成功,默认是将数据传进去,设置成功的状态码;
     * @param data  baseCategory1List
     * @param <T>
     * @return
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }
    public Result<T> message(String msg){
        this.setMessage(msg);
        return this;
    }
    public Result<T> code(Integer code){
        this.setCode(code);
        return this;
    }

//    ------------------------------下面是常规的GetSet方法------------------------------

    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
} 
  • 因此在后端传递的时候,传递码可以如下表示
        Result result = Result.ok();
        String info = null;
        if (username1==0){
            result = result.ok(null);
        }else if (username1==1){
            result = result.build(null, ResultCodeEnum.USER_USED);
        }
  • 接下来将result转化为JSON串
  • 导入jar包

在这里插入图片描述

  • 导入jar包后使用ObjectMapper进行 对象–>JSON串转化
//        接下来将result转化为json串响应给客户端
        ObjectMapper objectMapper = new ObjectMapper();
        String info = objectMapper.writeValueAsString(result);
        resp.getWriter().write(info);

对象转JSON串步骤

​ --导jackson包;

​ --实例化ObjectMapper对象

​ --直接使用writeValueAsString即可

  • 最终还需要告诉客户端响应json串格式
 resp.setContentType("application/json;charset=UTF-8");
  • 响应结果如下所示

在这里插入图片描述

  1. 创建WebJson工具类
public class WebJson {
    private static ObjectMapper objectMapper;

    static {
        objectMapper = new ObjectMapper();
    }
    public static void  writeJson(HttpServletResponse resp, Result result){
        resp.setContentType("application/json;charset=UTF-8");
        try {
            String s = objectMapper.writeValueAsString(result);
            resp.getWriter().write(s);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

因此所有代码一句话即可

在这里插入图片描述

writeJson是一个静态方法,因此这个工具包,调的不是类,是静态方法;可以直接类名.方法进行调用

Appendix

//回调函数不会阻止表单提交;未来使用vue axios 结合promise处理;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验七、创建小型实验拓扑《计算机网络》

早检到底是谁发明出来的。 一、实验目的 完成本实验后&#xff0c;您将能够&#xff1a; • 设计逻辑网络。 • 配置物理实验拓扑。 • 配置 LAN 逻辑拓扑。 • 验证 LAN 连通性。 二、实验任务 在本实验中&#xff0c;将要求您连接网络设备并配置主机实现基本的网络…

R语言探索与分析20-北京市气温预测分析

一、序言 近年来&#xff0c;人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放&#xff0c;大量温室气体强烈吸收地面辐射中的红外线&#xff0c;造 成温室效应不断累积&#xff0c;使得地球温度上升&#xff0c;造成全球气候变暖。气象温度的预测一直以来都是天气预…

计算机毕业设计 | 基于node(Koa)+vue 高校宿舍管理系统 宿舍可视化(附源码)

1&#xff0c;绪论 1.1 项目背景 随着科技的发展&#xff0c;智能化管理越来越重要。大学生在宿舍的时间超过了1/3&#xff0c;因此良好的宿舍管理对学生的生活和学习极为关键。学生宿舍管理系统能够合理安排新生分配宿舍&#xff0c;不浪费公共资源&#xff0c;减轻学校管理…

微信扫普通二维码后通过小程序观看的实现

为了方便小程序开发者更便捷地推广小程序&#xff0c;兼容线下已有的二维码&#xff0c;微信公众平台开放扫描普通链接二维码跳转小程序能力。 功能介绍 普通链接二维码&#xff0c;是指开发者使用工具对网页链接进行编码后生成的二维码。 线下商户可不需更换线下二维码&…

【面试干货】SQL中count(*)、count(1)和count(column)的区别与用法

【面试干货】SQL中count&#xff08;*&#xff09;、count&#xff08;1&#xff09;和count&#xff08;column&#xff09;的区别与用法 1、count(*)2、count(1)3、count(column) &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在SQL中&a…

基于GTX 8B10B编码的自定义PHY上板测试(高速收发器十四)

前文整理了GTX IP&#xff0c;完成了自定义PHY协议的收发模块设计&#xff0c;本文将通过光纤回环&#xff0c;对这些模块上板测试&#xff0c;首先需要编写一个用于生成测试数据的用户模块。 1、测试数据生成模块 本模块用于生成自定义PHY协议的测试数据&#xff0c;通过axi_…

【微信小程序】页面导航

声明式导航 导航到 tabbar 页 tabBar页面指的是被配置为tabBar的页面。 在使用<navigator>组件跳转到指定的tabBar页面时&#xff0c;需要指定url属性和open-type属性&#xff0c;其中&#xff1a; url 表示要跳转的页面的地址&#xff0c;必须以/开头open-type表示跳…

Python轻量级嵌入式关系数据库之apsw使用详解

概要 在现代应用开发中,数据库是一个非常重要的组成部分。SQLite 是一个轻量级的嵌入式关系数据库管理系统,被广泛应用于各种应用程序中。APSW(Another Python SQLite Wrapper)库是一个专门用于访问 SQLite 数据库的 Python 包,它提供了 SQLite 所有的功能,并且比标准库…

usb设备在主机和VMWare虚拟机中切换连接

操作&#xff1a;点击菜单栏虚拟机(M)>可移动设备>选择自己的usb设备>连接(断开与 主机 的连接)

【会议征稿,ACM出版】2024年图像处理、智能控制与计算机工程国际学术会议(IPICE 2024,7月9-11)

2024年图像处理、智能控制与计算机工程国际学术会议&#xff08;IPICE 2024&#xff09;将于2024年7月9-11日在中国福州举行。本届会议由阳光学院、福建省空间信息感知与智能处理重点实验室、空间数据挖掘与应用福建省高校工程研究中心联合主办。 会议主要围绕图像处理、智能控…

巨详细Linux安装Tomcat教程

巨详细Linux安装Tomcat教程 1、检查是否残留其他版本2、上传安装包至服务器2.1安装包获取2.2创建相关目录 3、安装Tomcat3.1安装3.2启动3.3web页面 4、配置Tomcat4.1把tomcat进程交给systemctl管理4.2设置tomcat开机自启动 1、检查是否残留其他版本 #检查残留数据 rpm -qa|gre…

Eclipse添加C和C++编译成汇编文件的选项

在miscellaneous中添加assemble listing选项就可以生成汇编文件了

C++标准模板(STL)- 迭代器库-迭代器适配器- 逆序遍历的迭代器适配器 (二)

迭代器库-迭代器原语 迭代器库提供了五种迭代器的定义&#xff0c;同时还提供了迭代器特征、适配器及相关的工具函数。 迭代器分类 迭代器共有五 (C17 前)六 (C17 起)种&#xff1a;遗留输入迭代器 (LegacyInputIterator) 、遗留输出迭代器 (LegacyOutputIterator) 、遗留向前…

网站安全小白也能搞定的SSL证书安装免费方法

大家都知道&#xff0c;部署一个网站&#xff0c;除了购买域名&#xff0c;现在基本标配SSL证书。 我们以aliyun为例 大家看到这个&#xff0c;收费的SSL证书几千-几万1年不等。这时候&#xff0c;你就会想有没有免费的可以搞。linux老鸟都知道&#xff0c; Let’s Encrypt 、…

微信小程序多端框架打包后发布到华为市场

app上架华为应用市场 一、android 发布到华为应用市场 1、华为应用市场注册开发者账号 https://developer.huawei.com/consumer/cn/?ha_sourcesem&ha_sourceId89000605 2、进行企业认证 3、app隐私弹窗 miniapp-privacy.json 1、协议弹窗内容&#xff1a; {"tit…

创新“智”领长江经济带高质量发展研讨会调研实在智能

近日&#xff0c;创新“智”领长江经济带高质量发展研讨会暨央企智库沙龙第46期在浙江杭州顺利召开。 会议由中国联通主办&#xff0c;中国联通研究院、浙江联通、浙江省人民政府国有资产监督管理委员会联合承办&#xff0c;长江经济带沿线中央企业、地方国资国企等60余家单位…

SwiftUI中ContentUnavailableView的使用(iOS 17、tvOS 17推出的新组件)

iOS 17为SwiftUI带来了一个新的组件ContentUnavailableView&#xff0c;它允许我们向用户呈现一个空状态&#xff0c;而不需要创建自定义错误或者无内容视图。 ContentUnavailableView易于使用&#xff0c;可自定义&#xff0c;并且具有用于空搜索状态的预定义视图。 建议在无…

113、python-第四阶段-10-正则表达式-元字符匹配

为啥这个找到了呢&#xff0c;咱们看一下&#xff0c;这个少了一个开头和结尾&#xff0c;如果从开头开始肯定是不符合的&#xff0c;进行下边的修改

数据分析:小红书黏土风走红,洞察年轻人消费密码

导语 近期&#xff0c;一组由“AI黏土滤镜”生成的黏土风图片刷屏小红书。治愈系的颜色、粗糙的肌理感、带着几分可爱的傻气的人物形象…一夜之间&#xff0c;这个世界仿佛已经被黏土星人占领。 图 | 千瓜数据 越丑越上头&#xff1f;黏土风掀起反传统的审美观 当各类美颜滤…