2024-08-15

在这个系列的第二部分,我们将会详细介绍Ajax请求的构建和发送,以及如何处理返回的数据。




// 创建一个新的 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
 
// 配置请求类型、URL 以及是否异步处理
xhr.open('POST', 'your_api_endpoint', true);
 
// 设置请求头,如需要
xhr.setRequestHeader('Content-Type', 'application/json');
 
// 注册状态变化的监听器
xhr.onreadystatechange = function() {
    // 请求完成并且响应状态码为 200
    if (xhr.readyState === XMLHttpRequest.DONE) {
        if (xhr.status === 200) {
            // 处理返回的数据
            var response = JSON.parse(xhr.responseText);
            console.log(response);
        } else {
            // 处理错误,如响应状态码404、500等
            console.error('请求失败,状态码:' + xhr.status);
        }
    }
};
 
// 发送请求,如果是 POST 请求,需要传入数据
xhr.send(JSON.stringify({ key: 'value' }));

这段代码展示了如何使用原生的XMLHttpRequest对象来发送一个POST请求,并处理响应。它设置了请求的类型、URL、请求头和监听器来处理请求的不同阶段。当请求完成并且服务器返回200响应状态码时,它会解析返回的JSON数据。如果请求失败,它会在控制台输出错误信息。这是一个非常基础且实用的Ajax请求构建和处理方法。

2024-08-15



layui.use(['form'], function(){
  var form = layui.form;
  
  // 监听提交事件
  form.on('submit(demo1)', function(data){
    // data.field 即为获取的表单数据
    console.log(data.field);
    
    // 使用ajax提交表单数据
    $.ajax({
      url: '/your/server/url',
      type: 'post',
      data: data.field,
      success: function(res){
        // 处理服务器返回的结果
        console.log('提交成功', res);
      },
      error: function(){
        // 处理错误情况
        console.log('提交失败');
      }
    });
    
    return false; // 阻止表单默认提交事件
  });
});

这段代码展示了如何使用Layui框架的form模块来监听表单的提交事件,并通过Ajax异步提交表单数据。在提交函数中,data.field 会包含所有表单元素的数据,这些数据可以直接用于Ajax请求。通过返回false,可以阻止表单的默认提交行为。这是一个常见的模式,用于处理表单数据和异步提交。

2024-08-15

由于原始代码已经是一个较为完整的JavaWeb项目,下面我们提取核心代码来回答这个问题。

  1. web.xml配置文件:



<web-app ...>
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.example.book.filter.EncodingFilter</filter-class>
        <init-param>
            <param-name>charset</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
 
    <servlet>
        <servlet-name>BookServlet</servlet-name>
        <servlet-class>com.example.book.servlet.BookServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BookServlet</servlet-name>
        <url-pattern>/book</url-pattern>
    </servlet-mapping>
</web-app>
  1. EncodingFilter类:



package com.example.book.filter;
 
import javax.servlet.*;
import java.io.IOException;
 
public class EncodingFilter implements Filter {
    private String charset;
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        charset = filterConfig.getInitParameter("charset");
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        request.setCharacterEncoding(charset);
        response.setContentType("text/html; charset=" + charset);
        chain.doFilter(request, response);
    }
 
    @Override
    public void destroy() {
        // 空实现
    }
}
  1. BookServlet类:



package com.example.book.servlet;
 
import com.example.book.dao.BookDAO;
import com.example.book.dao.impl.BookDAOImpl;
import com.example.book.model.Book;
 
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.List;
 
