自学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;

}

}

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

 

posted @ 2020-09-25 11:37  master_hxh  阅读(170)  评论(0编辑  收藏  举报