当前位置: 首页 > news >正文

JavaEE-Spring Controller(服务器控制以及Controller的实现和配置)

Spring Controller


服务器控制

响应架构

Spring Boot 内集成了 Tomcat 服务器,也可以外接 Tomcat 服务器。通过控制层接收浏览器的 URL 请求进行操作并返回数据。

底层和浏览器的信息交互仍旧由 servlet 完成,服务器整体架构如下:

  • Server: Tomcat 最顶层容器,代表整个服务器。

    • Service:服务,对应不同的任务。

      • Connector:有多个,用来处理连接相关的事情,并提供 Socket 到 Request 和 Response 相关转化。

      • Container:只有一个,用于封装和管理 Servlet ,以及处理具体的 Request 请求。

启动过程

main 方法: 实例化 SpringApplication ,执行run方法

run方法:
配置属性、获取监听器,初始化输入参数、配置环境,输出banner 创建上下文、预处理上下文、刷新上下文、再刷新上下文:context

refreshApplicationContext方法:通过ServletWebServerFactory接口定义了getwebServer方法,通过其创建webServer并返回(创建时做了两件重要的事情:把Connector对象添加到tomcat中,配置引擎)【TomcatServletWebServerFactory是接口其中一个实现类】

TomcatwebServer类中,规定了Tomcat服务器的启动和关闭方法。

而tomcat的启动主要是实例化两个组件:Connector、Container


Controller 实现

Controller 类需要使用 @RestController 或 @Controller 注解标注。

  • @Controller:类中所有方法以 String 形式返回 classpath 路径下同名 html 页面。适用于 JSP/thymeleaf 等动态加载页面。

  • @RestController:类中所有方法以 Map/List 等形式返回 JSON 数据。适用于前后端分离开发。

P.S. @Controller 类中标注 @ResponseBody 的方法,可以起到和 @RestController 类相同的效果。

请求映射

  1. Controller 类中的方法使用 @RequestMapping 注解标注,就可以将指定 URL 请求映射到方法上处理。
@RequestMapping(value = "/hello", method = RequestMethod.GET)     // 参数为 URL 路径和请求方式
@RequestMapping("/hello")                                         // 默认接收所有请求方式@GetMapping("/hello")                                             // 简写形式的 GET 请求
@PostMapping("/hello")                                            // 简写形式的 POST 请求// 灵活映射
@RequestMapping("/?/hello")                                       // ? 匹配单字符
@RequestMapping("/*/hello")`:                                    // * 匹配任意数量字符
@RequestMapping("/**/hello")// ** 匹配任意数量目录
@RequestMapping("/{ID}/hello")`                                   // {} 自动读取 URL 路径动态参数Copy to clipboardErrorCopied
  1. Controller 类也可以通过 @RequestMapping 注解标注,表示路径下的 URL 请求在该类中寻找方法。
@Controller
@RequestMapping("/speak")
public class SpeakController{@GetMapping("/hello")public String hello(){ return "hello"; } 
}Copy to clipboardErrorCopied

GET 请求参数

GET 请求参数直接附着在 URL 中。对于请求 /test?username=mrjoker&password=123456 ,Controller 方法有以下几种方式接收:

  1. 直接获取参数
@RequestMapping("/test")
public String test(String username, String password){return username + password;
}Copy to clipboardErrorCopied
  1. 通过 HttpServletRequest 类来获取参数
@RequestMapping("/test")
public String test(HttpServletRequest request){String username = request.getParameter("username");String password = request.getParameter("password");return username + password;
}Copy to clipboardErrorCopied
  1. 通过自定义对象来获取参数
@RequestMapping("/test")
public String test(User user){String username = user.getUsername();String password = user.getPassword();return username + password;
}Copy to clipboardErrorCopied
  1. 通过 RequestParam 注解来获取参数,实参值赋给形参。
@RequestMapping("/test")
public String test(@RequestParam(value="username",required = false, defaultValue ="mrjoker") String s1, @RequestParam("password") String s2){return s1 + s2;
}Copy to clipboardErrorCopied
  1. 通过 PathVariable 注解来动态获取参数,参数直接附着在 URL 中。
@RequestMapping("/test/{username}/{password}")
public String test(@PathVariable("username") String s1, @PathVariable("password") String s2){return s1 + s2;
}Copy to clipboardErrorCopied
  1. 通过 ModelAttribute 注解来获取其他方法返回值作为参数,被注释方法会在此 controller 中每个方法执行前被执行。
