【Ajax零基础教程】-----第四课 简单实现

一、XMLHttpRequest对象

   通过XMLHttpRequest对象来向服务器发送异步请求,从服务器获取数据。然后用JavaScript来操作DOM而更新页面。XMLHttpRequest是ajax的核心机制,它是IE5中首先引入的,是一种支持异步请求的技术。

  简单的说,也就是JavaScript可以及时的向服务器提出请求并及时响应。而不阻塞用户。达到无刷新效果。

二、Ajax使用过程

  1、创建XMLHttpRequest对象

var xhr = new XMLHttpRequest();

  2、给定请求方式以及请求地址

xhr.open("get","http://v1.yiketianqi.com/api?unescape=1&version=v91&appid=43656176&appsecret=I42og6Lm&ext=&cityid=&city="); 

    后端服务 ip地址+端口号+资源路径

 3、发送请求

xhr.send();

 4、获取服务器端给客户端的响应数据

xhr.onreadystatechange = function(){
  //0:open()没有被调用
  //1:open()正在被调用
  //2:send()正在被调用
  //3:服务端正在返回结果
  //4:请求结束,并且服务端已经结束发送数据到客户端
  if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML = this.responseText;
     }
}

三、实战案例

  需求:创建User类,包含id,age属性。

在用户管理界面中通过Ajax技术完成对用户数据载入、添加用户、更新用户、删除用户操作。

1、新建web项目,层级如下

common(公共实体):用于存放公共实体类

dao(数据访问层):用于存放应用程序的数据访问类,负责与数据库或其他数据源进行交互。

pojo(模型层):用于存放应用程序的数据模型类,表示应用程序中的实体对象。

service(服务层):用于存放应用程序的服务类,负责实现业务逻辑。

servlet(控制器层):用于存放应用程序的控制器类,负责处理请求和控制应用程序的流程。

utils(工具类):用于存放应用程序的工具类,包含各种通用的辅助方法。

2、搭建环境
  • 数据库创建用户表
