zoukankan      html  css  js  c++  java
  • 自学JavaWeb_Ajax

    Ajax

    一、Ajax 基础

    (一)Ajax简介

    Ajax的应用场景:

    1. 现在最火的快手和抖音, 点赞或者实时评论
    2. 百度搜索框的自动补全功能

     

    1. 用户信息的校验(是否唯一或者是否可用)

     

    什么是ajax?

     

    Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

    Ajax的实现方式有两种:

    1. 原生版JSAjax实现(了解)
    2. jQuery框架版的Ajax实现(重点掌握)

    (二)原生JS实现Ajax请求(了解)

    JS原生ajax:出现最早。需要使用一个AJAX引擎对象。专门用于进行ajax请求发送,和响应的接收.

    AJAX引擎对象: XMLHttpRequest

     

    实现步骤:

    1. 定义一个AJAX引擎对象(核心对象)
    2. 通过核心对象.open方法向当前对象提供访问方式和url路径
    3. 向后台发送请求
    4. 接收返回值并处理

    案例:

    前台页面通过一个按钮向后台发送一个Ajax请求,后台做完处理后向前台页面响应一段文本信息显示在页面上。

     

     

     

     

     

    缺点:

    1. 为了实现简单功能, 需要书写大量代码
    2. 对浏览器的兼容性不好

    (三)jQueryAjax

    JS版的Ajax仅做为了解,我们重点学习jQuery版的Ajax,这也是程序员最普遍使用,语法结构简单,代码可读性好。

    jQuery版的ajax实现:

    1. $.ajax()
    2. $.get()
    3. $.post()

    1、$.ajax

    模板格式

    $.ajax({

    Url:””, //后台服务器地址

    Data:{}, //参数   键值对形式 {”name”:”value”}

    Type:”get/post”, //请求方式

    dataType:””, //返回值类型

    Async:true/false, //异步或者是同步, (默认是异步)

    Success:function(obj){

         //响应成功的回调函数

    },

    Error:function(){

         //响应失败

    }

    })

    属性解析:

    属性名称

    解释

    url

    请求服务器路径(form表单中的action一样,都是代表请求的路径)

    data

    前台需要向后台服务器传递的数据(键值对形式)

    type

    form表单中method对应,代表请求类型 get/post(默认为Get请求)

    async

    取值是布尔类型true/false,分别表示异步和同步,默认为true(异步),一般不建议写

    dataType

    回传的数据类型。text、xmlhtmljson...

    success

    请求成功的回调函数,参数obj表示返回值(后台响应成功的文本数据)

    error

    请求失败的回调函数,一般不写

     

    案例

    用户注册时,判断用户名是否被注册过。

     

     

     

     

     

    2、$.ajax错误调试

    error是一个回调函数,和success一样,只不过success是成功时回调函数error是错误时回调函数。并且两个只能有一个执行。

    error回调函数一般我们不写,但是如果发现Ajax异常,可以通过error回调函数去排查错误。

     

     

     

    error回调函数中默认有三个参数,这三个参数可以省略或者写其中的某一个。

    第一个:XMLHttpRequest是Ajax的核心对象

    XMLHttpRequest.readyState

    0、代表未初始化错误(语法错误)

    1、正在发送

    2、已经发送至服务端

    3、解析错误(返回值无法解析)

    4、完成Ajax回调

    XMLHttpRequest.status是直接返回当前响应的状态码200 404 500其中200表示响应成功的状态码

     

    第二个:textStatus

    错误的文本状态

     

    第三个:errorThrown

    异常信息

    案例1:

    dataType返回值类型和后台返回的类型不一致, 报错信息是什么?

     

    Parsererror: 解析异常, 类型转换异常, 检查返回值类型与后台返回的类型是否一致;

    案例2:

    请求的url路径错误, 会出现什么情况?

     

    Error: 后台语法错误或者url路径有误;检查对应url路径是否正确;

    3、$.post()$.get()

    $.get() $.post其实就是$.ajax的简写方式;

    $.get() : 只能处理get请求

    $.post() : 只能处理post请求

    语法格式:

    $.get/post(url, data, function(obj){}, “返回值类型”)

    注意: 传参时一定要按照顺序传参;

    案例:

    $.get()方法:

     

    $.post()方法:

     

    4、$.ajax()$.post()|$.get()异同

    相同点: 都是jQuery框架封装来实现ajax异步操作

    不同点: $.ajaxjQuery的第一次封装, 使用时稍微有点麻烦, 但是功能强大, 覆盖了不同的请求方式, 还有错误调试功能, 写法可以不按照顺序书写;

    $.get/post是二次封装, 由于$.ajax书写比较臃肿, 所以对$.ajax方式的简写,功能上没有任何区别, 但是写法要求过高, 必须按照顺序书写;

    5、Ajax的返回值类型

    Ajax返回值类型有多种:

    Xml: 太麻烦, 解析太费劲, 已经不使用

    Html: 网页, 也属于文本的一部分, 一般使用文本替代

    Scipt: 直接返回的是脚本

    Text: 文本, 默认的返回值类型

    Json: 返回的是一个js对象, 脚本可以直接操作这个对象, 非常方便(常用)

    二、JSON

    (一)JSON简介

     

    JSON对象语法有三种: 对象, 数组, 混合模式(对象和数组的混合)

    介绍校验JSON的解析工具:http://www.bejson.com/

    作用:

    1. 校验JSON格式是否正确
    2. 将不规范JSON格式进行格式化
    3. 对象格式:{"name": "liuyan"}

     

    1. 数组格式: [1, 2, "柳岩"]

     

    1. 混合模式: [{"name":"柳岩","age":18,"hobby":["抽烟","喝酒","烫头"]},{"name":"刘涛","age":20,"hobby":["爬山","摄影","游泳"]}]

     

    (二)JSON应用

    1、对象格式

     

     

     

    2、数组格式

     

     

     

    2、混合模式

     

     

     

    (三)Jackson工具

    Jackson工具是一个JSON串转化工具。负责将对象、数组、集合等这些类型的数据转化为JSON字符串。

     

    常见转换工具有:

    FastJSON   jsonlib   jackson

    使用步骤:

    1、导包

     

     

     

    2、使用

    案例1:将对象转换成JSON

     

     

     

    案例2:将List转换成JSON

     

       

     

     

    案例3:将Map集合转JSON

     

     

     

    扩展:

    jsonjava对象? (利用工具)

     

    一、Ajax进阶

    (一)Ajax同步与异步

    异步: 指的是同一个脚本中存在多个ajax的时候, 他们执行时没有先后顺序, 并且是并发执行;

    同步: 多个ajax按顺序执行;

    异步: 写法格式: async:true(默认为异步), false代表是同步

    案例:在一个脚本方法中,设置3ajax请求,同时以异步(默认)的方式请求三个Servlet.

     

    此时, ajax异步操作没有按照顺序执行, 如果第二个ajax请求需要用到了第一个ajax请求的返回值时, 大家思考下会不会出现异常?   肯定会有异常;

    解决的方式: 使用同步;

     

    (二)表单序列化

    案例:

    实现用户登录功能,使用Ajax提交用户信息。

     

     

     

     

     

    问题:如果注册时, 向后台提交大量的参数时, 我们使用data获取参数时就比较麻烦了, 优化:

    如何优化?

    表单序列化方式: 写法格式: 表单对象.serialize()

    表单序列化的作用: 将复杂的东西按照指定的格式排列或者组合; 这个功能时jQuery, 目的就是将表单中数据按照固定格式定义出来;

     

     

    二、分页查询

    分页应用场景:

     

    为什么要分页?

    1. 服务器数据量比较大, 一次性查询的数据压力也比较大
    2. 前端数据量大, 显示压力也比较大

    回顾下SQL语句:

     

    分页:

    首页  上一页  下一页   尾页   共计 条记录  共计   当前页第

    分析实现分页功能中所要涉及变量:

    1. 当前页 currentPage: 从页面中获取
    2. 每页显示的条数: pageSize  自定义
    3. 起始索引: pageIndex(计算) = (currentPage - 1) * pageSize
    4. 总页数: totalPage(计算) = totalCount%pageSize==0?(totalCount/pageSize):(totalCount/pageSize+1)
    5. 总记录数: totalCount(从数据库中查询总条数)
    6. 上一页: prePage: currentPage - 1
    7. 下一页:nextPage: currentPage +1

    分页案例效果

     

     

    封装分页查询的工具类:

    public class PageTool {

    private int currentPage;//当前页码

    private int pageSize;//每页显示的条数

    private int totalCount;//总记录数(查询数据库)

    private int totalPages;//总页数(计算)

    private int prePage;//上一页

    private int nextPage;//下一页

    private int startIndex;//每页第一条记录的起始下标(计算)

    public PageTool(int totalCount, String currentPage) {

    this.totalCount = totalCount;

    initCurrentPage(currentPage);

    this.pageSize=3;//页容量自定义,可以修改

    initTotalPages();//计算总页数

    initPrePage();//上一页

    initNextPage();//下一页

    initStartIndex();//每页第一条记录的超始下标

    }

    //给当前页码初始化

    private void initCurrentPage(String currentPage) {

    if (currentPage==null) {

    this.currentPage=1;

    }else {

    this.currentPage=Integer.valueOf(currentPage);

    }

    }

    //计算总页数

    private void initTotalPages() {

    this.totalPages=(totalCount%pageSize==0)?(totalCount/pageSize):(totalCount/pageSize+1);

    }

    //上一页

    private void initPrePage() {

    if (currentPage==1) {

    this.prePage=1;

    }else {

    this.prePage=currentPage-1;

    }

    }

    //下一页

    private void initNextPage() {

    if (currentPage==totalPages) {

    this.nextPage=totalPages;

    }else {

    this.nextPage=currentPage+1;

    }

    }

    //每页第一条记录的起始下标

    private void initStartIndex() {

    this.startIndex=pageSize*(currentPage-1);

    }

    public int getPageSize() {

    return pageSize;

    }

    public void setPageSize(int pageSize) {

    this.pageSize = pageSize;

    }

    public int getTotalCount() {

    return totalCount;

    }

    public void setTotalCount(int totalCount) {

    this.totalCount = totalCount;

    }

    public int getTotalPages() {

    return totalPages;

    }

    public void setTotalPages(int totalPages) {

    this.totalPages = totalPages;

    }

    public int getCurrentPage() {

    return currentPage;

    }

    public void setCurrentPage(int currentPage) {

    this.currentPage = currentPage;

    }

    public int getPrePage() {

    return prePage;

    }

    public void setPrePage(int prePage) {

    this.prePage = prePage;

    }

    public int getNextPage() {

    return nextPage;

    }

    public void setNextPage(int nextPage) {

    this.nextPage = nextPage;

    }

    public int getStartIndex() {

    return startIndex;

    }

    public void setStartIndex(int startIndex) {

    this.startIndex = startIndex;

    }

    }

    案例: 完善学生信息管理系统项目,实现分页查询功能。

     

  • 相关阅读:
    类型构造器
    WIN32画图窗口
    WIN32创建进程CreateProcess
    WIN通过消息实现互斥同步CreateEvent和SetEvent
    WIN32生产消费经典同步但是以消耗时间为代价
    WIN32互斥体CreateMutex以及限制多开
    WIN32临界区线程锁EnterCriticalSection和LeaveCriticalSection
    GetThreadContext和SetThreadContext
    远程线程注入
    EnumProcessModules 使用 获取进程的路径
  • 原文地址:https://www.cnblogs.com/masterhxh/p/13729111.html
Copyright © 2011-2022 走看看