Spring MVC:域对象共享数据

Spring MVC

  • 前言
  • 域对象共享数据
    • 使用 ModelAndView 向 request 域对象中共享数据
    • 使用 Map 、Model 或 ModelMap 向 request 域对象中共享数据
    • 使用 @SesionAttributes 注解向 session 域对象中共享数据
    • 使用 Servlet API 向 application 域对象中共享数据

在这里插入图片描述

前言

在上一章中,谈到处理器 Controller 获取请求参数的实现。那么,在处理器 Controller 处理请求后,下一步是将模型数据通过域对象共享的方式(结果会封装成模型视图 ModelAndView 对象)返回给前端控制器 DispatcherServlet 。

模型数据:Model 层中请求处理后的结果(会返回给处理器 Controller )

在这里插入图片描述

域对象共享数据

域对象共享数据,指在 Spring MVC 应用中,多个 Controller 或 Model 对象可以共享相同的数据。通过共享数据,可以避免重复的数据获取和数据传递,提高程序的性能和可维护性。

在 Spring MVC 中,域对象共享数据可以通过多种方式实现:

  1. 使用 ModelAndView 向 request 域对象中共享数据
  2. 使用 Map 、Model 或 ModelMap 向 request 域对象中共享数据
  3. 使用 @SesionAttributes 注解向 session 域对象中共享数据
  4. 使用 Servlet API 向 application 域对象中共享数据

使用 ModelAndView 向 request 域对象中共享数据

ModelAndView 对象有 model 和 view 两个属性。model 属性用于向请求域共享数据,而 view 属性用于设置视图。

简单示例:
1.首先进行注入字符串