# 创建用户表
CREATE TABLE `user` (
 `id` int NOT NULL AUTO_INCREMENT,
 `name` varchar(255) DEFAULT NULL,
 `age` int DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


DELETE FROM `user`;
# 添加用户
INSERT INTO `user` (id, name, age) VALUES
(1, 'Jone', 18),
(2, 'Jack', 20),
(3, 'Tom', 28),
(4, 'Sandy', 21),
(5, 'Billie', 24);
  • 创建实体类
/**
 * 用户表模型
 */
public class User {


  // 序号
  private Integer id;
  // 名字
  private String name;
  // 年龄
  private Integer age;
  // 邮箱


  public User(Integer id, String name, Integer age, String email) {
    this.id = id;
    this.name = name;
    this.age = age;
   }


  public User() {
   }


  public Integer getId() {
    return id;
   }


  public void setId(Integer id) {
    this.id = id;
   }


  public String getName() {
    return name;
   }


  public void setName(String name) {
    this.name = name;
   }


  public Integer getAge() {
    return age;
   }


  public void setAge(Integer age) {
    this.age = age;
   }




  @Override
  public String toString() {
    return "User{" +
        "id=" + id +
        ", name='" + name + ''' +
        ", age=" + age +
        '}';
   }
}


  • 统一结果返回集
/**
 * 统一结果返回集
 */
public class ResultAjax {

    //状态码 200 成功 500 失败
    private Integer code;

    //返回消息
    private String message;

    //返回对象
    private Object data;

    //成功返回
    public static ResultAjax ok(String message,Object data){
        ResultAjax resultAjax = new ResultAjax();
        resultAjax.setCode(200);
        resultAjax.setMessage(message);
        resultAjax.setData(data);
        return resultAjax;
    }
    //失败返回
    public static ResultAjax error(String message){
        ResultAjax resultAjax = new ResultAjax();
        resultAjax.setCode(500);
        resultAjax.setMessage(message);
        return resultAjax;
    }
    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 Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}
  • 编写数据库连接工具
    1)创建数据库连接信息文件

在src目录下创建druid.properties,基于Druid连接池获取数据库连接工具类。

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false
username=root
password=123456
initialSize=10
maxActive=20
       2) 创建工具类
/**
 * 基于Druid连接池获取数据库连接工具类
 */
public class JdbcDruidUtil {
   //数据库连接池对象
   private static DataSource dataSource;
   static{
     try {
       //获取读取配置文件的字节输入流对象
       InputStream is = JdbcDruidUtil.class.getClassLoader().getResourceAsStream("druid.properties");
       //创建Properties对象
       Properties pop = new Properties();
       //加载配置文件
       pop.load(is);
       //创建连接池对象
       dataSource = DruidDataSourceFactory.createDataSource(pop);
     }catch(Exception e){
       e.printStackTrace();
     }
   }
  //获取数据库连接对象
  public static Connection getConnection(){
    Connection connection = null;
    try {
      connection = dataSource.getConnection();
     } catch (SQLException throwables) {
      throwables.printStackTrace();
     }
    return connection;
   }
  //关闭连接对象
  public static void closeConnection(Connection connection){
    try {
      connection.close();
     } catch (SQLException throwables) {
      throwables.printStackTrace();
     }
   }
  //关闭Statement对象
  public static void closeStatement(Statement statement){
    try {
      statement.close();
     } catch (SQLException throwables) {
      throwables.printStackTrace();
     }
   }
  //关闭ResultSet
  public static void closeResultSet(ResultSet resultSet) {
    try {
      resultSet.close();
     } catch (SQLException throwables) {
      throwables.printStackTrace();
     }
   }
  //DML操作时关闭资源
  public static void closeResource(Statement statement,Connection connection){
    //先关闭Statement对象
    closeStatement(statement);
    //在关闭Connection对象
    closeConnection(connection);
   }


  //查询时关闭资源
  public static void closeResource(ResultSet resultSet,Statement statement,Connection connection){
    if (resultSet != null){
      //先关闭ResultSet
      closeResultSet(resultSet);
     }
    if (statement != null){
      //在闭Statement对象
      closeStatement(statement);
     }
    if (connection != null){
      //最后关闭Connection对象
      closeConnection(connection);
     }
   }
}

3)用户持久层新建查询接口

 新建用户持久层文件UsersDao接口

public class UserDao {
    /**
     * 查询所有数据
     * @return
     */
    List<User> findByAll();
}
4) 用户持久层实现查询接口
**
 * 操作用户表持久层
 */
public class UsersDaoImpl implements UsersDao { 

/**
   * 查询所有用户
   * @return
   */
  @Override
  public List<User> findByAll() {
    Connection conn =null;
    Statement s = null;
    ResultSet rs = null;
    List<User> userList = new ArrayList<>();
    try{
      conn = JdbcDruidUtil.getConnection();
      String sql = "select * from user";
      s = conn.createStatement();
      rs = s.executeQuery(sql);
      while(rs.next()){
        //手动orm映射
        User u = new User();
        u.setId(rs.getInt("id"));
        u.setName(rs.getString("name"));
        u.setAge(rs.getInt("age"));
        userList.add(u);
       }
     }catch(Exception e){
      e.printStackTrace();
     }finally{
      JdbcDruidUtil.closeResource(s,conn);
     }
    return userList;
   }
 
}
5)编写用户管理前端页面
<%@ page isELIgnored="false" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>用户管理</title>
  <style>
    div{
      padding:20px 10px 0 10px;
     }
    .total_content{
      display: flex; / 创建 Flexbox 布局 /
      justify-content: center; / 水平居中对齐 /
      align-items: center; / 垂直居中对齐 /
     }
  </style>
</head>
<body>
<div class="total_content">
  <h1 >用户管理系统</h1>
</div>
  <div>
    <table align="center" width="60%" border="0" cellspacing="1" bgcolor="#000000">
      <tr bgcolor="#FFFFFF">
        <td>ID:</td>
        <td><input type="text" name="id" id="userId"/></td>
        <td>姓名:</td>
        <td><input type="text" name="name" id="name"/></td>
        <td>年龄:</td>
        <td><input type="number" name="age" id="age"/></td>
      </tr>
      <tr align="center" bgcolor="#FFFFFF">
        <td colspan="6">
          <input type="button" value="添加用户" onclick="addUser()" />
          <input type="button" value="更新用户" onclick="updateUser()"/>
        </td>
      </tr>
    </table> <hr/>
    <table align="center" width="60%" bgcolor="#000000" border="0" id="myTable" cellpadding="0" cellspacing="1">
      <thead>
      <tr align="center" bgcolor="#FFFFFF">
        <td>ID</td>
        <td>姓名</td>
        <td>年龄</td>
        <td>操作</td>
      </tr>
      </thead>
      <tbody id="tBody"></tbody>
    </table>
  </div>
</body>
</html>
6)编写用户查询servlet

用户业务层新增查询接口---UsersService

public interface UsersService {
 
  /**
   * 查询所有数据
   * @return
   */
  List<User> findByAll();
}

创建用户业务层接口实现类-----UsersServiceImpl。

/**
 * 用户业务层
 *
 */
public class UsersServiceImpl implements UsersService {
 
 
  /**
   * 查询全部用户
   * @return
   */
  @Override
  public List<User> findByAll() {
    UsersDao usersDao = new UsersDaoImpl();
    return usersDao.findByAll();
   }
 
} 

用户查询控制层编写---创建UserListServlet控制器类

@WebServlet("/user.do")
public class UserListServlet extends HttpServlet {


  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.doPost(req, resp);
   }
   @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String flag = req.getParameter("flag");
    switch (flag){
      case "getData":
        this.getData(req,resp);
        break;
     }
   }
   // 获取页面初始化数据
  private void getData(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    UsersService usersService = new UsersServiceImpl();
    List<User> userList = usersService.findByAll();
    ResultAjax success = ResultAjax.success(userList);
    writerTopage(resp,success);
   }
 
   /**
   * 输出至页面方法
   * @param resp
   * @param data
   * @throws IOException
   */
  private void writerTopage(HttpServletResponse resp,Object data) throws IOException {
    String s = JSON.toJSONString(data);
    resp.setContentType("application/json");
    resp.setCharacterEncoding("UTF-8");
    PrintWriter pw = resp.getWriter();
    pw.print(s);
    pw.flush();
    pw.close();
   }
 
}

前端实现显示用户数据

<script type="text/javascript" src="jquery路径"></script>
<script>
  $(function() {
    //初始化用户数据
    getData();
   }); 

// 获取页面初始化数据
  function getData(){
    $.getJSON("user.do",{flag:"getData"},function (result) {
      listUser(result);
     });
   }

 // 遍历数据生成数据
  function listUser(obj){
    var str ="";
    $.each(obj.data,function(){
      str+= "<tr align='center' bgcolor=\"#FFFFFF\">" +
        "<td id='"+this.id+"'>"+this.id +"</td>"+
        "<td>"+this.name+"</td>" +
        "<td>"+this.age+"</td>" +
        "<td><a href='#' >更新</a>&nbsp;&nbsp;<a href='#'>删除 </a></td></tr>"
     });
    $("#tBody").prepend(str);
   }
</script>

7)用户添加

<%@ page isELIgnored="false" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>用户管理</title>
  <style>
    div{
      padding:20px 10px 0 10px;
     }
     .total_content{
      display: flex; / 创建 Flexbox 布局 /
      justify-content: center; / 水平居中对齐 /
      align-items: center; / 垂直居中对齐 /
     }
  </style>
</head>
<body>
<div class="total_content">
  <h1 >用户管理系统</h1>
</div>
  <div>
    <table align="center" width="60%" border="0" cellspacing="1" bgcolor="#000000">
      <tr bgcolor="#FFFFFF">
        <td>ID:</td>
        <td><input type="text" name="id" id="userId"/></td>
        <td>姓名:</td>
        <td><input type="text" name="name" id="name"/></td>
        <td>年龄:</td>
        <td><input type="number" name="age" id="age"/></td>
      </tr>
      <tr align="center" bgcolor="#FFFFFF">
        <td colspan="6">
          <input type="button" value="添加用户" onclick="addUser()" />
          <input type="button" value="更新用户" onclick="updateUser()"/>
        </td>
      </tr>
    </table> <hr/>
    <table align="center" width="60%" bgcolor="#000000" border="0" id="myTable" cellpadding="0" cellspacing="1">
      <thead>
      <tr align="center" bgcolor="#FFFFFF">
        <td>ID</td>
        <td>姓名</td>
        <td>年龄</td>
        <td>操作</td>
      </tr>
      </thead>
      <tbody id="tBody"></tbody>
    </table>
  </div>
</body>
<script>
 // 用户添加
  function addUser(){
    // 从页面中获取数据
    var name = $("#name").val();
    var age = $("#age").val();
    if (name == ''){
      alert("请输入名字")
      return
     }
    if ( age == ''){
      alert("请输入年龄")
      return
     }
    var data = {
      name:name,
      age:age,
      flag : "addUser"
     }
    // 发送请求
    $.post("user.do",data,function(result){
      console.log(result)
      if (result.code == 200){
        alert(result.message)
        location.reload()
       }
     });
   }


</script>

其他同理不再赘述。。。

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

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

相关文章

【python量化交易】qteasy使用教程05——创建第一个自定义交易策略

创建第一个自定义交易策略 使用qteasy创建自定义交易策略开始前的准备工作本节的目标自定义策略的实现方法使用 qteasy 的 Strategy 策略类三种不同的自定义策略基类定义一个双均线择时交易策略定义策略运行时机定义策略需要的数据自定义交易策略的实现&#xff1a;realize()获…

SwiftUI 调整视图内容周围间隙(Content Margins)的“时髦”方法

概述 在 SwiftUI 开发的应用中,往往在小屏设备(比如 iPhone)上布局良好的 App 放到大屏(iPad)上后就会“一塌糊涂”。因为它们一味的只想着“占据”却不知道“舍弃”。 从 iOS 17.0(iPad 17.0)开始苹果提供了原生的视图修改器方法专注于处理此事。 在本篇博文中,您将…

pyqt 工具栏QToolBar控件

pyqt 工具栏QToolBar控件 QToolBar控件介绍效果代码 QToolBar控件介绍 QToolBar 是 PyQt&#xff08;中的一个控件&#xff0c;它提供了一个工具栏&#xff0c;通常包含一系列的工具按钮或下拉菜单&#xff0c;用于提供对应用程序功能的快速访问。 QToolBar 通常与 QMainWind…

霍金《时间简史 A Brief History of Time》书后索引(E--H)

A–D部分见&#xff1a;霍金《时间简史 A Brief History of Time》书后索引&#xff08;A–D&#xff09; 图源&#xff1a;Wikipedia INDEX E Earth: circumference, motion, shape Eclipses Eddington, Arthur Einstein, Albert: biography, see also Relativity; Special…

hadoop大数据的一些知识点--Map reduce编程

实验4 MapReduce编程(2) 本实验的知识地图如图4-1所示&#xff08; 表示重点 表示难点&#xff09;。 图4-1 实验4MapReduce编程(2)知识地图 一、实验目的 1. 理解YARN体系架构。 2. 熟练掌握YARN Web UI界面的使用。 3. 掌握YARN Shell常用命令的使用。 4. 了解YARN编程之…

Linux 第二十七章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

前端本地调试云效上Vue项目的构建产物

一、问题背景 前两天前端小伙伴&#xff0c;在云效上构建了一个前端项目&#xff0c;构建结果显示成功&#xff0c;访问后发现Console控制台报错&#xff1a;ReferenceError: defineComponent is not defined 在此之前的版本&#xff0c;构建和访问并没有此异常&#xff0c;而…

HNU操作系统小班讨论-Windows、Linux文件系统

【题目描述】 叙述Windows、Linux文件系统的演化&#xff0c;比较他们的优劣 【PPT展示】

(Java)心得:LeetCode——15.三数之和

一、原题 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。…

【网络安全】一次sql注入问题的处理

目录 问题 10.60.100.194&#xff0c;修改之前 修改方案 问题解决 测试过程 问题思考与总结 问题 一次sql注入问题的筛查报告&#xff0c;主要是sql注入的问题资源-CSDN文库 doc-new\20-设计文档\34-Mesh设备管理\100-网络安全 10.60.100.194&#xff0c;修改之前 修改…

springboot如何查看版本号之间的相互依赖

第一种&#xff1a; 查看本地项目maven的依赖&#xff1a; ctrl鼠标左键&#xff1a;按下去可以进入maven的下一层&#xff1a; ctrl鼠标左键&#xff1a;按下去可以进入maven的再下一层&#xff1a; 就可以查看springboot的一些依赖版本号了&#xff1b; 第二种&#xff1a; 还…

ssrf学习2——内网ip绕过

环回地址绕过 尝试访问内网 也就是127.0.0.1里面的flag.php 但是如果真的去访问127.0.0.1/flag.php 还是不行 也就是说127.0.0.1被过滤了 进制转换 127.0.0.1是点分十进制 可以用二进制八进制十六进制来绕过过滤 0x7F000001/flag.php 017700000001/flag.php(八进制前面是…

Excel-VBA报错01-解决方法

【已删除的部件:部件/xl/vbaProject.bin。(Visual Basic for Applications(VBA))】 1.问题复现&#xff1a; Win10 &#xff1b;64位 &#xff1b;Office Excel 2016 打开带有宏的Excel文件&#xff0c;报错&#xff1a;【已删除的部件&#xff1a;部件/xl/vbaProject.bin。…

【漏洞复现】RuvarOA协同办公平台 WorkFlow接口处存在SQL注入

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

SDXL-ControlNet模型MistoLine:引领高精度图像生成的革新高质量图像模型

在数字艺术的浩瀚星空中&#xff0c;MistoLine犹如一颗璀璨的新星&#xff0c;以其对SDXL-ControlNet技术的深度整合&#xff0c;展示了对多种线稿类型的非凡适应能力&#xff0c;并在高精度图像生成领域树立了新的标杆。 GitHub&#xff1a;https://github.com/TheMistoAI/Mi…

机器学习笔记-22

终章 至此吴恩达老师的机器学习课程已经完成啦&#xff0c;总结一下&#xff1a; 1.监督学习的算法&#xff1a;线性回归、逻辑回归、神经网络和向量机 2.无监督学习的算法&#xff1a;K-Means、PCA、异常检测 3.推荐系统、大规模数据处理、正则化、如何评估算法 4.上限分析、…

【bug记录】Vue3 Vant UI 中 van-popup 不弹出

原因&#xff1a;语法使用错误&#xff0c;使用了 Vue 2 的语法 Vue3语法&#xff1a; Vue2语法&#xff1a;

【算法】Dijkstra求最短路算法

TOP提示&#xff1a;Dijkstra算法只适用于不含负权边的情况 Dijkstra算法是一个基于贪心&#xff0c;广搜和动态规划 求图中某点到其他所有点的最短路径的算法 一、步骤 首先我们先总结Dijkstra算法的完整步骤 我们需要一个dis数组存储从起点到达其他节点的最短距离&…

用字符串初始化的指针

一. 简介 前一篇文章简单学习了数组与指针的区别&#xff0c;文章如下&#xff1a; C语言中数组与指针的区别-CSDN博客 本文学习一下 初始化为 字符串的 指针。防止使用过程中出现问题。 二. 初始化指针来指向字符串 初始化指针来指向字符串&#xff0c;例如如下代码就是…

力扣每日一题-收集垃圾的最少总时间-2024.5.11

力扣题目&#xff1a;收集垃圾的最少总时间 题目链接: 2391.收集垃圾的最少总时间 题目描述 代码纯享版 class Solution {public int garbageCollection(String[] garbage, int[] travel) {int sum 0;int last_M -1,last_P -1, last_G -1;for(int i 0; i < garbage.…