@Controller 
public class HelloWorldController { @ModelAttribute public void populateModel(@RequestParam String abc, Model model) { model.addAttribute("attributeName", abc); } @RequestMapping(value = "/helloWorld") public String helloWorld() { return "helloWorld"; } 
}Copy to clipboardErrorCopied

POST 请求参数

POST 请求请求参数放置在请求体中,有以下两种格式:

  • Form Data 格式

请求的 Content-Type 为 application/x-www-form-urlencoded

示例:username=mrjoker&password=123456

  • Request Payload 格式

请求的 Content-Type 为 application/json 或者 multipart/form-data

示例:{"username":"mrjoker", "password":"123456"}

  1. AJAX 提交 POST 请求默认使用 Form Data 格式,Spring MVC 会自动解析到对应的 bean 中并获取参数。
// 逐个参数接收
@RequestMapping(value="/test", method=RequestMethod.POST)
private String test(@RequestParam("username") String username, @RequestParam("password") String password){return username + password;
}// 解析为整体接收
@RequestMapping(value="/test", method=RequestMethod.POST)
private String test(User user){return user.getUsername() + user.getPassword();
}Copy to clipboardErrorCopied
  1. Vue 提交 POST 请求默认使用 Request Payload 格式,Spring MVC 接收时必须进行处理:

    • 前端解决方案: axios 库可以使用 qs 库将 json 对象转化为 Form Data 格式。
    • 后端解决方案: Spring Boot 在请求参数上加 @RequestBody 注解,将请求正文解析到对应的 bean 中获取参数。

@RequestBody 可以直接以 String 接收前端传过来的 json 数据,也可以用对象自动解析前端传过来的 json 数据。对象里定义 List 属性,可用来接收多条 json 数据。

// String 形式接收
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String test(@RequestBody String user) {JSONObject userJson = JSON.parseObject(user);String username = userJson.getString("username");String password = userJson.getString("password");return username + password;
}// 解析为对象接收
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String updateClusterIdByClientAndQueue(@RequestBody User user) {return user.getUsername() + user.getPassword();
}Copy to clipboardErrorCopied

一个请求可以有多个 @RequestParam,但只能有一个 @RequestBody。 URL 内含有参数时,两者可以同时使用。

请求转发和重定向

  1. 请求转发(forward)

    客户端(浏览器)向服务器 A 发送一个 URL 请求,服务器 A 会向另一台服务器 B 获取资源并将此资源响应给浏览器。浏览器的 URL 地址仍然是 A 。

  2. 重定向(Redirect)

    客户端(浏览器)向服务器 A 发送一个 URL 请求,服务器 A 告知浏览器资源在服务器 B,浏览器会重新发送请求到服务器 B。浏览器的 URL 地址切换为 B。

// 请求转发
@RequestMapping("/test1")
public String test1(){String type = 'forward';return "forward:/test2?type=" + type;
}// 重定向
@RequestMapping("/test2")
public String test2(){String type = 'redirect';return "redirect:/test2?type=" + type;
}Copy to clipboardErrorCopied

在拦截器中,常通过修改 HttpSevletRequest 对象实现请求转发。

request.getRequestDispatcher("login").forward(request,response);Copy to clipboardErrorCopied

Controller 配置

Spring 的 WebMvcConfigurer 接口定义了 Controller 层配置信息(默认为空实现)。

开发者可以通过实现 WebMvcConfigurer 接口或继承 WebMvcConfigurationSupport 类对以下方法进行重写。

@Configuration
public class WebMVCConfig implements WebMvcConfigurer {/** 解决跨域问题 **/@Overridepublic void addCorsMappings(CorsRegistry registry){};/** 添加拦截器 **/@Overridepublic void addInterceptors(InterceptorRegistry registry){};}Copy to clipboardErrorCopied

跨域问题

配置如何处理跨域请求,否则返回数据会被浏览器拦截。

@Override
public void addCorsMappings(CorsRegistry registry) {// 添加映射路径(全部)registry.addMapping("/**")// 放行哪些原始域.allowedOrigins("*")// 是否发送 Cookie 信息.allowCredentials(true)// 放行哪些原始域(请求方式).allowedMethods("GET","POST", "PUT", "DELETE")// 放行哪些原始域(头部信息).allowedHeaders("*")// 暴露哪些头部信息.exposedHeaders("Header1", "Header2");
}Copy to clipboardErrorCopied