public class BookServlet extends HttpServlet {
    private BookDAO bookDAO = new BookDAOImpl();
 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Book> books = bookDAO.findAll();
        request.setAttribute("books", books);
        request.getRequestDispatche
2024-08-15



// 创建一个新的 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
 
// 配置请求类型、URL 以及是否异步处理
xhr.open('GET', 'your-api-endpoint', true);
 
// 设置请求完成的回调函数
xhr.onreadystatechange = function () {
  // 请求完成并且响应状态码为 200
  if (xhr.readyState === XMLHttpRequest.DONE) {
    if (xhr.status === 200) {
      // 处理请求成功的响应数据
      console.log(xhr.responseText);
    } else {
      // 处理请求失败
      console.error('请求失败,状态码:' + xhr.status);
    }
  }
};
 
// 发送请求
xhr.send();

这段代码演示了如何使用 XMLHttpRequest 对象发送一个简单的 GET 请求,并在请求成功完成后处理响应数据。在实际应用中,你需要将 'your-api-endpoint' 替换为你要请求的 API 端点。

2024-08-15



// 假设我们有一个用户列表,我们想通过Ajax异步获取用户数据
 
// 创建一个新的 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
 
// 配置请求类型、URL 以及是否异步处理
xhr.open('GET', '/api/users', true);
 
// 设置请求完成的回调函数
xhr.onreadystatechange = function () {
  // 请求完成并且响应状态码为 200
  if (xhr.readyState === XMLHttpRequest.DONE) {
    if (xhr.status === 200) {
      // 处理请求成功的响应数据
      console.log(xhr.responseText);
      // 更新页面的用户列表
      updateUserList(JSON.parse(xhr.responseText));
    } else {
      // 处理请求失败
      console.error('请求失败,状态码:' + xhr.status);
    }
  }
};
 
// 发送请求
xhr.send();
 
// 更新页面的用户列表函数
function updateUserList(users) {
  // 假设我们有一个id为#user-list的ul元素来展示用户列表
  var userList = document.getElementById('user-list');
  userList.innerHTML = ''; // 清空原有列表内容
  
  users.forEach(function (user) {
    // 创建新的li元素并添加到列表中
    var li = document.createElement('li');
    li.textContent = user.name; // 假设用户对象有一个名字属性name
    userList.appendChild(li);
  });
}

这段代码展示了如何使用原生JavaScript和XMLHttpRequest对象发送异步GET请求,并在请求成功完成后更新页面上的用户列表。这是一个典型的Ajax交互流程,适用于教育目的。

2024-08-15

解释:

在使用 jQuery 的 $.ajax 进行异步网络请求时,默认情况下是不会阻塞UI线程的。但如果你将 async 参数设置为 false,这样会导致请求变成同步阻塞请求,在这种模式下,JS引擎会阻塞其他所有操作,直到请求完成。这种情况下,如果你的网络请求耗时很长,可能会导致页面出现卡顿,表现为loading图标不显示。

解决方法:

  1. 确保 async 参数设置为 true,这是 $.ajax 的默认值,意味着请求是异步的,不会阻塞UI线程。
  2. 如果你需要使用同步请求,可以考虑将请求分块进行,或者通过其他方式保证请求时间不会过长,从而避免UI线程阻塞。
  3. 可以在请求开始时显示loading图片,在请求结束后再将其隐藏。

示例代码:




// 显示loading图片
$("#loading").show();
 
// 使用$.ajax进行异步网络请求
$.ajax({
    url: 'your-endpoint-url',
    type: 'GET', // 或者 'POST',根据需要选择
    data: {
        // 你的请求数据
    },
    success: function(response) {
        // 请求成功处理
    },
    error: function(xhr, status, error) {
        // 请求失败处理
    },
    complete: function() {
        // 请求完成处理,隐藏loading图片
        $("#loading").hide();
    }
});

在这个示例中,我们首先显示loading图片,然后发起异步请求,并在请求完成后(不论成功或失败)隐藏loading图片。这样可以保证在进行网络请求时,用户界面保持响应。

2024-08-15

使用Ajax爬取豆瓣电影单页面数据,可以通过发送HTTP GET请求获取HTML内容,然后使用JavaScript的DOM解析方法解析HTML以提取所需数据。以下是一个简单的示例,使用原生JavaScript和Ajax技术来实现这一目标。




// 确保DOM完全加载
document.addEventListener('DOMContentLoaded', function () {
    var url = 'https://movie.douban.com/subject/1292720/'; // 豆瓣电影单页URL
 
    // 创建一个新的XMLHttpRequest对象
    var xhr = new XMLHttpRequest();
 
    // 配置HTTP请求
    xhr.open('GET', url, true);
 
    // 设置请求完成的处理函数
    xhr.onload = function () {
        if (this.status == 200) { // 请求成功
            // 获取到的HTML内容
            var html = this.responseText;
 
            // 使用DOM解析HTML,提取所需数据
            // 例如,提取电影名称
            var movieName = document.createElement('div');
            movieName.innerHTML = html;
            movieName = movieName.getElementsByClassName('title')[0].textContent.trim();
 
            // 输出电影名称
            console.log(movieName);
        }
    };
 
    // 发送请求
    xhr.send();
});

请注意,由于现代浏览器的安全策略和网站的防爬策略,直接爬取一些网站可能会遇到各种困难,包括CSRF保护、XHR/Fetch拦截、JavaScript动态渲染等。在实际应用中,可能需要处理这些问题,例如通过设置代理、使用headers伪装成浏览器访问、处理JavaScript动态渲染等。

2024-08-15

在Vue中使用AJAX通常涉及到安装和使用一个AJAX库,比如axios。以下是如何在Vue项目中使用axios的步骤和示例代码:

  1. 安装axios:



npm install axios
  1. 在Vue组件中引入axios:



import axios from 'axios';
  1. 使用axios发送请求:



export default {
  data() {
    return {
      message: ''
    };
  },
  mounted() {
    axios.get('https://jsonplaceholder.typicode.com/todos/1')
      .then(response => {
        this.message = response.data.title;
      })
      .catch(error => {
        console.error('There was an error!', error);
      });
  }
};

在这个例子中,我们在Vue组件的mounted钩子中发送了一个GET请求,以获取JSON Placeholder上的一个TODO项。请求成功后,我们将返回的标题数据存储到组件的message变量中,并在模板中显示它。如果请求失败,我们将错误信息打印到控制台。

2024-08-15

在Java后端开发中,使用Ajax、jQuery和JSON可以提升用户体验,实现前后端的异步交互。以下是一个简单的示例,展示了如何在Java Spring Boot应用中使用这些技术。

  1. 创建一个Spring Boot控制器,返回JSON数据:



import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
 
@RestController
public class DataController {
 
    @GetMapping("/data")
    public Map<String, Object> getData() {
        Map<String, Object> data = new HashMap<>();
        data.put("key", "value");
        return data;
    }
}
  1. 创建一个HTML页面,使用Ajax和jQuery异步请求上述数据:



<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
  $("#loadData").click(function(){
    $.ajax({
      url: "/data",
      type: "GET",
      dataType: "json",
      success: function(data) {
        console.log(data);
        $("#div1").html("Key: " + data.key);
      },
      error: function() {
        alert("Error loading data!");
      }
    });
  });
});
</script>
</head>
<body>
 
<div id="div1">Data will be loaded here...</div>
 
<button id="loadData">Load Data</button>
 
</body>
</html>

在这个例子中,当用户点击按钮时,会发起一个Ajax请求到/data端点,Spring Boot后端控制器处理请求并返回JSON格式的数据。然后,jQuery的success回调函数处理这些数据,并更新页面上的元素。这样,无需刷新页面即可更新数据。

2024-08-15



from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
 
# 假设有一个模型UserProfile,包含用户的信息
from .models import UserProfile
 
# 处理AJAX请求的视图函数
@csrf_exempt  # 禁用CSRF验证
@require_http_methods(["POST"])  # 仅允许POST方法
def get_user_profile(request):
    user_id = request.POST.get('user_id')
    if user_id:
        try:
            # 获取用户信息,假设我们只需要用户的名字和邮箱
            user_profile = UserProfile.objects.get(id=user_id)
            response_data = {
                'status': 'success',
                'name': user_profile.name,
                'email': user_profile.email
            }
        except UserProfile.DoesNotExist:
            response_data = {
                'status': 'error',
                'message': 'User not found'
            }
    else:
        response_data = {
            'status': 'error',
            'message': 'User ID is required'
        }
    return JsonResponse(response_data)

这段代码展示了如何在Django中创建一个视图函数来处理AJAX请求,并返回JSON响应。它首先检查是否提供了user_id,然后尝试从数据库中获取相应的用户信息。根据获取用户信息的结果,它构建了一个响应字典,最后返回一个JsonResponse对象。