[Spring] SpringMVC 简介(三)
目录
九、SpringMVC 中的 AJAX 请求
1、简单示例
2、@RequestBody(重点关注“赋值形式”)
3、@ResponseBody(经常用)
4、为什么不用手动接收 JSON 字符串、转换 JSON 字符串
5、@RestController
十、文件上传与下载
1、ResponseEntity
2、文件下载
3、文件上传
4、解决文件重名导致内容覆盖的问题
十一、拦截器
1、拦截器的三个方法
2、拦截器的简单示例
3、拦截器的配置方法
4、多个拦截器的执行顺序
5、preHandle 返回 false 的情况
十二、控制器方法异常处理
1、异常处理解析器
2、使用 xml 配置
3、显示域对象的数据
4、使用注解配置
九、SpringMVC 中的 AJAX 请求
Ajax 请求的前端发送有很多种方式,可以使用 Vue,也可以使用 JQuery。
1、简单示例
下面是一个服务器获取请求头中的信息,并响应一个字符串的简单 Ajax 示例。
(1)index.html
使用 Ajax 请求传递两个请求参数,并接收服务器端的响应数据,格式为 text。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title><script type="text/javascript" th:src="@{/static/js/JQuery-3.7.0.js}"></script><script type="text/javascript">$(function() {$("#ajaxButton").click(function() {$.ajax({url:"/Demo_Rest/testAjax",data: { // 在请求头"username": "admin","password": "123456",},type: "get",dataType: "text",success: function(data) {alert(data);}});});});</script>
</head>
<body><h1>index 页面</h1><input id="ajaxButton" type="button" value="发起 ajax 请求"/>
</body>
</html>
(2)java 代码
注意,因为 Ajax 请求是做局部更新,因此不需要进行转发,也不需要重定向,返回类型是用 void 即可。
@RequestMapping(value = "/testAjax")
public void testAjax(String username, String password, HttpServletResponse resp) throws IOException {System.out.println("username: " + username + ", password: " + password);resp.getWriter().write("testAjax");return;
}
2、@RequestBody(重点关注“赋值形式”)
@RequestBody 可以获取请求体,在控制器方法设置一个形参,使用 @RequestBody 进行标识,当前请求的请求体就会为当前注解所标识的形参赋值。
需要注意的是,使用了 @RequestBody 后,Ajax 就要发送 POST 请求,而不能发送 GET 请求。可见:https://juejin.cn/post/7222833868503236667
(1)导入依赖 jackson
Spring 默认的 json 解析器就是 jackson,其实没必要导入,但是可以写上。
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.2</version>
</dependency>
(2)@RequestBody 的赋值形式
当 @RequestBody 修饰一个方法参数时,会将所有的请求参数都赋值给方法参数。什么意思呢?
假设请求体中的请求参数为 username : "admin", password : "123456", age : 12:
- 若方法参数为 @RequestBody String user:
- 若方法参数为 @RequestBody User user:
- 若方法参数为 @RequestBody Map<String, Object> map:
关于 @RequestBody 与 @RequestParam 的区别 以及 是否添加 @RequestBody 注解,这两个问题也很重要。
可以参考:https://blog.csdn.net/weixin_43606226/article/details/106545024
(3)使用注意
仅对使用 JQuery 的情况而言,其他方法(比如:vue)不需要注意。
当我们传递 JSON 格式的数据时:
- 需要添加 contentType: "application/json";
- 需要使用 JSON.stringify(data);
<script type="text/javascript">$(function() {$("#ajaxButton").click(function() {var user = {username: "admin",password: "123456",age: 12,};$.ajax({url:"/Demo_Rest/testAjax",data: JSON.stringify(user),contentType: "application/json",type: "post",dataType: "text", /* 返回数据类型 */success: function(data) {alert(data);}});});});
</script>
3、@ResponseBody(经常用)
@ResponseBody 用于标识一个控制器方法,可以将该方法的返回值(String、实体类)直接作为响应体响应到浏览器。
一般情况下,就是将一个 JSON 格式的 json 字符串,响应到客户端,再由客户端浏览器将其解析成 json 对象。而使用了 @ResponseBody 和 @RequestBody 之后,就不是这样的了,具体后面解释。
(1)返回普通字符串的情况
@RequestMapping(value = "/testResponseBody")
@ResponseBody
public String responseBody() {return "success";
}
访问 /testResponseBody,那么就会出现如下结果:
而这显然不是我们之前所编写的 success.html 页面,而仅仅是一个字符串数据。
(2)返回实体类的情况
将 user 的信息发送给服务器,服务器修改 username 后,响应新的 user 信息。
(2-1)index.html
<script type="text/javascript">$(function() {$("#ajaxButton").click(function() {var user = {username: "admin",password: "123456",age: 12,};$.ajax({url:"/Demo_Rest/testResponseBody",data: JSON.stringify(user),contentType: "application/json",type: "post",dataType: "json", /* 返回数据类型 */success: function(data) {alert(data.username);}});});});
</script>
(2-2)Java 代码
@RequestMapping(value = "/testResponseBody")
@ResponseBody
public User responseBody(@RequestBody User user) {System.out.println(user);user.setUsername("wyt");return user;
}
(3)常见的 Java 对象转换为 Json 之后的类型
- 实体类:Json 对象;
- Map:Json 对象;
- List:Json 数组;
4、为什么不用手动接收 JSON 字符串、转换 JSON 字符串
在 SpringMVC 的核心配置文件中开启 mvc 的注解驱动:
<mvc:annotation-driven/>
此时在 HandlerAdaptor 中会自动装配一个消息转换器:MappingJackson2HttpMessageConverter,它是由 JackSon 这个 JSON 解析器提供的,其作用有:
- 既可以将浏览器传递的请求参数构成的 JSON 字符串转换为 JSON 对象
- 也可以将响应到浏览器的 Java 对象转换为 JSON 格式的字符串
5、@RestController
实际开发中,@ResponseBody 使用的情况非常多,而我们只需要给控制类写上一个 @RestController,就可以同时起到 @Controller 和 @ResponseBody 的作用。
十、文件上传与下载
文件上传与下载的方式有很多,不一定要用 ResponseEntity 这种方法。
1、ResponseEntity
ResponseEntity 是一个类型,用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。
有关文件上传与下载的步骤,可以查看:https://blog.csdn.net/joyride_run/article/details/132814877
2、文件下载
在此最奉上喜欢的图片(R-C.jpg):
(1)Java 代码
@RequestMapping(value = "/fileDownload", method = RequestMethod.GET)
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {// 1.获取要下载的文件名String downloadFilename = "R-C.jpg";// 2.获取ServletContext对象ServletContext servletContext = session.getServletContext();// 3.获取服务器中文件的真实路径String realPath = servletContext.getRealPath("/static/img/" + downloadFilename);// 4.创建输入流InputStream inputStream = new FileInputStream(realPath);// 5.创建字节数组int count = 0;while (count == 0) count = inputStream.available();// 防止数据未送达,导致count=0,但是本地读文件一般不会有这种错误byte[] bytes = new byte[count];// 6.将流读到字节数组中inputStream.read(bytes);// 7.创建HttpHeaders对象设置响应头信息MultiValueMap<String, String> headers = new HttpHeaders();headers.add("Content-Disposition", "attachment;filename=" + downloadFilename);// 8.设置响应状态码HttpStatus statusCode = HttpStatus.OK;// 9.创建ResponseEntity对象ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);// 10.关闭输入流inputStream.close();return responseEntity;
}
(2)index.html
<a th:href="@{/fileDownload}">下载R-C.jpg文件</a>
(3)效果
3、文件上传
(1)如何获取上传的文件信息
- SpringMVC 将上传的文件封装到 MultipartFile 对象中,通过此对象可以获取文件相关信息
- 使用 MultipartFile 对象需要配置文件上传解析器
- 使用 MultipartFile 对象需要引入依赖 commons-fileupload
由于 MultipartResolver 是一个接口,我们需要配置它的实现类 CommonsMulitipartResolver。
<!-- 配置文件上传解析器id 必须为 multipartResolver
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.5</version>
</dependency>
(2)输出文件名
- 使用 MultipartFile 的类方法 getOriginalFilename(),可以获取上传文件的文件名。
(2-1)Java 代码
@RequestMapping(value = "/fileUpload", method = RequestMethod.POST)
public String upload(MultipartFile multipartFile) {String filename = multipartFile.getOriginalFilename();System.out.println(filename);return "success";
}
(2-2)index.html
- 这里有一个很重要的点,就是表单上传文件的 name 的属性值必须要与 MultipartFile 的参数名相同。
<form th:action="@{/fileUpload}" method="post" enctype="multipart/form-data">头像:<input type="file" name="multipartFile"/> <br/><input type="submit" value="上传"/>
</form>
(3)保存文件
- 保存文件使用 SpringMVC 封装的 transferTo() 方法,则不需要再使用 IO 流进行持久化存储;
- 因为我们不知道目录之间的分隔符是 / 还是 \,所以可以使用 File.separator;
@RequestMapping(value = "/fileUpload", method = RequestMethod.POST)
public String upload(MultipartFile multipartFile, HttpSession session) throws IOException {// 1.获取上传的文件名String filename = multipartFile.getOriginalFilename();// 2.获取文件保存的路径ServletContext servletContext = session.getServletContext();String dir = servletContext.getRealPath("/static/img/upload");// 3.创建文件对象File file = new File(dir);if (!file.exists()) {file.mkdirs(); // mkdir 只能创建下一级目录}// 4.保存文件String savePath = dir + File.separator + filename;System.out.println(savePath);multipartFile.transferTo(new File(savePath));return "success";
}
4、解决文件重名导致内容覆盖的问题
解决方法:
- 使用时间戳;
- 使用 UUID;
(1)使用 UUID
String filename = multipartFile.getOriginalFilename();
String extensionName = filename.substring(filename.lastIndexOf("."));
filename = UUID.randomUUID().toString() + extensionName;
十一、拦截器
SpringMVC 中的拦截器用于拦截控制器方法的执行。作用类似于 Filter,但不是完全相同。
默认情况下,未指定对哪些资源进行拦截,则会拦截所有交给 DispatcherServlet 的请求,比如:对 index 的访问,对 controller 的访问。
1、拦截器的三个方法
SpringMVC 中的拦截器有三个抽象方法:
- preHandle:控制器方法执行之前执行,其返回值表示对控制器方法的放行(true)或拦截(false);
- postHandle:控制器方法执行之后执行;
- afterComplation:处理完视图和模型数据,渲染视图完毕之后执行;
2、拦截器的简单示例
SpringMVC 中的拦截器需要实现 HandlerInterceptor,并且在 SpringMVC 的配置文件中进行配置:
(1)SpringMVC 配置文件
- 由 SpringMVC 加载,不需要写 id
<!-- 配置拦截器 -->
<mvc:interceptors><bean class="com.demo.interceptor.FirstInterceptor"></bean>
</mvc:interceptors>
(2)FirstInterceptor.java
- 重写三个方法,其中 preHandle 的返回 false
package com.demo.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class FirstInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("FirstInterceptor -- preHandle");return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("FirstInterceptor -- postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("FirstInterceptor -- afterCompletion");}
}
(3)运行结果
访问 index.html,观察页面响应结果和控制台输出:
- 首页无法访问,以及如下输出
3、拦截器的配置方法
(1)直接嵌套 <bean> 标签
- 在 SpringMVC 的配置文件中直接写上:
<mvc:interceptors><bean class="com.demo.interceptor.FirstInterceptor"></bean>
</mvc:interceptors>
(2)链接外部 <bean>
- <ref> 链接 <mvc:interceptors> 外部的 <bean>
<bean id="firstInterceptor" class="com.demo.interceptor.FirstInterceptor"/>
<!-- 配置拦截器 -->
<mvc:interceptors><ref bean="firstInterceptor"/>
</mvc:interceptors>
(3)扫描注解方式
- 在 FirstInterceptor 上添加 @Component,然后直接 <ref>
@Component(value = "firstInterceptor")
public class FirstInterceptor implements HandlerInterceptor {}
<mvc:interceptors><ref bean="firstInterceptor"/>
</mvc:interceptors>
(4)<mvc:interceptor>
它有两个重要的属性:
- mvc:mapping path ="":表示需要拦截的请求;
- mvc:exclude-mapping path="":表示不需要拦截的请求;
- <ref> 和 <bean> 要写在这两个属性之后;
设置了这两个请求之后,就会按照设置的内容进行拦截,而不是去拦截 DispatcherServlet。
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/*"/><mvc:exclude-mapping path="/static"/><ref bean="firstInterceptor"/></mvc:interceptor>
</mvc:interceptors>
还需要注意,path = " /* ",表示的是,拦截 / 后的一层目录的请求,也就是说 /abc/* 这类请求是无法拦截的。
想要拦截对所有资源的请求,又要求使用 mvc:mapping,那么可以写 path = " /** "。
4、多个拦截器的执行顺序
我们设置两个拦截器:FirstInterceptor、SecondInterceptor。将他们的 preHandler 都设置为放行(true)。
(1)在 SpringMVC 中作如下顺序
- 先配置 FirstInterceptor,后配置 SecondInterceptor。
<mvc:interceptors><ref bean="firstInterceptor"/><ref bean="secondInterceptor"/>
</mvc:interceptors>
(2)访问 index.html,观察输出
显然可以看出,执行 preHandle() 方法,是按照配置顺序来执行;执行另外 2 个方法,是按照配置的逆序来执行。
5、preHandle 返回 false 的情况
当拦截器 C 的 preHandle() 返回了 false:
- C 以及 C 之前的拦截器的 preHandle() 都会执行;
- 所有的 postHandle() 都不执行;
- C 之前的拦截器的 afterComplation() 都会执行;
十二、控制器方法异常处理
1、异常处理解析器
对于异常处理解析器,我们可以配置,也可以不配置,SpringMVC 已经默认使用了解析器。
- SpringMVC 提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver。
- HandlerExceptionResolver 接口的实现类有:DefaultHandlerExceptionResolver(SpringMVC 默认使用)和 SimpleMappingExceptionResolver(用户自定义使用)。
在他们的底层实现中,会返回一个 ModelAndView,这代表着我们可以利用 Model 将错误信息保存到 Request 域,还可以利用 View 进行页面跳转。比如:跳转至 error404.html 页面,并显示错误信息。
2、使用 xml 配置
(1)Java 代码
- 手动添加一个 1 / 0 的异常。
@RequestMapping(value = "/testException")
public String testException() {int i = 1 / 0;return "success";
}
(2)index.html 以及 error666.html
- 访问控制器方法
<body><a th:href="@{/testException}">测试异常处理</a>
</body>
- 展示异常页面
<body><h1>error666 页面</h1>
</body>
(3)配置异常解析器的 View
- prop 的 key 表示处理器方法执行过程中出现的异常;
- prop的 value 表示若出现指定异常时,设置一个逻辑视图,跳转到指定页面;
<!-- 配置异常解析器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="java.lang.ArithmeticException">error666</prop><!--.... 其他异常--></props></property>
</bean>
(4)运行结果
- 由于 1 / 0 出现了异常,因此没有转发到 success.html 页面,而是来到了 error666.html 页面。
3、显示域对象的数据
刚才的示例中,只有 View 的功能,现在我们要添加 Model 的功能。
<property> 除了前面的 exceptionMappings,还有一个 exceptionAttribute,他们就是分别表示 View 和 Model:
- 通过 exceptionAttribute 的 value 设置一个域数据的属性名,、即可通过这个属性名访问异常信息。
(1)SpringMVC 配置文件
- 添加了 <property name="exceptionAttribute" value="exceptionInfo"/>
<!-- 配置异常解析器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="java.lang.ArithmeticException">error666</prop><!--.... 其他异常--></props></property><property name="exceptionAttribute" value="exceptionInfo"/></bean>
(2)error666.html
- 获取域对象,显示异常信息
<body><h1>error666 页面</h1><p th:text="${exceptionInfo}"></p>
</body>
(3)输出结果
4、使用注解配置
(1)@ControllerAdvice
- @ControllerAdvice 将当前类标识为异常处理的 Controller。
(2)@ExceptionHandler
- @ExceptionHandler 有一个 value 属性,需要继承自 Throwable 的异常类的 Class 数组作为属性值,其中传入我们需要处理的异常类的 class 属性。
(3)返回值
- 如果使用 String,那么返回值可以设置成错误页面的逻辑视图;
- 如果使用 ModelAndView,就使用 setView 方法设置逻辑视图;
(4)Controller
- 产生一个 math 异常
@RequestMapping(value = "/testException")
public String testException() {int i = 1 / 0;return "success";
}
(5)ExceptionHandler
- 由于 Controller 有 math 方面的异常,因此用 ArithmeticException
@ControllerAdvice
public class ExceptionController {@ExceptionHandler(value = {ArithmeticException.class})public String handleException(Model model, Throwable exception) {model.addAttribute("exceptionInfo", exception);return "error666";}
}
(6)运行结果
相关文章:
[Spring] SpringMVC 简介(三)
目录 九、SpringMVC 中的 AJAX 请求 1、简单示例 2、RequestBody(重点关注“赋值形式”) 3、ResponseBody(经常用) 4、为什么不用手动接收 JSON 字符串、转换 JSON 字符串 5、RestController 十、文件上传与下载 1、Respo…...
kettle应用-从数据库抽取数据到excel
本文介绍使用kettle从postgresql数据库中抽取数据到excel中。 首先,启动kettle 如果kettle部署在windows系统,双击运行spoon.bat或者在命令行运行spoon.bat 如果kettle部署在linux系统,需要执行如下命令启动 chmod x spoon.sh nohup ./sp…...
Git Commit Message规范
概述 Git commit message规范是一种良好的实践,可以帮助开发团队更好地理解和维护代码库的历史记录。它可以提高代码质量、可读性和可维护性。下面是一种常见的Git commit message规范,通常被称为"Conventional Commits"规范: 一…...
Linux网络编程系列之UDP广播
Linux网络编程系列 (够吃,管饱) 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…...
spring中事务相关面试题(自用)
1 什么是spring事务 Spring事务管理的实现原理是基于AOP(面向切面编程)和代理模式。Spring提供了两种主要的方式来管理事务:编程式事务管理和声明式事务管理。 声明式事务管理: Spring的声明式事务管理是通过使用注解或XML配置来…...
09 | JpaSpecificationExecutor 解决了哪些问题
QueryByExampleExecutor用法 QueryByExampleExecutor(QBE)是一种用户友好的查询技术,具有简单的接口,它允许动态查询创建,并且不需要编写包含字段名称的查询。 下面是一个 UML 图,你可以看到 QueryByExam…...
Linux命令(93)之su
linux命令之su 1.su介绍 linux命令su用于变更为其它使用者的身份,如root用户外,需要输入使用者的密码 2.su用法 su [参数] user su参数 参数说明-c <command>执行指定的命令,然后切换回原用户-切换到目标用户的环境变量 3.实例 3…...
1.HTML-HTML解决中文乱码问题
题记 下面是html文件解决中文乱码的方法 方法一 在 HTML 文件的 <head> 标签中添加 <meta charset"UTF-8">,确保文件以 UTF-8 编码保存 <head> <meta charset"UTF-8"> <!-- 其他标签和内容 --> </head> --…...
Vue3 + Nodejs 实战 ,文件上传项目--实现拖拽上传
目录 1.拖拽上传的剖析 input的file默认拖动 让其他的盒子成为拖拽对象 2.处理文件的上传 处理数据 上传文件的函数 兼顾点击事件 渲染已处理过的文件 测试效果 3.总结 博客主页:専心_前端,javascript,mysql-CSDN博客 系列专栏:vue3nodejs 实战-…...
Windows:VS Code IDE安装ESP-IDF【保姆级】
物联网开发学习笔记——目录索引 参考: VS Code官网:Visual Studio Code - Code Editing. Redefined 乐鑫官网:ESP-IDF 编程指南 - ESP32 VSCode ESP-ID Extension Install 一、前提条件 Visual Studio Code IDE安装ESP-IDF扩展…...
Hadoop3教程(十一):MapReduce的详细工作流程
文章目录 (94)MR工作流程Map阶段Reduce阶段 参考文献 (94)MR工作流程 本小节将展示一下整个MapReduce的全工作流程。 Map阶段 首先是Map阶段: 首先,我们有一个待处理文本文件的集合; 客户端…...
测试中Android与IOS分别关注的点
目录 1、自身不同点 2、测试注重点 3、其他测试点 主要从本身系统的不同点、系统造成的不同点、和注意的测试点做总结 1、自身不同点 研发商:Adroid是google公司做的手机系统,IOS是苹果公司做的手机系统 开源程度:Android是开源的&a…...
NLG(自然语言生成)评估指标介绍
诸神缄默不语-个人CSDN博文目录 本文介绍自然语言生成任务中的各种评估指标。 因为我是之前做文本摘要才接触到这一部分内容的,所以本文也是文本摘要中心。 持续更新。 文章目录 1. 常用术语2. ROUGE (Recall Oriented Understudy for Gisting Evaluation)1. 计算…...
苍穹外卖(七) Spring Task 完成订单状态定时处理
Spring Task 完成订单状态定时处理, 如处理支付超时订单 Spring Task介绍 Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 应用场景: 信用卡每月还款提醒 火车票售票系统处理未支付订单 入职纪念日为用户发送通知 点外…...
【探索Linux】—— 强大的命令行工具 P.11(基础IO,文件操作)
阅读导航 前言一、C语言的文件操作二、C的文件操作三、Linux系统文件操作(I/O接口)1. open()⭕传入多个打开方式(按位或操作将不同的标志位组合在一起) 2. write()3. read()4. close()5. lseek() 温馨提示 前言 前面我们讲了C语言…...
前端练习项目(附带页面psd图片及react源代码)
一、前言 相信很多学完前端的小伙伴都想找个前端项目练练手,检测自己的学习成果。但是现在很多项目市面上都烂大街了。今天给大家推荐一个全新的项目——电子校园 项目位置:https://github.com/v5201314/eSchool 二、项目介绍(部分页面展示)ÿ…...
【从零开始学习Redis | 第三篇】在Java中操作Redis
前言: 本文算是一期番外,介绍一下如何在Java中使用Reids ,而其实基于Java我们有很多的开源框架可以用来操作redis,而我们今天选择介绍的是其中比较常用的一款:Spring Data Redis 目录 前言: Spring Data…...
vim、gcc/g++、make/Makefile、yum、gdb
vim、gcc/g、make/Makefile、yum、gdb 一、Linux编辑器vim1、简介2、三种模式的概念(1)正常/普通/命令模式(Normal mode)(2)插入模式(Insert mode)(3)末行/底行模式(last line mode) 3、三种模式的切换4、正…...
2022最新版-李宏毅机器学习深度学习课程-P13 局部最小值与鞍点
一、优化失败的原因 局部最小值?鞍点? 二、数学推导分析 用泰勒公式展开 一项与梯度(L的一阶导)有关,一项与海赛矩阵(L的二阶导)有关 海瑟矩阵 VTHV通过海瑟矩阵的性质可以转为判断H是否是正…...
ARM架构的基本知识
ARM两种授权 体系结构授权, 一种硬件规范, 用来约定指令集, 芯片内部体系结构(内存管理, 高速缓存管理), 只约定每一条指令的格式, 行为规范, 参数, 客户根据这个规范自行设计与之兼容的处理器处理IP授权, ARM公司根据某个版本的体系结构设计处理器, 再把处理器设计方案授权给…...
网络安全(黑客技术)——如何高效自学
前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学?如何学? 今天给大家分享一下,很多人上来就说想学习黑客,…...
云原生场景下高可用架构的最佳实践
作者:刘佳旭(花名:佳旭),阿里云容器服务技术专家 引言 随着云原生技术的快速发展以及在企业 IT 领域的深入应用,云原生场景下的高可用架构,对于企业服务的可用性、稳定性、安全性越发重要。通…...
图论-最短路径算法-弗洛伊德算法与迪杰斯特拉算法
弗洛伊德算法: 弗洛伊德算法本质是动态规划,通过添加点进如可选择的点组成的集合的同时更新所有点之间的距离,从而得到每两个点之间的最短距离。 初始化: 创建一个二维数组 dist,其中 dist[i][j] 表示从节点 i 到节点…...
[23] IPDreamer: Appearance-Controllable 3D Object Generation with Image Prompts
pdf Text-to-3D任务中,对3D模型外观的控制不强,本文提出IPDreamer来解决该问题。在NeRF Training阶段,IPDreamer根据文本用ControlNet生成参考图,并将参考图作为Zero 1-to-3的控制条件,用基于Zero 1-to-3的SDS损失生成…...
深入理解React中的useEffect钩子函数
引言: React是一种流行的JavaScript库,它通过组件化和声明式编程的方式简化了前端开发。在React中,一个核心概念是组件的生命周期,其中包含了许多钩子函数,用于管理组件的不同阶段。其中之一就是useEffect钩子函数&…...
数字化时代的财务管理:挑战与机遇
导语:随着数字化技术的不断发展,财务管理正面临着前所未有的挑战和机遇。数字化不仅改变了财务数据的收集、处理和分析方式,还为财务决策提供了更多的依据和方向。本文将探讨数字化时代财务管理的新特点,以及如何利用数字化技术提…...
网络通信协议-HTTP、WebSocket、MQTT的比较与应用
在今天的数字化世界中,各种通信协议起着关键的作用,以确保信息的传递和交换。HTTP、WebSocket 和 MQTT 是三种常用的网络通信协议,它们各自适用于不同的应用场景。本文将比较这三种协议,并探讨它们的主要应用领域。 HTTPÿ…...
【深度学习】深度学习实验四——循环神经网络(RNN)、dataloader、长短期记忆网络(LSTM)、门控循环单元(GRU)、超参数对比
一、实验内容 实验内容包含要进行什么实验,实验的目的是什么,实验用到的算法及其原理的简单介绍。 1.1 循环神经网络 (1)理解序列数据处理方法,补全面向对象编程中的缺失代码,并使用torch自带数据工具将数据封装为dataloader。 (2)分别采用手动方式以及调用接口方式…...
DB2分区表详解
一、分区表基本概念 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。分区后的表称为分区表。 表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个“表空间”(物理文件上),这样查询数据时…...
基本地址变换机构
基本地址变换机构:用于实现逻辑地址到物理地址转换的一组硬件机构。 关于页号页表的定义,放个本人的传送门 1.页表寄存器 基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。 1.作用 通常会在系统中设置一个页表寄存器(PTR&…...
自己的电脑做网站服务器吗/晋中网络推广
我们将通过实验详细分析 instance 从 nova-api-metadata 获取信息的完整过程。 环境介绍 1. 一个 all-in-one 环境(多节点类似)。 2. 已创建 neutron 网络 test_net,DHCP 已启动。在这个 metadata 实验中, test_net 的 type 不重要…...
有源码后怎么做网站/什么是指数基金
原标题:这是MySQL的bug吗?我们在实际业务场景中,经常会有一个这样的需求,插入某条记录,如果已经存在了则更新它如果更新日期或者某些列上的累加操作等,我们肯定会想到使用INSERT ... ON DUPLICATE KEY UPDA…...
ps里怎么做网站/百度百家号
Mac电脑用的时间久了,Mac用户尤其是MacBook用户会经常收到“磁盘几乎已满”的提示,如何解决这个问题,这里分享几个处理磁盘空间不足提示的小方法。 方法一、清理Mac电脑的缓存文件 一般电脑里都会堆积很多的缓存文件,其实缓存文件…...
做网站的害处/百度统计代码安装位置
【斗蟹攻略】Navicat 为 MySQL、Oracle、PostgreSQL、SQL Server 和 MariaDB 提供安全性管理工具。用户可以新建、编辑、删除用户、授予或撤消已选择的数据库及它们数据库对象的权限。点击“用户”图标可打开用户对象列表,用户对象列表将显示服务器中的所有用户。下…...
网站建设与栏目设置/小程序开发平台官网
1、模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like;对于like %...%(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低;另外&#…...
iis网站伪静态/谷歌google
这是免费系列教程《7天学会商业智能(BI)-Tableau》的第5天,前面我们介绍了如何用Tableau对数据建模?,今天介绍如何用Tableau可视化数据。你将学会:如何可视化数据?如何创建筛选器?如何绘制地图?…...