局部跨域

  1. @CrossOrigin 注解:在方法上(@RequestMapping)或者在控制器(@Controller)上使用,可以实现局部跨域。
@RequestMapping("/hello")
@ResponseBody
@CrossOrigin("http://localhost:8080") 
public String index( ){return "Hello World";
}Copy to clipboardErrorCopied
  1. 使用 HttpServletResponse 对象添加响应头实现局部跨域。
@RequestMapping("/hello")
@ResponseBody
public String index(HttpServletResponse response){response.addHeader("Access-Control-Allow-Origin", "http://localhost:8080");         // 指定端口放行// response.addHeader("Access-Control-Allow-Origin", "*");                             全部放行return "Hello World";
}Copy to clipboardErrorCopied

拦截器 & 过滤器

  • 拦截器(Interceptor)

Java Web 中,在执行 Controller 方法前后对 Controller 请求进行拦截和处理。依赖于 web 框架,在 Spring 配置。在实现上基于 Java 的反射机制。

  • 过滤器(Filter)

Java Web 中,在 request/response 传入 Servlet 前,过滤信息或设置参数。依赖于 servlet 容器,在 web.xml 配置。在实现上基于函数回调。

两者常用于修改字符编码、删除无用参数、登录校验等。Spring 框架中优先使用拦截器:功能接近、使用更加灵活。

拦截器配置

// 在配置中引入拦截器对象(单独编写拦截器类)@Override
public void addInterceptors(InterceptorRegistry registry) {// 导入拦截器对象,默认拦截全部InterceptorRegistration addInterceptor = registry.addInterceptor(new myInterceptor());// 排除配置addInterceptor.excludePathPatterns("/error","/login","/user/login");               addInterceptor.excludePathPatterns("/asserts/**");                       addInterceptor.excludePathPatterns("/webjars/**");addInterceptor.excludePathPatterns("/public/**");// 拦截配置addInterceptor.addPathPatterns("/**");
}Copy to clipboardErrorCopied

拦截器类通过实现 HandlerInterceptor 接口或者继承 HandlerInterceptorAdapter 类。

// 定义拦截器
public class myInterceptor extends HandlerInterceptorAdapter {// Session keypublic final static String SESSION_KEY = "user";// preHandle 预处理@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 检查 sessionHttpSession session = request.getSession();if (session.getAttribute(SESSION_KEY) != null) return true;// 重定向到登录页面request.setAttribute("message","登录失败,请先输入用户名和密码。");request.getRequestDispatcher("login").forward(request,response);return false;}// postHandle 善后处理@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) {System.out.println("INTERCEPTOR POSTHANDLE CALLED");}}Copy to clipboardErrorCopied

过滤器类通过继承 Filter 类实现,直接添加注解即可。

@Component                                                                // 作为组件,交给容器处理
@ServletComponentScan                                                     // 扫描组件
@WebFilter(urlPatterns = "/login/*",filterName = "loginFilter")           // 设定过滤路径和名称
@Order(1)                                                                 // 设定优先级(值小会优先执行)
public class LoginFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 过滤器前执行System.out.println("before");// 执行内部逻辑filterChain.doFilter(servletRequest,servletResponse);// 过滤器后执行System.out.println("after");}@Overridepublic void destroy() {}
}Copy to clipboardErrorCopied

调用顺序

filter


Spring Boot配置HTTPS

####生成SSL证书

https://www.cnblogs.com/benwu/articles/4891758.html

JDK提供证书管理工具: JDK\bin\keytool.exe

Tomcat使用Java提供的密码库,通过Java的Keytool工具生成JKS等格式的证书文件。 Apache使用OpenSSL提供的密码库,生成PEM、KEY、CRT等格式的证书文件。

cmd命令(JDK\bin目录打开)

密钥库: 保存密钥和对应的证书。【证书只含有公钥】