package cn.edu.springmvcdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class DomainObjectSDDemo {@RequestMapping("/mavTest")public ModelAndView mavTest(){ModelAndView mav = new ModelAndView();//1.字符串注入mav.addObject("name","admin"); //添加数据模型mav.setViewName("DomObjSharedData"); //设置视图return mav;}
}

创建 DomObjSharedData.jsp

<%--Created by IntelliJ IDEA.User: dellDate: 2023/7/22Time: 15:04To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>name = ${name} <%-- 或者 ${requestScope.name} --%>
</body>
</html>

结果如图:
在这里插入图片描述

2.接着进行注入对象
先创建一个实体类 DomainObject ,定义编号、名字和年龄属性 (下面例子中使用到的对象都是 DomainObject )

package cn.edu.springmvcdemo.model;public class DomainObject {private int id;private String name;private int age;public DomainObject() {super();}public DomainObject(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "DomainObject{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

接着,对象注入

package cn.edu.springmvcdemo.controller;import cn.edu.springmvcdemo.model.DomainObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class DomainObjectSDDemo {@RequestMapping("/mavTest")public ModelAndView mavTest(){ModelAndView mav = new ModelAndView();//1.字符串注入mav.addObject("name","admin"); //添加数据模型//2.对象注入DomainObject domainObject = new DomainObject();domainObject.setId(722);domainObject.setName("admin");domainObject.setAge(18);mav.addObject("admin",domainObject);mav.setViewName("DomObjSharedData"); //设置视图return mav;}
}

然后,DomObjSharedData.jsp 添加获取对象的内容

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>name = ${name} <%-- 或者 ${requestScope.name} --%><br>user = ${admin}
</body>
</html>

结果如图:
在这里插入图片描述

3.最后进行注入 list 集合与 map 集合
先在 pom.xml 中添加依赖

<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl -->
<dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-impl</artifactId><version>1.2.5</version>
</dependency><!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-spec -->
<dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-spec</artifactId><version>1.2.5</version>
</dependency>

接着,list 集合和 map 集合注入

package cn.edu.springmvcdemo.controller;import cn.edu.springmvcdemo.model.DomainObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Controller
public class DomainObjectSDDemo {@RequestMapping("/mavTest")public ModelAndView mavTest(){ModelAndView mav = new ModelAndView();//1.字符串注入mav.addObject("name","admin"); //添加数据模型//2.对象注入DomainObject domainObject1 = new DomainObject();domainObject1.setId(722);domainObject1.setName("admin");domainObject1.setAge(18);mav.addObject("admin",domainObject1);//3. list 集合注入DomainObject domainObject2 = new DomainObject();domainObject2.setId(723);domainObject2.setName("administrator");domainObject2.setAge(20);mav.addObject("administrator",domainObject2);List<DomainObject> domainObjects = new ArrayList<>();domainObjects.add(domainObject1);domainObjects.add(domainObject2);mav.addObject("domainObjects",domainObjects); //存入 List 类型数据//3. map 集合注入Map<Integer,DomainObject> map = new HashMap<Integer,DomainObject>();map.put(1,domainObject1);map.put(2,domainObject2);mav.addObject("map",map); //存入 Map 类型数据mav.setViewName("DomObjSharedData"); //设置视图return mav;}
}

然后,DomObjSharedData.jsp 添加获取 list 集合和 map 集合的内容

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>name = ${name} <%-- 或者 ${requestScope.name} --%><br>user = ${admin}<br><c:forEach var="domainObject" items="${domainObjects}">domainObjects = ${domainObject}<br>domainObject_names = ${domainObject.name}<br></c:forEach><br><c:forEach var="map" items="${map}">map = ${map}<br></c:forEach>
</body>
</html>

注:这次需要重启 JRebel 才能正常显示

结果如图:
在这里插入图片描述

使用 Map 、Model 或 ModelMap 向 request 域对象中共享数据

使用 Map 、Model 或 ModelMap 向 request 域对象中共享数据是项目开发中相对比较常用的方式。与使用 ModelAndView 相比,更简单便捷些。

简单示例:
在上面案例的基础上,只需在 DomainObjectSDDemo 类中进行修改
1.使用 Map 向 request 域对象中共享数据

package cn.edu.springmvcdemo.controller;import cn.edu.springmvcdemo.model.DomainObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;@Controller
public class DomainObjectSDDemo {@RequestMapping("/mvTest1")public String mvTest1(Map<String,Object> map){//注入字符串map.put("name","admin"); //对比使用 ModelAndView :mav.addObject("name","admin");//注入对象DomainObject domainObject1 = new DomainObject();domainObject1.setId(722);domainObject1.setName("admin");domainObject1.setAge(18);map.put("admin",domainObject1); //对比使用 ModelAndView :mav.addObject("admin",domainObject1);//主要区别在于 map.put() 和 mav.addObject(),不一一演示return "DomObjSharedData"; /**对比使用 ModelAndView :ModelAndView mav = new ModelAndView();mav.setViewName("DomObjSharedData"); //设置视图return mav;**/}
}

结果如图:
在这里插入图片描述

2.使用 Model 向 request 域对象中共享数据

@RequestMapping("/mvTest2")
//对比使用 map 的方法参数:Map<String,Object> map
public String mvTest2(Model model){//注入字符串//对比使用 Map:map.put("name","admin"); //对比使用 ModelAndView :mav.addObject("name","admin");model.addAttribute("name","admin");//注入对象DomainObject domainObject1 = new DomainObject();domainObject1.setId(722);domainObject1.setName("admin");domainObject1.setAge(18);//对比使用 Map:map.put("admin",domainObject1); //对比使用 ModelAndView :mav.addObject("admin",domainObject1);model.addAttribute("admin",domainObject1);//主要区别在于 model.addAttribute()、map.put() 和 mav.addObject(),不一一演示return "DomObjSharedData"; /**对比使用 ModelAndView :ModelAndView mav = new ModelAndView();mav.setViewName("DomObjSharedData"); //设置视图return mav;**/
}

结果如图:
在这里插入图片描述

3.使用 ModelMap 向 request 域对象中共享数据

@RequestMapping("/mvTest3")
//而 ModelMap 将 model 和 map 综合起来了。即既可以使用 addAttribute() 也可以使用 put()
//方法参数为 ModelMap 
public String mvTest3(ModelMap modelMap){modelMap.addAttribute("name","admin"); // 或者 modelMap.put("name","admin");DomainObject domainObject1 = new DomainObject();domainObject1.setId(722);domainObject1.setName("admin");domainObject1.setAge(18);modelMap.put("admin",domainObject1); // 或者 modelMap.addAttribute("admin",domainObject1);return "DomObjSharedData";
}

结果如图:
在这里插入图片描述

总体来讲,向 request 域对象中共享数据的各种方式区别不大,自行根据个人喜好习惯选择使用即可。

使用 @SesionAttributes 注解向 session 域对象中共享数据

使用 @SesionAttributes 注解可以将数据共享到 session 域对象中,同时也共享到 request 域对象中。

@SesionAttributes 注解属性

  • value :通过键来指定共享的值
  • types :通过类型来指定共享的值
//只能用于类级别
//书写格式
@SessionAttributes(value = "xxx",types = "xxx.class")
//或者
@SessionAttributes(value = {"xxx","xxx"...},types = {"xxx.class","xxx.class"...})

简单示例:
使用 @SesionAttributes 注解向 session 域对象中共享数据

package cn.edu.springmvcdemo.controller;import cn.edu.springmvcdemo.model.DomainObject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;@SessionAttributes(value = {"name","admin"}) //或者 @SessionAttributes(types = {String.class,DomainObject.class})
@Controller
public class DomainObjectSDDemo_SA {@RequestMapping("/saTest")public String saTest(ModelMap modelMap){//字符串注入modelMap.put("name","admin");//对象注入//实体类 DomainObject ,ModelAndView 的示例中已创建DomainObject domainObject1 = new DomainObject();domainObject1.setId(722);domainObject1.setName("admin");domainObject1.setAge(18);modelMap.put("admin", domainObject1);return "DomObjSharedData_SA";}
}

创建 DomObjSharedData_SA.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>获取 request 域中的 name : ${requestScope.name} <br>获取 session 域中的 name : ${sessionScope.name} <br>admin = ${admin}
</body>
</html>

结果如图:
在这里插入图片描述

使用 Servlet API 向 application 域对象中共享数据

使用 Servlet API 可以将数据共享到 application 域对象中。虽然不能同时共享到其他域对象中,但也可以使用 Servlet API 将数据共享到 session 域对象与 request 域对象中。

简单示例:
使用 Servlet API 向 application 域对象、session 域对象与 request 域对象中共享数据

package cn.edu.springmvcdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
public class DomainObjectSDDemo_SAPI {@RequestMapping("/sapiTest")public String sapiTest(HttpSession session, HttpServletRequest request){//1.向 application 域对象共享数据ServletContext application = session.getServletContext();application.setAttribute("name", "admin1");//2.向 session 域对象共享数据session.setAttribute("name","admin2");//3.向 request 域对象共享数据request.setAttribute("name","admin3");return "DomObjSharedData_SAPI";}
}

创建 DomObjSharedData_SAPI.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>获取 application 域中的 name : ${applicationScope.name} <br>获取 session 域中的 name : ${sessionScope.name} <br>获取 request 域中的 name : ${requestScope.name}
</body>
</html>

结果如图:
在这里插入图片描述

@ModelAttribute 注解介绍
1.使用 @ModelAttribute 注解在方法上:在执行目标方法前,先从上到下逐一执行有 @ModelAttribute 注解的方法
2.使用 @ModelAttribute 注解在方法的参数上:用于从 Model 、Form 表单或者 URL 请求参数中获取属性值

通常 @ModelAttribute 注解应用在修改对象的某些属性值,而其他属性值不允许修改或保持不变的场景中

简单示例:
创建修改信息的页面 DomObjSharedData_UPDATE.jsp

<%-- 只修改年龄,id 隐藏,名字不允许修改 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body><h3>信息修改</h3><form action="${pageContext.request.contextPath}/updateTest" method="post"><input type="hidden" name="id" value="722" />年龄:<input type="text" name="age" /><input type="submit" value="修改"/></form>
</body>
</html>

创建成功修改跳转的页面 accessing.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body><h2>提交成功!</h2>
</body>
</html>

在没有使用 @ModelAttribute 注解前:不作修改的属性值可能为空,或者使用传统的方法修改实现
在这里插入图片描述
在这里插入图片描述

在 Spring MVC 中,提供的 @ModelAttribute 注解也可以实现修改

package cn.edu.springmvcdemo.controller;import cn.edu.springmvcdemo.model.DomainObject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class DomainObjectSDDemo_MA {//先执行有 @ModelAttribute 注解的方法@ModelAttribute//默认 id 参数赋值为 null ,@RequestParam 注解知识点private void getUser(@RequestParam(value = "id",required = false) Integer id, ModelMap modelMap){System.out.println("id ==" + id);DomainObject domainObject = new DomainObject();//通过传递的 id 值匹配数据库中对应的记录,返回一个对应的对象//模拟:获取 id 对应的对象属性值domainObject.setName("admin");domainObject.setAge(18);//注入( DomainObject对象,attributeName 规定写为 domainObject )modelMap.addAttribute("domainObject",domainObject); //注:attributeName 与对应的对象名字保持一致,首字母改为小写}//信息修改@RequestMapping("/update")public String update(){return "DomObjSharedData_UPDATE";}//修改成功@RequestMapping("/updateTest")public String updateTest(DomainObject domainObject){System.out.println("修改后的信息:" + domainObject);//信息修改后为:DomainObject{id=722, name='null', age=18},这里 name 为空,直接全部覆盖会把数据库的 name 信息也修改为 null//或者/*** 传统做法:* 第一步:通过传递的id值匹配数据库中对应的记录,返回一个对应的对象* 第二步:将传递的对象要修改的属性覆盖到从数据库中查询出的对象的属性里* 第三步:调用 service 层的修改方法,实现修改* 这里思想就是单一对修改的字段进行覆盖。* **///使用 @ModelAttribute 注解后,可以直接全部覆盖,省略了传统做法的第一二步,直接调用 service 层的修改方法即可return "accessing";}
}

注:在注入对象中,关于 attributeName 的命名也可以使用第二种方式。如图:
在这里插入图片描述

测试结果:
1.填写要修改的年龄,点击提交
在这里插入图片描述

2.修改成功,同时没有修改的信息保持不变,而不是为空值
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Linux搭建GitLab私有仓库,并内网穿透实现公网访问

目录 前言 1.下载Gitlab 2.安装Gitlab 3.启动Gitlab 4.安装cpolar 5. 创建隧道配置访问地址 6.固定GitLab访问地址 7. 配置二级子域名 8. 测试访问二级子域名 前言 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基…

问道管理:什么是大盘?大盘股又是什么?

聊到股市就免不了聊到大盘&#xff0c;有些新进场的投资者对此或许带有疑问&#xff0c;什么是大盘&#xff1f;我们所说的大盘股又是什么&#xff1f;关于这些&#xff0c;问道管理为我们准备了以下参考内容。 什么是大盘&#xff1f; 大盘&#xff0c;主要是指股市的整体行情…

python-数据分析-numpy、pandas、matplotlib的常用方法

一、numpy import numpy as np1.numpy 数组 和 list 的区别 输出方式不同 里面包含的元素类型 2.构造并访问二维数组 使用 索引/切片 访问ndarray元素 切片 左闭右开 np.array(list) 3.快捷构造高维数组 np.arange() np.random.randn() - - - 服从标准正态分布- - - …

CSS 一个好玩的卡片“开卡效果”

文章目录 一、用到的一些CSS技术二、实现效果三、代码 一、用到的一些CSS技术 渐变 conic-gradientbox-shadowclip-path变换、过渡 transform、transition动画 animation keyframes伪类、伪元素 :hover、::before、::after …绝对布局。。。 clip-path 生成网站 https://techb…

Yjs + Quill 实现文档多人协同编辑器开发(基础+实战)

前言 多人协同开发确实是比较难的知识点&#xff0c;在技术实现上有一定挑战&#xff0c;但随着各种技术库的发展&#xff0c;目前已经有了比较成熟的解决方案。今介绍 Yjs 基于CRDT算法&#xff0c;用于构建自动同步的协作应用程序&#xff0c;与Quill富文本编辑器&#xff0c…

从零开始学习 Java:简单易懂的入门指南之Collection集合及list集合(二十一)

Collection集合及list集合 1.Collection集合1.1数组和集合的区别1.2集合类体系结构1.3Collection 集合概述和使用1.4Collection集合的遍历1.4.1 迭代器遍历1.4.2 增强for1.4.3 lambda表达式 2.List集合2.1List集合的概述和特点2.2List集合的特有方法2.3List集合的五种遍历方式2…

仓库运行状况如何得知?数据挖掘是关键!

库存、订单、出入库记录、物流信息、货物状态等数据&#xff0c;是仓库管理的重要组成部分。 仓库数据的重要性 做好仓库数据管理对企业的重要性不言而喻。通过有效地管理数据&#xff0c;企业可以更好地了解市场需求和库存情况&#xff0c;快速响应市场变化&#xff0c;提高库…

医院小程序如何在线搭建?实战解析

在当今数字化时代&#xff0c;移动应用程序成为我们生活中必不可少的一部分。特别是在医疗领域&#xff0c;移动应用程序的需求更为迫切。为了满足这一需求&#xff0c;开发一个医疗小程序成为了许多医疗机构的优先选择。 在本文中&#xff0c;我们将分享一个实战攻略&#xff…

iOS开发Swift-5-自动布局AutoLayout-摇骰子App

1.在iOS坐标系中&#xff0c;以向左、向下为正方向。图片以左上角为基准点。 2.打开之前的摇骰子App&#xff0c;对它的界面做一些适应所有iPhone机型的效果。 3.先对上方logo做一个y轴约束和一个宽高约束。 宽高约束&#xff1a; 水平居中&#xff1a; 对y轴进行约束。将虚线点…

WebDAV之π-Disk派盘 + 思源笔记

思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。 融合块、大纲和双向链接,重构你的思维。 π-Disk派盘 – 知识管理专家 派盘是一款面向个人和企业的本地云存储解决方案,它可以帮助用户打造“数字第二大脑”,并支持KMS知识管理系…

专访远航汽车远勤山:踏踏实实做好产品 直面挑战乘风远航

8月25日&#xff0c;第二十六届成都国际汽车展览会在中国西部国际博览城隆重开幕。车展举办期间&#xff0c;远航汽车董事长远勤山先生、产品研发总监王震先生向媒体分享了远航汽车品牌发展、产品研发、技术创新以及市场布局等内容。 “通过我们的付出和努力&#xff0c;让我们…

全网最新最全软件测试工程师面试题,看完金九银十还怕拿不到offer?

与开发工程师相比&#xff0c;软件测试工程师前期可能不会太深&#xff0c;但涉及面还是很广的。 在一年左右的实习生或岗位的早期面试中&#xff0c;主要是问一些基本的问题。 涉及到的知识主要包括MySQL数据库的使用、Linux操作系统的使用、软件测试框架问题、测试环境搭建问…

kafka 命令脚本说明以及在java中使用

一、命令行使用 1.1、topic 命令 1、关于topic,这里用window 来示例 bin\windows\kafka-topics.bat2、创建 first topic,五个分区&#xff0c;1个副本 bin\windows\kafka-topics.bat --bootstrap-server localhost:9092 --create --partitions 5 --replication-factor 1 -…

本地缓存、Redis数据缓存策略

目录 需求看似简单&#xff0c;一取一传但是&#xff0c;又出现了一个新的问题&#xff0c;数据丢了。 一、缓存缓存有哪些分类&#xff1a; 二、分析一下本地缓存的优势三、本地缓存解决方案&#xff1f;1、基于Guava Cache实现本地缓存2、基于Caffeine实现本地缓存3、基于Enc…

无涯教程-Flutter - Dart简介

Dart是一种开源通用编程语言&#xff0c;它最初是由Google开发的&#xff0c; Dart是一种具有C样式语法的面向对象的语言&#xff0c;它支持诸如接口&#xff0c;类之类的编程概念&#xff0c;与其他编程语言不同&#xff0c;Dart不支持数组&#xff0c; Dart集合可用于复制数据…

来和稚晖君做同事,校招内推、社招、实习

先上校招官网投递链接和内推码。 投递链接&#xff1a;http://www.agibot.com/ 我的内推码&#xff1a;MVKRCCW 智元机器人开始校招了&#xff0c;众多岗位如下&#xff1a; 公司正在不断发展壮大中&#xff0c;需要优秀的毕业生加入&#xff0c;一块来搞点有意思的事情。稚…

访问 GitHub 方法

访问 GitHub 方法 方法一&#xff1a;最常见的就是 fq&#xff0c;但这个是违法的行为&#xff0c;自己私下搞可以&#xff0c;不能教你们。 方法二&#xff1a;利用加速器&#xff0c;这是正规合法操作。这里推荐一个免费的加速器&#xff0c;下载安装 Watt Toolkit加速器,原名…

spark支持深度学习批量推理

背景 在数据量较大的业务场景中&#xff0c;spark在数据处理、传统机器学习训练、 深度学习相关业务&#xff0c;能取得较明显的效率提升。 本篇围绕spark大数据背景下的推理&#xff0c;介绍一些优雅的使用方式。 spark适用场景 大数据量自定义方法处理、类sql处理传统机器…

1+X智慧安防系统实施与运维技能等级证产教融合基地建设方案

一、系统概述 1X智慧安防系统实施与运维技能等级证产教融合体系统融合了产业需求、教育培训和技能认证&#xff0c;通过课程培训、实训基地和实习实训等方式培养学员的技能水平&#xff0c;并通过技能认证来评估其能力&#xff0c;以满足智慧安防行业对人才的需求&#xff0c;并…

迈向无限可能, ATEN宏正领跑设备切换行业革命!

随着互联网在各个领域的广泛应用,线上办公这一不受时间和地点制约、不受发展空间限制的办公模式开始广受追捧,预示着经济的发展正朝着新潮与活跃的方向不断跃进。当然,在互联网时代的背景下,多线程、多设备的线上办公模式也催生了许多问题:多设备间无法进行高速传输、切换;为保…