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

news2024/11/20 16:26:46

一、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.coloradmin.cn/o/1661578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式存储CephFS最佳实践

文章来源于知乎文章&#xff1a; 分布式存储CephFS最佳实践 背景 近日&#xff0c;一朋友说他们企业内部想落地CephFS&#xff0c;让我帮忙写一份能落地的CephFS最佳实践。然后就顺便把文章整理到了这里。因能力水平以及认知有限&#xff0c;如有错漏烦请指正。 简介 CephF…

Python学习笔记------json

json简介 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 主要功能&#xff1a;json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互 为了让不同的语言能够相互通…

重载,重写,重定义,纯虚函数,多态习题

只要不够成重写就是重定义。 重定义&#xff1a; 抽象类&#xff1a; 包含纯虚函数的类就是抽象类。 1.纯虚函数的作用&#xff0c;强制子类去完成重写。 2.表示抽象的类型。 抽象就是在现实中没有对应的实体。 1. 下面哪种面向对象的方法可以让你变得富有( a) A 继承 B…

创新案例|搜索新王Perplexity如何构建生成式AI产品开发的新模式

Perplexity AI&#xff1a;生成式搜索的颠覆者 刚刚成立满两年&#xff0c;Perplexity AI已经变成了我日常频繁使用的工具&#xff0c;甚至取代了我对 Google搜索的依赖 —— 而我并非个案。该公司仅凭不到 50 名员工&#xff0c;已经吸引了数千万用户。他们目前的年收入超过 …

C++ 多态 - 下

目录 1. 多态的原理 1.1. 虚函数表 1.2. 多态原理 1.3. 静态绑定和动态绑定 1.3.1. 运行时决议 1.3.2. 编译时决议 1.4. 为什么基类的对象调用虚函数不能构成多态 2. 单继承中的虚函数表 2.1. 同类型对象的虚表 2.2. 单继承的对象的虚表 2.2.1. 内存窗口查看 2.2.2…

【机器学习300问】84、AdaGrad算法是为了解决什么问题?

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题&#xff0c;解决这个问题的过程称为最优化。因为参数空间非常复杂&#xff0c;无法轻易找到最优解&#xff0c;而且在深度神经网络中&#xff0c;参数的数量非常庞大&#xff0c;导致最优化问…

数据库表自增主键超过代码Integer长度问题

数据库自增主键是 int(10) unsigned类型的字段&#xff0c;int(M) 中 M指示最大显示宽度&#xff0c;不代表存储长度&#xff0c;实际int(1)也是可以存储21.47亿长度的数字&#xff0c;如果是无符号类型的&#xff0c;那么可以从0~42.94亿。 我们的表主键自增到21.47亿后&#…

【Pytorch】6.torch.nn.functional.conv2d的使用

阅读之前应该先了解基础的CNN网络的逻辑 conv2d的作用 是PyTorch中用于执行二维卷积操作的函数。它的作用是对输入数据进行二维卷积操作&#xff0c;通常用于图像处理和深度学习中的卷积神经网络&#xff08;CNN&#xff09;模型。 conv2d的使用 我们先查看一下官方文档 inpu…

Linux系统调用过程详解:应用程序调用驱动过程

Linux下应用程序调用驱动程序过程&#xff1a; &#xff08;1&#xff09;加载一个驱动模块(.ko)&#xff0c;产生一个设备文件&#xff0c;有唯一对应的inode结构体 a、每个设备文件都有一个对应的’inode‘结构体&#xff0c;包含了设备的主次设备号&#xff0c;是设备的唯一…

AScript纯本地离线文字识别插件

目的 AScript是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。但按键精灵是不包含图色功能&#xff0c;无法识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要讲解下…

全网最详细使用war包的方式结合Tomcat和向量数据库PostgreSQL本地部署Xwiki教学

部署 XWiki 在 CentOS 7 上的过程涉及多个步骤&#xff0c;主要包括安装环境依赖、配置数据库以及安装和配置XWiki。以下是一个详细的步骤说明&#xff1a; 1. 系统准备 首先&#xff0c;确保您的系统是最新的&#xff1a; sudo yum update2. 安装 Java 这里需要注意一下版本…

综述列表(~2024.05.10)

&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 每周末更新&#xff0c;完整版进群获取。 Q 群在群文件&#xff0c;VX 群每周末更新。

vivado新版本兼容老版本,vitis classic兼容sdk教程

new version: vivado版本2023.2 和vitisv classic 2023.2 old version: vivado 2018.3以及之前的版本 打开工程 自动升级到当前版本&#xff0c;选择OK 点击Yes,合并当前的目录架构 点击OK 点击Report IP status 勾选要升级的IP核&#xff0c;点击升级 在项目工程文件夹…

leetcode-括号生成-101

题目要求 思路 1.左括号的数量等于右括号的数量等于n作为判出条件&#xff0c;将结果存到res中 2.递归有两种&#xff0c;一种是增加左括号&#xff0c;一种是增加右括号&#xff0c;只要左括号的数量不超过n&#xff0c;就走增加左括号的递归&#xff0c;右括号的数量只要小于…

Microsoft Edge浏览器,便携增强版 v118.0.5993.69

01 软件介绍 Microsoft Edge浏览器&#xff0c;便携增强版&#xff0c;旨在无需更新组件的情况下提供额外的功能强化。这一增强版专注于优化用户体验和系统兼容性&#xff0c;具体包含以下核心功能的提升&#xff1a; 数据保存&#xff1a;通过优化算法增强了其数据保存能力&…

结构体与联合体的嵌套使用

代码如下 #include <iostream> #include <string> using namespace std;typedef struct t_in_struct1 {int var1;int var2; }name_in_struct1;typedef struct t_in_struct2 {int var3;int var4; }name_in_struct2;typedef struct t_struct {int a;union {name_in_…

重生我是嵌入式大能之串口调试UART

什么是串口 串口是一种在数据通讯中广泛使用的通讯接口&#xff0c;通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter)&#xff0c;其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中&#xff0c;串口常用于与外部设备进…

串口初始化自己独立的见解--第九天

1.SM0,SM1 我们一般用 8位UART&#xff0c;波特率可变 &#xff08;方式1的工作方式&#xff09; SCON &#xff1a;SM2 一般不用&#xff0c;SM0 0 ,SM1 1 PCON : 有两位 我们不动它&#xff0c;不加速&#xff0c;初始值 TMOD&#xff1a;8位自动重装定时器&#xff0…

初识ADMM算法!ADMM算法在分布式配电网调度中的应用程序代码!

前言 随着分布式电源(distributed generation&#xff0c;DG)的渗透率不断提高&#xff0c;传统的配电网系统从被动单向的供电网络转变为功率双向流动的有源网络&#xff0c;使得配电网运行和控制面临诸多新挑战。依靠网络升级或运行结构变化等方法维持配电网可靠运行的成本高…