genkeypair 生成密钥对(非对称加密算法) genseckey 生成密钥(对称加密算法) 创建名为tomcat的密钥对以及自签名的证书,放入mykeystore密钥库中(不存在则创建) keytool -genkeypair -alias "tomcat" -keyalg "RSA" -validity 180 -keypass "123456" -keystore "D:\mykeystore.keystore" -storetype PKCS12 -storepass

  • alias 证书别名
  • keyalg 加密算法,生成密钥对默认RSA
  • keysize 密钥键长,RSA默认2048
  • validity 证书有效期,默认90
  • keypass 证书密码
  • keystore 密钥库路径,默认创建在用户目录下
  • storetype 密钥库类型,默认JKS
  • storepass 密钥库密码

查看密钥库 keytool -list -v -alias tomcat -keystore "D:\mykeystore.keystore" -storepass 123456

将生成的证书文件拷贝到项目resources目录下

####修改全局配置文件

application.properties格式

server.port = 8443
server.ssl.key-store = classpath:mykeystore.keystore
server.ssl.key-store-password = 123456
server.ssl.keyStoreType = PKCS12
server.ssl.keyAlias = tomcatCopy to clipboardErrorCopied

设置SSL后,默认使用HTTPS协议。访问localhost:8443,会出现证书安全提示,强行进入即可。 【未付费注册,不被数字认证机构CA认可:会被浏览器标记为不安全】

如果将服务器端口号设置成443端口,即https的默认访问端口,那么在进行https访问的时候可以不带端口号直接访问。

修改入口文件

如果访问http://localhost:8443,则提示需要TLS。

》》将http连接自动转换为https连接

