展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > 使用Ajax从前端向后端发起请求的方法示例

使用Ajax从前端向后端发起请求的方法示例

一、重点思想前后端分离项目的核心逻辑,说到底就是前后端数据怎么传、怎么收。理解了这一点,学习收参和传参的方式就变得格外重要。另外,数据在前后端之间是以JSON字符串的形式传递的,所以JSON字符串的转换与解析也是必须掌握的基础。 1、从前端向后端传递数据 1. 将前端数据封装成一个对象 2. 将对象

一、重点思想

前后端分离项目的核心逻辑,说到底就是前后端数据怎么传、怎么收。理解了这一点,学习收参和传参的方式就变得格外重要。另外,数据在前后端之间是以JSON字符串的形式传递的,所以JSON字符串的转换与解析也是必须掌握的基础。

1、从前端向后端传递数据

1. 将前端数据封装成一个对象

2. 将对象转化为JSON字符串

3. 后端获取对象或属性

4. 解析为Ja va对象

2、从后端向前端传递数据

  1. 将Ja va对象转化为JSON字符串:String s = JSON.toJSONString(student);
  2. 实例化一个PrintWriter对象,调用write方法向前端传递:PrintWriter writer = res.getWriter();
  3. 前端接收到后端的数据:let data = xmlHttpRequest.responseText;
  4. 将JSON字符串解析为JS对象:let parse = JSON.parse(data);(拿到的是一个数组或者一个对象)

二、使用Ajax发起请求的方式

这部分主要是梳理一下代码,方便以后回顾。

1、使用GET方式向前端请求数据

        Title    

Ajax测试开始啦!

仅更换内容,不刷新页面

版权信息

小羊碎碎念:

  1. xmlHttpRequest.open("get","/ja vawebstudy2025_war_exploded/ajax1",true),该方法的三个参数分别是:请求方法类型,url,异步请求。异步请求不写默认为true。
  2. 异步请求:
@WebServlet("/ajax1")public class TestAjax1 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 {        req.setCharacterEncoding("utf-8");        resp.setContentType("text/html;charset=utf-8");        PrintWriter writer = resp.getWriter();        writer.write("我是来自后端的数据!");//后端向前端传递的数据    }}

小羊碎碎念:

  1. WebServlet 注解:用于注册 Servlet,将 Servlet 类与 Web 容器(如 Tomcat)建立关联,让容器能够识别、加载并正确调用 Servlet 处理 HTTP 请求。
  2. 创建 Servlet 类的常见方式:继承HttpServlet类(重写doGet、doPost方法或者直接实现service方法也可以);继承GenericServlet类(重写service方法);实现Servlet接口(实现所有抽象方法)。
  3. 实现一个接口必须实现他的抽象方法,否则定义该类为抽象类。

2、使用Get请求从前端向后端传递数据

        Title    
用户名和密码是什么?
用户名:密码:
@WebServlet("/ajax2")public class TestAjax2 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 {        req.setCharacterEncoding("utf-8");        resp.setContentType("text/html;charset=utf-8");        PrintWriter writer = resp.getWriter();        String name = req.getParameter("name");        String password = req.getParameter("password");        writer.write("用户名是"+name+",密码是"+password+"!");    }}

三、主要思想代码示例

首先,要明确是从前端向后端传数据还是从后端向前端传数据。第二,数据在前后端之间以JSON字符串的形式进行传递,那就涉及到JSON字符串的转换与解析。

1、获取DOM对象、定义全局变量、初始化

let tabObj = document.getElementById("tab")let sname = document.getElementById("sname");let ssex = document.getElementById("ssex");let sage = document.getElementById("sage");let user = document.getElementById("user");let pwd = document.getElementById("pwd");let jsonData;let indexc;let id;window.onload = function () {    ajaxGetData();}function ajaxGetData() {    let xmlHttpRequest = new XMLHttpRequest();    xmlHttpRequest.open("get", "/ja vawebstudy2025_war_exploded/Do?method=selectDo", true);    xmlHttpRequest.onreadystatechange = function () {        if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {            let data = xmlHttpRequest.responseText;            jsonData = JSON.parse(data);            let maxIndex = jsonData[jsonData.length - 1].id + 1;            initData("tab");        }    }    xmlHttpRequest.send();}

