• 手搭手Ajax经典基础案例省市联动


    环境介绍

    技术栈

    springboot+mybatis-plus+mysql

    软件

    版本

    mysql

    8

    IDEA

    IntelliJ IDEA 2022.2.1

    JDK

    1.8

    Spring Boot

    2.7.13

    mybatis-plus

    3.5.3.2

    pom.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <parent>
    6. <groupId>org.springframework.boot</groupId>
    7. <artifactId>spring-boot-starter-parent</artifactId>
    8. <version>2.7.15</version>
    9. <relativePath/> <!-- lookup parent from repository -->
    10. </parent>
    11. <groupId>com.example</groupId>
    12. <artifactId>ajaxDemo01</artifactId>
    13. <version>0.0.1-SNAPSHOT</version>
    14. <name>ajaxDemo01</name>
    15. <description>ajaxDemo01</description>
    16. <properties>
    17. <java.version>1.8</java.version>
    18. </properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.boot</groupId>
    22. <artifactId>spring-boot-starter-web</artifactId>
    23. </dependency>
    24. <dependency>
    25. <groupId>com.alibaba</groupId>
    26. <artifactId>fastjson</artifactId>
    27. <version>2.0.32</version>
    28. </dependency>
    29. <dependency>
    30. <groupId>com.baomidou</groupId>
    31. <artifactId>mybatis-plus-boot-starter</artifactId>
    32. <version>3.5.3.2</version>
    33. </dependency>
    34. <dependency>
    35. <groupId>p6spy</groupId>
    36. <artifactId>p6spy</artifactId>
    37. <version>3.9.1</version>
    38. </dependency>
    39. <dependency>
    40. <groupId>com.mysql</groupId>
    41. <artifactId>mysql-connector-j</artifactId>
    42. <scope>runtime</scope>
    43. </dependency>
    44. <dependency>
    45. <groupId>com.alibaba</groupId>
    46. <artifactId>druid</artifactId>
    47. <version>1.2.15</version>
    48. </dependency>
    49. <dependency>
    50. <groupId>com.baomidou</groupId>
    51. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    52. <version>3.5.0</version>
    53. </dependency>
    54. <dependency>
    55. <groupId>org.springframework.boot</groupId>
    56. <artifactId>spring-boot-starter-test</artifactId>
    57. <scope>test</scope>
    58. </dependency>
    59. <dependency>
    60. <groupId>org.projectlombok</groupId>
    61. <artifactId>lombok</artifactId>
    62. <version>1.18.24</version>
    63. </dependency>
    64. </dependencies>
    65. <build>
    66. <plugins>
    67. <plugin>
    68. <groupId>org.springframework.boot</groupId>
    69. <artifactId>spring-boot-maven-plugin</artifactId>
    70. </plugin>
    71. </plugins>
    72. </build>
    73. </project>

    application.yml配置文件

    1. spring:
    2. datasource:
    3. # username: root
    4. # password: 111111
    5. # url: jdbc:p6spy:mysql://xxx.xxx.xxx.136:3306/sys?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
    6. # driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    7. dynamic:
    8. primary: sys #设置默认的数据源或者数据源组,默认值即为master
    9. strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
    10. datasource:
    11. sys:
    12. username: root
    13. password: 111111
    14. url: jdbc:p6spy:mysql://xxx.xxx.xxx.136:3306/sys?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
    15. driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    16. # driver-class-name: com.mysql.jdbc.Driver
    17. wms:
    18. url: jdbc:p6spy:mysql://xxx.xxx.xxx.136:3306/Wms?useUnicode=true&characterEncoding=UTF-8
    19. username: root
    20. password: 111111
    21. driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    22. # driver-class-name: com.mysql.jdbc.Driver
    23. sys2:
    24. username: root
    25. password: 111111
    26. url: jdbc:p6spy:mysql://127.0.0.1:3306/sys?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
    27. driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    28. server:
    29. port: 8083
    30. mybatis-plus:
    31. configuration:
    32. #输出日志
    33. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    34. #配置映射规则
    35. map-underscore-to-camel-case: true #表示支持下划线到驼蜂的映射
    36. #隐藏mybatis图标
    37. global-config:
    38. banner: false
    39. db-config:
    40. logic-delete-field: status
    41. logic-not-delete-value: 1
    42. logic-delete-value: 0
    43. #
    44. #mybatis:
    45. # mapper-locations=classpath: com/example/dao/*.xml

    数据库表

    MybatisX逆向工程

    逆向工程:通过数据库表接口,逆向生成java工程结构

    实体类、mapper接口、mapper映射文件、Service接口、service实现类

    domain(pojo)实体类

    1. @Data
    2. public class TArea implements Serializable {
    3. /**
    4. *
    5. */
    6. private Integer id;
    7. /**
    8. *
    9. */
    10. private String code;
    11. /**
    12. *
    13. */
    14. private String name;
    15. /**
    16. *
    17. */
    18. private String parentcode;
    19. private static final long serialVersionUID = 1L;
    20. }

    mapper(dao)接口

    1. @Mapper
    2. public interface TAreaMapper extends BaseMapper<TArea> {
    3. List<TArea> getALLParentcodeIsNull();
    4. List<TArea> getByParentcode(@Param("parentcode") String parentcode);
    5. }

    mapper.xml映射文件

    1. <!DOCTYPE mapper
    2. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    4. <mapper namespace="com.example.mapper.TAreaMapper">
    5. <resultMap id="BaseResultMap" type="com.example.domain.TArea">
    6. <id property="id" column="id" jdbcType="INTEGER"/>
    7. <result property="code" column="code" jdbcType="VARCHAR"/>
    8. <result property="name" column="name" jdbcType="VARCHAR"/>
    9. <result property="parentcode" column="ParentCode" jdbcType="VARCHAR"/>
    10. </resultMap>
    11. <sql id="Base_Column_List">
    12. id,code,name,
    13. ParentCode
    14. </sql>
    15. <select id="getALLParentcodeIsNull" resultType="com.example.domain.TArea">
    16. select * from t_area where ISNULL(ParentCode)
    17. </select>
    18. <select id="getByParentcode" resultType="com.example.domain.TArea">
    19. select * from t_area where ParentCode =#{parentcode}
    20. </select>
    21. </mapper>

    service接口

    1. public interface TAreaService extends IService<TArea> {
    2. List<TArea> getALLProvince();
    3. List<TArea> getByParentcode(String parentcode);
    4. }

    service实现类

    1. @Service
    2. @DS("sys2")
    3. public class TAreaServiceImpl extends ServiceImpl, TArea>
    4. implements TAreaService{
    5. @Autowired
    6. private TAreaMapper tAreaMapper;
    7. @Override
    8. public List<TArea> getALLProvince() {
    9. return tAreaMapper.getALLParentcodeIsNull();
    10. }
    11. @Override
    12. public List<TArea> getByParentcode(String parentcode) {
    13. return tAreaMapper.getByParentcode(parentcode);
    14. }
    15. }

    test测试类

    1. @Test
    2. void area(){
    3. //tAreaService.list();
    4. //tAreaService.getALLProvince();
    5. tAreaService.getByParentcode("001");
    6. }

    area.html前端页面

    1. <!DOCTYPE html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. </head>
    7. <body>
    8. <script type="text/javascript" src="../js/jquery-3.4.1.js"></script>
    9. <select id="province">
    10. <option value="">选择省份</option>
    11. </select>
    12. <select id="city">
    13. <option value="">选择城市</option>
    14. </select>
    15. <script type="text/javascript">
    16. $(document).ready(function () {
    17. $.ajax({
    18. type : "get",
    19. url :"/Area",
    20. dataType : "json",
    21. async :"false",//默认true ,异步
    22. success : function(data){
    23. for (var i=0; i<data.length;i++){
    24. let tr ="+data[i].name+"";
    25. console.log(tr)
    26. $("#province").append(tr);
    27. }
    28. }
    29. })
    30. });
    31. $("#province").change(function () {
    32. let b=this.value;
    33. console.log(b)
    34. $.ajax({
    35. type : "GET",
    36. url :"/"+b+"/Area2",
    37. dataType : "json",
    38. async :"false",//默认true ,异步
    39. success : function(data){
    40. //清空原来的数据
    41. $("#city").empty();
    42. for (var i=0; i<data.length;i++){
    43. let tr ="+data[i].name+"";
    44. console.log(tr)
    45. $("#city").append(tr);
    46. }
    47. }
    48. })
    49. })
    50. </script>
    51. </body>
    52. </html>

    controller控制层

    1. @RequestMapping("/Area")
    2. @ResponseBody
    3. public List<TArea> Areademo() {
    4. List<TArea> allProvince = tAreaService.getALLProvince();
    5. return allProvince;
    6. }
    7. @RequestMapping("/{code}/Area2")
    8. @ResponseBody
    9. public List<TArea> Areademo2(@PathVariable("code") String code) {
    10. List<TArea> allProvince = tAreaService.getByParentcode(code);
    11. return allProvince;
    12. }

          

    ---------------------------------------------------------------------------------------------------------------------------

    以下为原理基础,可略

    Ajax即Asynchronous Javascript And XML(异步JavaScript和XML)在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括: HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。

    ajax基础

    Xmlhttprequest对象是AJAX的核心对象,发送请求以及接收服务器数据的返回。

    Xmlhttprequest对象,现代浏览器都是支持的,都内置了该对象。直接用即可。

    XmlHttpRequest对象基本方法:

    abort():停止发送当前请求

    getAllResponseHeader():获取服务器的全部响应头

    getResponseHeader("headerLabel”):根据响应头的名字,获取对应的响应头

    open(“method”,”URL”,”[,asycFlag[,”userName”[,password]]]”):建立与服务器URL的连接,并设置请求的方法,以及是否使用异步请求。如果远程服务需要用户名、密 码,则 提供对应的信息。

    send(content):发送请求。其中content是请求参数

    setRequestHeader(“label”,”value”):在发送请求之前,先设置请求头

    XMLHttpRequest对象的简单的属性:

    onreadystatechange:该属性用于指定XMLHttpRequest对象状态改变时的事件处理函数。

    readyState:该属性用于获取XMLHttpRequest对象处理状态

    responseText:该属性用于获取服务器响应的XML文档对象

    status:该属性是服务器返回的状态码,只有当服务器的响应已经完成时,才会有该状态码

    statusText:该属性是服务器返回的状态文本信息,只有当服务器的响应已经完成时,才会有该状态文本信息。

    XMLHttpRequest对象的readyState属性对应的状态值

    0:请求未初始化

    1:服务器连接已建立

    2:请求已收到

    3:正在处理请求

    4:请求已完成且响应已就绪

    1. <!DOCTYPE html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. </head>
    7. <body>
    8. <div id="mydiv"></div>
    9. <input type="button" value="hello ajax" id="helloAjax">
    10. <script type="text/javascript">
    11. window.onload = function (){
    12. document.getElementById("helloAjax").onclick =function (){
    13. // console.log("发送ajax请求")
    14. //1、创建ajax黑心对象XMLHttpRequest
    15. var xhr =new XMLHttpRequest();
    16. //2、注册回调函数
    17. //该函数在XMLHttpRequestState状态值发生改变时被调用
    18. xhr.onreadystatechange = function () {
    19. //readyState是Ajax状态码
    20. /**
    21. * XMLHttpRequest对象的readyState属性对应的状态值
    22. * 0:请求未初始化
    23. * 1:服务器连接已建立
    24. * 2:请求已收到
    25. * 3:正在处理请求
    26. * 4:请求已完成且响应已就绪
    27. */
    28. console.log(xhr.readyState)
    29. // if (this.readyState == 4){
    30. // console.log("响应结束")
    31. // }
    32. //status是http协议状态码
    33. console.log("http响应状态码"+this.status)
    34. if (this.status==404){
    35. alert("访问资源不存在")
    36. }
    37. if (this.status ==200){
    38. //将响应信息放到div图层中,渲染
    39. //innerHTML是javascript的元素属性,和ajax的XMLHttpRequest对象无关,innerText也是javascript的元素属性
    40. //innerHTML可以设置元素内部的HTML代码。
    41. document.getElementById("mydiv").innerHTML =this.responseText;
    42. document.getElementById("mydiv").innerText =this.responseText;
    43. }
    44. }
    45. //3、开启通道
    46. //open(method,url,async,user,psw)
    47. //method:请求方式,get,post
    48. //url:请求路径
    49. //async:truefalsetrue表示异步请求,false表示同步请求
    50. //user用户名
    51. //psw密码
    52. xhr.open("GET","/test01",true)
    53. //4
    54. xhr.send()
    55. }
    56. }
    57. </script>
    58. </body>
    59. </html>
  • 相关阅读:
    字节飞书面试算法题
    【0103】【内存上下文】重置内存上下文(AllocSetReset)
    09- 诊断事件的定义
    字符集编码(三):Unicode
    【Python第三方包】实现自动化(pyautogui包)
    Joplin Typora 粘贴图片 | 当使用Typora作为Joplin编辑器时,如何粘贴图片并上传到Joplin服务器,替换链接
    文件用手机拍照片打印时,打印出来总是有黑阴影,如何去掉黑色阴影打印清晰的图片
    面试经典(5/150)多数元素
    Hexagon_V65_Programmers_Reference_Manual(41)
    ANDI数据集介绍|补充信息|2022数维杯国际赛C题
  • 原文地址:https://blog.csdn.net/weixin_47268883/article/details/134000696