@Configuration
public class TestSslApplication {//servlet容器,自己写的bean会覆盖自动配置的bean?@Beanpublic ServletWebServerFactory servletContainer() {TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();tomcat.addAdditionalTomcatConnectors(createStandardConnector());return tomcat;}// 新建connecter监听80端口,并重定向至8443private Connector createStandardConnector() {Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");connector.setScheme("http");connector.setPort(80);connector.setSecure(false);connector.setRedirectPort(8443);return connector;}}
Copy to clipboardErrorCopied

重新配置Servlet容器(Tomcat)

自动配置类ServletWebServerFactoryAutoConfiguration会读取bean

https://www.jianshu.com/p/017a7f40efff

相关文章:

JavaEE-Spring Controller(服务器控制以及Controller的实现和配置)

Spring Controller 服务器控制 响应架构 Spring Boot 内集成了 Tomcat 服务器,也可以外接 Tomcat 服务器。通过控制层接收浏览器的 URL 请求进行操作并返回数据。 底层和浏览器的信息交互仍旧由 servlet 完成,服务器整体架构如下: Server&…...

页面导出PDF,非可视区域如何解决

const exportToPDF () > {const element document.getElementById(chart-container);if (!element) return;const originalScrollHeight element.scrollHeight;// 临时解除滚动条限制,确保所有内容都可见element.style.height ${originalScrollHeight}px;// …...

Android UI:ViewTree: 监听

文章目录 涉及设计模式 ​​​​​​​​​​​​​​观察者模式+策略模式API源码分析总结涉及设计模式 观察者模式+策略模式 被观察者:ViewTree ViewTree持有一个观察器ViewTreeObserver 系统在ViewRootImpl和View的相关方法中调用ViewTreeObserver上的注册的监听器的方法,…...

【光伏干货】光伏无人机巡检步骤

随着光伏产业的迅速发展和无人机技术的日益成熟,光伏无人机巡检已成为提高光伏电站运维效率、降低运维成本的重要手段。本文将详细介绍光伏无人机巡检的步骤,帮助读者更好地理解和应用这一技术。 一、前期准备 1、设备检查:对无人机及其相关…...

『大模型笔记』从头开始代码构建GPT!

从头开始代码构建GPT! 文章目录 一. 从头开始代码构建GPT!二. 参考文献一. 从头开始代码构建GPT! 我们构建了一个生成式预训练Transformer (GPT),遵循论文《Attention is All You Need》和OpenAI的GPT-2 / GPT-3的方法。我们讨论了与ChatGPT的联系,ChatGPT已经风靡全球。我…...

idea的project structure下project [lauguage ]()level 没有java的sdk17选项如何导入

idea的project structure下project lauguage level 没有java的sdk17选项如何导入 别导入了,需要升级idea版本。idea中没有project language level没有17如何添加 - CSDN文库 别听这文章瞎扯淡 2021版本就是没有,直接卸载升级到最新版本就可以了。没办法…...

JavaScript数据类型与转换

JavaScript是一种弱类型语言,在定义变量的时候不用规定数据的类型,但这部表示JavaScript没有规定数据类型。 数值 JavaScript中数值类型不区分浮点数与整数,所有的数值都以浮点型来表示。另外JavaScript核心,Math还提供了大量的…...

三十、openlayers官网示例解析Double click, Drag and Zoom——第二次点击鼠标拖拽缩放地图效果、取消地图双击放大事件

这篇展示了如何在地图上添加第二次按下鼠标移动鼠标实现拖拽缩放地图效果。 官网demo地址: Double click, Drag and Zoom 官网介绍文字的翻译如下: 示例比较简单,直接贴代码: const map new Map({//添加第二次点击拖拽缩放地图i…...

前端基础入门三大核心之网络安全篇:TLS/SSL的魔法之旅

前端基础入门三大核心之网络安全篇:TLS/SSL的魔法之旅 TLS/SSL:数据安全的守护神工作原理:四步走,安全到家1. 握手,你好吗?代码示例(伪代码):客户端发起握手请求 2. 身份…...

Flutter 中的 SnackBarAction 小部件:全面指南

Flutter 中的 SnackBarAction 小部件:全面指南 在 Flutter 中,SnackBar 是一种流行的用于提供轻量级反馈的方式,它可以在屏幕上短暂显示消息。SnackBarAction 则是与 SnackBar 结合使用的一种按钮组件,允许用户对显示的消息做出响…...

Point-Nerf 理论笔记和理解

文章目录 什么是point nerf 和Nerf 有什么区别Point Nerf 核心结构有哪些?什么是point-based radiance field? 点云位置以及置信度是怎么来Point pruning 和 Point Growing 什么是point nerf 和Nerf 有什么区别 基本的nerf 是通过过拟合MLP来完成任意视角场景的重…...

深度学习中的梯度消失和梯度爆炸问题

在深度学习领域,随着模型层数的增加,我们常常会遇到两个棘手的问题:梯度消失(Vanishing Gradients)和梯度爆炸(Exploding Gradients)。这两个问题严重影响了深度神经网络的训练效率和性能。本文…...

Flink 通过 paimon 关联维表,内存降为原来的1/4

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…...

Python知识详解【1】~{正则表达式}

正则表达式是一种用于匹配字符串模式的文本工具,它由一系列普通字符和特殊字符组成,可以非常灵活地描述和处理字符串。以下是正则表达式的一些基本组成部分及其功能: 普通字符:大多数字母和数字在正则表达式中表示它们自己。例如…...

装饰模式:鸡腿堡

文章目录 UML类图目录结构Humburger.javaChickenBurger.javaCondiment.javaChuilli.javaLettuce.javaTest.java深度理解test怎么写 UML类图 目录结构 我们从指向最多的开始写 Humburger.java package zsms;public abstract class Humburger {protected String name;public S…...

视图【mysql数据库】

目录 一、视图的创建、查看、修改、删除 二、cascaded、local检查选项 cascaded和local的区别 三、视图的更新 四、视图的作用 一、视图的创建、查看、修改、删除 二、cascaded、local检查选项 上面的几句SQL中,我们虽然给视图插入了id 30的数据,但…...

opencv的findContours()函数

来自WaTab AI Pro 请详细解释cv2.findContours(): cv2.findContours() 是 OpenCV 中用于检测图像轮廓的函数。轮廓可以看作是将连续的点(沿边界)连接在一起的一条曲线,具有相同的颜色或强度。该函数常用于图像处理和计算机视觉中…...

多电压档hold扫尾

MMMC下STA收敛更为困难,setup通过DMSA可以很好的得到收敛;但是常规的时序修复工具很难通过工具得到最终clean的时序状态,本文介绍一种多模多角下hold的收敛方法。 该方法主要通过遍历hold路径上多电压setup的余量,支持从前往后和从…...

ABAP Json解析案例

ABAP解析返回的JSON 案例 DATA:LTOKEN TYPE STRING.DATA: LL_LINES(10),"行数LL_TABIX(10),"循环标号LL_PECNT TYPE P LENGTH 6 DECIMALS 2, "百分比LL_PECET(6),"百分数LL_TEXT(40)."消息CLEAR: LL_LINES,LL_TABIX,LL_PECNT,LL_PECET,LL_TEXT.* …...

QT学习(20):QStyle和自定义样式

QStyle 样式(继承自QStyle类)代表控件的绘制并封装GUI的外观。QStyle是一个封装了GUI外观的抽象基类。Qt使用QStyle去执行几乎所有的内置控件的绘制,确保控件外观和原生控件风格风格相同。 class Q_WIDGETS_EXPORT QStyle : public QObject{…...

香橙派 AIpro 昇腾 Ascend C++ 分类模型适配

香橙派 AIpro 昇腾 Ascend C 分类模型适配 flyfish 文章目录 香橙派 AIpro 昇腾 Ascend C 分类模型适配前言一、PyTorch官网resnet模型处理方式1、PyTorch模型 导出 onnx格式2、完整测试 输出top1结果3、完整测试 输出top5结果 二、YOLOv8官网resnet模型Python处理方式三、昇腾…...

2024吉林省电赛(达盛杯)

1. 电赛F4系统板3D图 提起自制STM32F407VET6系统板 2. 电赛原理图 3. 电赛PCB图 4. 智能车实物图 下图是电赛的实物图,结构采用3D打印 5. 软件设计 下图是程序设计图 6. 仿真视频 (1) 变化高度 2024吉林省电赛仿真1 (2) 变化轮距 2024电赛仿真2 7. APP控制小车 …...

【算法题】520 钻石争霸赛 2024 全解析

都是自己写的代码,发现自己的问题是做题速度还是不够快 520-1 爱之恒久远 在 520 这个特殊的日子里,请你直接在屏幕上输出:Forever and always。 输入格式: 本题没有输入。 输出格式: 在一行中输出 Forever and always…...

Yii 结合MPDF 给PDF文件添加多行水印

首先确保安装了mpdf扩展 composer require mpdf/mpdf public function createWaterPdf($file_path,$water_text){date_default_timezone_set(PRC);ini_set(memory_limit, 6400M);ini_set(max_execution_time, 0);try{$mpdf new Mpdf();$pageCount $mpdf->SetSourceFile…...

你什么时候感觉学明白Java了?

学是学不明白Java的,要学明白Java,一定只能在工作以后。 1 在学习阶段,哪怕是借鉴别人的学习路线,其实依然会学很多不必要的技能,比如jsp,swing,或者多线程,或者设计模式。 2 或者…...

马斯克xAI融资60亿美元,宣布打造世界第一超算中心,10万张H100GPU

昨天,埃隆马斯克的xAI初创公司宣布获得60亿美元的巨额融资,主要用于打造一台巨大的超级计算机,马斯克称之为“超级计算工厂”。 从创立OpenAI到如今的xAI,技术和算力的发展历经了几个时代,但似乎马斯克的吸金能力一直…...

贪心算法[1]

首先用最最最经典的部分背包问题来引入贪心的思想。 由题意可知我们需要挑选出价值最大的物品放入背包&#xff0c;价值即单位价值。 我们需要计算出每一堆金币中单位价值。金币的属性涉及两个特征&#xff0c;重量和价值。 所以我们使用结构体。 上代码。 #include <i…...

卢文岩博士受邀参与中国科学院大学校友论坛 解码DPU核心价值

近日&#xff0c;第五届中国科学院大学校友创新论坛正式举行&#xff0c;本次论坛聚焦科技前沿领域&#xff0c;旨在搭建高端对话平台&#xff0c;促进产学研深度融合。在大算力时代——AI技术前沿沙龙上&#xff0c;中科驭数高级副总裁、CTO卢文岩博士受邀分享《DPU——连接算…...

2024年上半年软件设计师试题及答案(回忆版)

目录 基础知识选择题案例题1.缺陷识别的数据流图2.球队、球员、比赛记录的数据库题3.用户、老师、学生、课程用例图4.算法题5.程序设计题基础知识选择题 树的节点,度为4的有4个,度为3的有8个,度为2个有6个,度为1的有10个,问有几个叶子结点 二位数组,一个元素2个字节,A0…...

QGIS使用python代码导出给定坐标图片

代码基于https://blog.csdn.net/x572722344/article/details/108121230进行修改&#xff0c;代码在QGIS内部编译器运行 # -*- coding: utf-8 -*- from osgeo import ogr# 像素[高, 宽] px_geosize [2.645859085290482, 2.6458015267176016]# 待裁剪影像的坐标范围[min_x, min…...