2、从前端向后端传数据

(1)校验管理员

/** * 6、校验管理员 * 关于传参选择普通键值对还是JSON字符串: * 简单数据用普通键值对,直观简洁,在URL拼接或传统表单提交时很方便,后端解析也容易。 * 而像实体类这种包含多个属性、结构较复杂的数据,JSON字符串能更好呈现其完整结构,方便前后端处理和交互。 * 这里测试过了,两种方法都是可以的。 */function isAdmin() {    let xmlHttpRequest = new XMLHttpRequest();    let newData={        "admin":user.value,        "password":pwd.value    }    let s = encodeURIComponent(JSON.stringify(newData));    xmlHttpRequest.open("get", "/ja vawebstudy2025_war_exploded/Do?method=isAdminDo&Data="+s, true);    /*let admin=user.value    let password=pwd.value    xmlHttpRequest.open("get", "/ja vawebstudy2025_war_exploded/Do?method=isAdminDo&admin="+admin+"&password="+password, true);*/    xmlHttpRequest.onreadystatechange = function () {        if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {            let data = xmlHttpRequest.responseText;            let parse = JSON.parse(data);            if(parse.msg=="success"){                //前端中==就可以比较两个字符串,而Ja va中需要用equals比较两个对象是否相等,==比较两个对象是否是同一个对象                window.location.href="showList copy 2.html" rel="external nofollow"             }else{                alert("用户名或密码错误,请重试")            }        }    }    xmlHttpRequest.send();}
    /**     * 逻辑2:登录     * @param servletRequest     * @param servletResponse     * @throws ServletException     * @throws IOException     */    public void isAdminDo(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {        String data = servletRequest.getParameter("Data");        JSONObject jsonObject = JSONObject.parseObject(data);        String admin = jsonObject.getString("admin");        String password = jsonObject.getString("password");       /* String admin = servletRequest.getParameter("admin");        String password = servletRequest.getParameter("password");*/        StudentImplService studentImplService = new StudentImplService();        Boolean login = studentImplService.isAdminService(admin, password);        PrintWriter writer = servletResponse.getWriter();        if(login!=null){            writer.write(JSON.toJSONString(Result.success()));        }else{            writer.write(JSON.toJSONString(Result.error("登录失败")));        }    }

(2)添加

/** * 2、添加数据 * @returns */function addData() {    var maxIndex = jsonData[jsonData.length - 1].id + 1    if (sname.value == "" || ssex.value == "" || sage.value == "") {        alert("数据不完整")        return false;    }    let newData = {        "id": maxIndex,        "sname": sname.value,        "ssex": ssex.value,        "sage": sage.value,    }    let jsonStr = encodeURIComponent(JSON.stringify(newData));    let xmlHttpRequest = new XMLHttpRequest();    xmlHttpRequest.open("get", "/ja vawebstudy2025_war_exploded/Do?method=addDo&jsondata=" + jsonStr, true);    xmlHttpRequest.onreadystatechange = function () {        if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {            let data = xmlHttpRequest.responseText;            ajaxGetData();        }    }    xmlHttpRequest.send();}
    /**     * 逻辑4:添加     * @param servletRequest     * @param servletResponse     * @throws ServletException     * @throws IOException     */    public void addDo(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {        HttpServletRequest req1 = (HttpServletRequest) servletRequest;        HttpSession session = req1.getSession(false);        PrintWriter writer = servletResponse.getWriter();        String newStu = servletRequest.getParameter("jsondata");        JSONObject jsonObject = JSONObject.parseObject(newStu);        String sname = jsonObject.getString("sname");        String ssex = jsonObject.getString("ssex");        String sage = jsonObject.getString("sage");        Student student = new Student(null, sname, ssex, sage);        int add = studentImplService.insertService(student);        if (add > 0) {            HttpServletResponse servletResponse1 = (HttpServletResponse) servletResponse;        } else {            System.out.println("添加失败!");        }    }

(3)实现更新

/** * 5、更新数据:将表格里的新数据又赋给json对象各属性的值 * 这个不用闭包 */function updateData1() {    let xmlHttpRequest = new XMLHttpRequest();    let newData = {        "id": id,//这里我就使用的是全局变量,以后每次先点击更新按钮,id就会被重新赋值为当前学号        "sname": sname.value,        "ssex": ssex.value,        "sage": sage.value,    }    let s = encodeURIComponent(JSON.stringify(newData));    xmlHttpRequest.open("get", "/ja vawebstudy2025_war_exploded/Do?method=updateDo&newStu=" + s, true);    xmlHttpRequest.onreadystatechange = function () {        if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {            ajaxGetData();        }    }    xmlHttpRequest.send();}
    /**     * 逻辑6:真正实现更新     * @param req     * @param res     * @throws ServletException     * @throws IOException     */    public void updateDo(ServletRequest req, ServletResponse res) throws ServletException, IOException {        String newStu = req.getParameter("newStu");        JSONObject jsonObject = JSONObject.parseObject(newStu);        Integer id = jsonObject.getInteger("id");        String sname = jsonObject.getString("sname");        String ssex = jsonObject.getString("ssex");        String sage = jsonObject.getString("sage");        Student student = new Student(id, sname, ssex, sage);        int update = studentImplService.updateService(student);        if (update < 0) {            System.out.println("更新失败!");        }    }

3、从后端向前端传数据

(1)查询数据

/** * 1、渲染json数据,并且动态生成表格 */function initData(tab) {    // 清理原来的DOM结构(不清理表头)    tabObj.innerHTML = "";    for (let index = 0; index < jsonData.length; index++) {        var trObj = document.createElement("tr")        if (index % 2 == 0) {            trObj.style.backgroundColor = "lightblue"//偶数行是蓝色        }        for (let pos = 0; pos < Object.keys(jsonData[0]).length + 2; pos++) {            var tdObj = document.createElement("td")            trObj.appendChild(tdObj)        }        let tdObjChildren = trObj.children;        let m = 0;        Object.keys(jsonData[index]).forEach(key => {                tdObjChildren[m++].innerHTML = jsonData[index][key];            }        )        let btnObj = document.createElement("button")        btnObj.innerHTML = "删除";        btnObj.onclick = delDate(index);        tdObjChildren[Object.keys(jsonData[0]).length].appendChild(btnObj)        let btnObj1 = document.createElement("button")        btnObj1.innerHTML = "更新";        btnObj1.onclick = updateData(jsonData[index].id)        tdObjChildren[Object.keys(jsonData[0]).length + 1].appendChild(btnObj1)        tabObj.appendChild(trObj)    }}
    /**     * 逻辑1:渲染数据     * @param req     * @param resp     * @throws ServletException     * @throws IOException     */    public void selectDo(ServletRequest req, ServletResponse resp) throws ServletException, IOException {        HttpServletRequest req1 = (HttpServletRequest) req;        HttpSession session = req1.getSession(false);        HttpServletResponse resp1 = (HttpServletResponse) resp;        List allData = studentImplService.getAllService();        String s = JSON.toJSONString(allData);        PrintWriter writer = resp.getWriter();        writer.write(s);    }

(2)获取一条数据

/** * 4、更新数据:将json数据放在表格里 */function updateData(index) {    let index1 = index//闭包函数写法    return function () {        indexc = index1;//全局的indexc记录了要修改的数据的下标        let xmlHttpRequest = new XMLHttpRequest();        xmlHttpRequest.open("get", "/ja vawebstudy2025_war_exploded/Do?method=getOneDo&id=" + indexc, true);        xmlHttpRequest.onreadystatechange = function () {            if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {                let data = xmlHttpRequest.responseText;                let parse = JSON.parse(data);                id = parse.id;//我将这里的id设置为全局变量,为了在真正实现更新时给“id”值                sname.value = parse.name//注意,这里返回了一条从数据库里面查出来的数据,你通过.属性名时这里的属性名是表中字段名                ssex.value = parse.sex                sage.value = parse.age                ajaxGetData();            }        }        xmlHttpRequest.send();    }}
    /**     * 逻辑5:获取一条数据:服务器端渲染     * @param req     * @param res     * @throws ServletException     * @throws IOException     */    public void getOneDo(ServletRequest req, ServletResponse res) throws ServletException, IOException {        Integer id = Integer.valueOf(req.getParameter("id"));        Student student = studentImplService.getOneService(id);        String s = JSON.toJSONString(student);        PrintWriter writer = res.getWriter();        writer.write(s);    }

(3)删除一条数据

/** * 3、删除数据 * @param {*} index * @returns *///也可以在调用处传参jsonData[index].id,然后让他等于index1,在地址里面传参index1即可function delDate(index) {    let index1 = index;    return function () {        if (confirm("确认删除吗?")) {            let xmlHttpRequest = new XMLHttpRequest();            xmlHttpRequest.open("get", "/ja vawebstudy2025_war_exploded/Do?method=delDo&id=" + jsonData[index1].id, true);            xmlHttpRequest.onreadystatechange = function () {                if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {                    ajaxGetData();                }            }            xmlHttpRequest.send();        }    }}
    /**     * 逻辑3:删除     * @param req     * @param res     * @throws ServletException     * @throws IOException     */    public void delDo(ServletRequest req, ServletResponse res) throws ServletException, IOException {        String id = req.getParameter("id");        System.out.println("id = " + id);        Integer idd = Integer.valueOf(id);        int i = studentImplService.delService(idd);        System.out.println("i = " + i);        if (i > 0) {            HttpServletResponse servletResponse1 = (HttpServletResponse) res;        } else {            System.out.println("删除失败!");        }    }

4、数据访问层展示

这个项目实现了数据的增删查改与校验管理员,分别写了两个实体类:学生类和管理员类,并为它们分别写了数据访问层。如果没有管理员类,通过MyBatis操作数据库会失败,所以定义管理员类是必要的。

package dao;import moudle.Student;import org.apache.ibatis.annotations.*;import ja va.util.List;public interface StudentDao {    @Select("select * from Student")    List getAllDao();    @Delete("delete from student where id=#{id}")    int delDao(Integer id);    @Insert("insert into student values (null,#{name},#{sex},#{age})")    int insertDao(Student student);    @Select("select * from student where id=#{id}")    Student getOneDao(Integer id);    @Update("update student set name=#{name},sex=#{sex},age=#{age} where id=#{id}")    int updateDao(Student student);    @Select("select * from student limit #{start},#{pageSize}")    List fenYeDao(@Param("start") Integer start,@Param("pageSize") Integer pageSize);}
package dao;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;public interface ManagerDao {    @Select("select * from manager where admin=#{admin} and password=#{password}")    Boolean isAdminDao(@Param("admin") String admin,@Param("password") String password);}

5、分页查询前端代码备份

这是一个JSP文件

<%@ page import="moudle.Student" %><%@ page import="ja va.util.List" %><%@ page import="service.impl.StudentImplService" %><%--  Created by IntelliJ IDEA.  User: 34806  Date: 2025/5/7  Time: 10:15  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="ja va" %>    学生信息列表展示                        <%    StudentImplService studentImplService1 = new StudentImplService();    List data = studentImplService1.getAllService();    int totalCount = data.size();    int pageSize = 3;    int pageCount = (int) (Math.ceil(totalCount * 1.0 / pageSize));    int curPage = request.getParameter("curPage") == null ?            1 : Integer.valueOf(request.getParameter("curPage"));    int offSet = (curPage - 1) * 3;    StudentImplService studentImplService = new StudentImplService();    List students = studentImplService.fenYeService(offSet, pageSize);%>退出    <%        for (int i = 0; i < students.size(); i++) {    %>        <%        }    %>    <%        if (curPage == 1) {    %>        <%    } else if (curPage == pageCount) {    %>        <%    } else {    %>        <%        }    %>    
学号 姓名 性别 年龄 操作1 操作2
<%=students.get(i).getId()%> <%=students.get(i).getName()%> <%=students.get(i).getSex()%> <%=students.get(i).getAge()%> 删除 更新
首页 上一页 下一页 尾页
首页 上一页 下一页 尾页
首页 上一页 下一页 尾页
本文内容来源于网友投稿,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

Mac软件 更多
photoshop
photoshop

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Mac
WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Mac
Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。