SpringMVC常用注解用法

news2025/5/30 23:58:44

Spring MVC是基于Servlet API构建的原始Web框架。

MVC是Model View Controller的缩写即视图模型控制器,是一种思想,而Spring MVC是对该思想的具体实现。关于SpringMVC的学习我们需要掌握用户和程序的连接、获取参数以及返回数据三大部分。而这三大功能的实现离不开注解,所以这里对这三个过程进行说明,同时对在此过程中用到的注解进行总结。

文章目录

    • 一、连接过程
      • @RequestMapping
        • 1.作用
        • 2.基本用法
        • 3.@RequestMapping支持的请求连接类型验证
        • 4.接口特定请求类型设置方法
          • 1)使用@PostMapping注解
          • 2)设置@RestMapping,并设置method属性
    • 二、获取参数过程
      • 1.1.获取单个参数
        • 补充
      • 1.1.获取多个参数
      • @RequestParam用法
      • 2.获取普通对象
      • 3.获取JSON对象——使用@RequestBody接收
      • 4.从基础的URL中获取参数(非参数位置而是path位置)——使用@PathVariable注解
      • 5.获取上传文件——使用@RequestPart注解
      • 6.获取Cookie——使用@CookieValue注解
      • 7.获取Header——使用RequestHeader注解
      • 8.获取Session——使用@SessionAttribute注解
        • session的存储(没用注解)
        • session的获取
    • 三、返回数据过程
      • 1.返回静态页面(默认类型|不加RestContrlloer或@ResponseBody)
      • 2.返回非静态页面数据——加@ResponsBody注解
      • 3.返回跳转/链接【forwardVSredirect】

一、连接过程

Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射 即浏览器连接程序。

连接成功的效果:访问注册的地址能打印出我们预想的信息。

示例:

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller//类注解
@ResponseBody//返回text/html
@RequestMapping("/user")//一级路由注册
public class UserController {
    @RequestMapping("/sayhi")//二级路由注册
    public String sayHi(){
        return "hi";
    }
}

启动后访问对应的url地址:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R76xvCo4-1684133790632)(F:\typora插图\image-20230509174308882.png)]

接下来详细介绍@RequestMapping用法

@RequestMapping

它是spring web应用程序中最常被用到的注解之一。

1.作用

作用:注册接口的路由映射。路由映射是指用户访问一个url,将用户的请求对应到应用程序中某个方法的过程。

2.基本用法

它可以修饰类也可以修饰方法。

  • 修饰类和方法时,修饰的地址时类+方法。参考上边的例子

  • 直接修饰方法:

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @ResponseBody
    public class UserController2 {
        @RequestMapping("/user2/sayhi")//二级路由注册
        public String sayHi(){
            return "hi";
        }
    }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KXwwm0eG-1684133790633)(F:\typora插图\image-20230509174947501.png)]

注意:无论是@Controller还是@ResponseBody都不可省略

原因如下:

  1. 这个类必须随着spring的加载而加载,别人才能通过注册的路由访问到它。

  2. @ResponseBody用来修饰类或者方法。修饰类时类中所有的方法都返回html或者json,而不是视图。如果时字符会转换成tex/html,如果是对象,会转换成applicaiton/json返回给前端。

  3. 另外这两个注解还可以替换成@RestContrlloer,@RestContrlloer=@ResponseBody+@@Controller。他是一个组合注解

3.@RequestMapping支持的请求连接类型验证

是支持所有的还是支持特定的请求,下边我们进行验证。

首先,它默认支持的肯定是get请求,因为我们在浏览器上输入url地址敲下回车,其实就是get,我们可以通过抓包来验证:

(使用刚刚的sayhi方法)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TvgPS3ut-1684133790634)(F:\typora插图\image-20230510083437983.png)]

其次,它也支持post请求,我们可以通过postman+抓包进行验证:

在测试post请求之前,我们先再做一次get:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKnpnIgM-1684133790634)(F:\typora插图\image-20230510083828235.png)]

POST:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BywJaCzX-1684133790634)(F:\typora插图\image-20230510083924708.png)](https://img-blog.csdnimg.cn/4f56e8460bf54cc1913d2f67b4a29857.png)

显然,可以得出RequestMapping也是支持post请求的。

最后,我们也可以实验别的请求,发现它也是可以支持的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GtODoJ7N-1684133790635)(F:\typora插图\image-20230510084130752.png)]

这里不再一一演示。

4.接口特定请求类型设置方法

当领导一刀切,要求必须只支持某一种方法,怎么设置:

通过查看源码(结合注释)及官网,我们可以知道一共有两种设置方法,这里我们使用post请求为例:

1)使用@PostMapping注解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pDsBqyat-1684133790635)(F:\typora插图\image-20230510085737181.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2s0vJkUB-1684133790636)(F:\typora插图\image-20230510085856981.png)]

抓包验证:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWg8EGBr-1684133790636)(F:\typora插图\image-20230510085938273.png)]

与之类似的,对应的get方法有@GetMapping注解

2)设置@RestMapping,并设置method属性

看@RestMapping源码我们可以知道,它有一个属性叫做method,类型是枚举数组,而枚举的值恰巧是请求的方法类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCjWoEZ3-1684133790636)(F:\typora插图\image-20230510085015006.png)]

补充:

1.很容易知道,value和name意思是一样的

2.consume和produces是用来进行路由筛选的,一个用于设置只有特定请求才能访问到,一个用于只能返回特定类型的数据,用的比较少,了解即可。

这样,我们就可以将其设置成post

@RestController//=@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/sayhi")
    public String sayHi(){
        
        return "hi";
    }
    @RequestMapping(value = "/sayhi2",method = RequestMethod.POST)
    public String sayHi2(){
        
        return "hi";
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QcEqd1ke-1684133790637)(F:\typora插图\image-20230510085437563.png)\

另外,我们也可以通过抓到的包看显示请求类型是否是Post来验证:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FwvxO54i-1684133790637)(F:\typora插图\image-20230510085522476.png)]

很容易看出来是的,所以这种设置方法可行。

二、获取参数过程

获取参数,需要我们后端代码这里有接受的容器,其实也就是我们方法的设置上要有形参,所以获取参数的问题其实也就是形参的设置。

1.1.获取单个参数

我们之前怎么传形参,这里其实就怎么传。

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

//@Controller//类注解
//@ResponseBody//返回非视图
@RestController//=@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/gp")
    public String getParam(String name){
        return name;
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFZGCZS9-1684133790637)(F:\typora插图\image-20230510091210832.png)]

注意:

  1. 拿到单个参数前提是形参和传的参数名一定要相同

  2. 不传参数,返回的是默认值.所以推荐参数传递时不要使用基础类型数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-avwGzrjp-1684133790638)(F:\typora插图\image-20230510091342982.png)]

    那么这里其实就涉及到一个基础类型和非基础类默认值的问题了,对于基础类型,不传参数会直接报错,对于非基础类型不传参数返回的是null(引用类型默认值是null)

    验证:

    package com.example.demo.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    
    //@Controller//类注解
    //@ResponseBody//返回非视图
    @RestController//=@Controller+@ResponseBody
    @RequestMapping("/user")
    public class UserController {
        @RequestMapping("/gp")
        public String getParam(String name){
            return name;
        }
        @RequestMapping("/gp1")
        public String getParam(Integer id){
            return ""+id;
        }
        @RequestMapping("/gp2")
        public String getParam(int id){
            return ""+id;
        }
    }
    

​						[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ThAdcnar-1684133790638)(F:\typora插图\image-20230510092629693.png)]

补充

内置隐藏参数:request和reponse对象【了解】

当项目启动时,spring mvc会自动帮我们把请求和相应对象赋值给他们

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2pjgdTD-1684133790638)(F:\typora插图\image-20230510093000953.png)]

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@RestController//=@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/gp3")
    public String getParam(HttpServletRequest request,HttpServletResponse response) throws IOException {
        response.sendRedirect("http://www.javacn.site");
        return "hi";
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5MPScqQT-1684133790639)(F:\typora插图\image-20230510093556576.png)]

1.1.获取多个参数

@RequestMapping("/gp4")
public String getParam(String name,String password) {
    return name+":"+password;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7UCpWWmf-1684133790639)(F:\typora插图\image-20230510093842159.png)]

注意:1. 当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的顺序是不影响后端获取参数的结果

@RequestParam用法

特殊情况下,前端传递参数和后端接收参数名不同,可以使用@RequestParam重命名前后端参数值,完成后端参数映射。

使用方法:

@RequestParam(前端参数名) xxx xxx(后端参数名)

@RequestMapping("/gp5")
public String getParam5(@RequestParam("username") String name) {
    return name;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRpNGR1Q-1684133790639)(F:\typora插图\image-20230510094541196.png)]

除了上述基本用法,它还可以完成必传参数和非必传参数的设置:

我们可以看以下它的源码,他是通过required这个字段来完成这个功能的。当required值为true时,不传此参数就会报错400错误;当它为false时,不传也没有关系。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-507nFuG3-1684133790640)(F:\typora插图\image-20230510095021228.png)]

默认情况下,参数既然有是必须传递的。

说明:使用这个注解是一种特殊的场景,即前后端参数不一致时,它不是一种获取参数的类型。

2.获取普通对象

传递方式和多个参数一样,顺序不重要,但是名称必须写对,如果传的参数不对或者名字传错了,就会返回默认值。

因为框架会通过名称帮我们完成了自动参数映射,并且根据返回的结果,帮助我们返回恰当的封装对象。

package com.example.demo.entity;

import lombok.Data;

@Data
public class UserInfo {
    private int id;
    private String name;
    private String password;
    private int age;
}
//获取对象
@RequestMapping("/reg")
public Object getParam9(UserInfo userInfo){
    return userInfo;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yW3QdYY3-1684133790640)(F:\typora插图\image-20230510140852203.png)]

通过抓包我们可以看出来,这里是返回了json对象:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kCyJAxC2-1684133790640)(F:\typora插图\image-20230510141204446.png)]

再比如,我们使用h1标签,那么框架就会返回html形式的结果:

//返回结果
@RequestMapping("/reg1")
public Object reg1(UserInfo userInfo){
    return "<h1>userInfo</h1>";
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OwTuM9k6-1684133790641)(F:\typora插图\image-20230510141449417.png)]

两种方式:①使用传递多个参数的形式②把表单封装成一个对象,使用对象去获取。框架帮助自动映射。

3.获取JSON对象——使用@RequestBody接收

不加注解获取不到:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wwE8133-1684133790641)(F:\typora插图\image-20230510220351669.png)]

//获取json对象(通过请求体获取json对象)
@RequestMapping("/reg2")
public Object reg2(@RequestBody UserInfo userInfo){
    return userInfo;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ytskkNE6-1684133790641)(F:\typora插图\image-20230510220614933.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vK5JsVYl-1684133790642)(F:\typora插图\image-20230510220653541.png)]

4.从基础的URL中获取参数(非参数位置而是path位置)——使用@PathVariable注解

//从基础的url中获取参数
//花括号里填的变量的名字,注意这里对位置是敏感的
@RequestMapping("/reg3/{name}/{pwd}")
public Object reg3(@PathVariable String name,@PathVariable(required = false,name = "pwd") String password){
    return name+":"+password;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YayaWH5-1684133790642)(F:\typora插图\image-20230510221548416.png)]

注意:1. 对位置敏感

  1. 使用频率不高,但也有自己的应用场景。例如详情页
  2. 注解中name支持重命名,required支持可不传递参数注解位置不同
  3. @PathVariable和@RequestParam使用:前者是获取?之前的参数,后者是获取?之后的参数,具体看参数约定、公司要求和业务场景。

5.获取上传文件——使用@RequestPart注解

这个还是比较常用的,比如上传头像:

//获取上传文件
@RequestMapping("/myupload")
public Object upload(@RequestPart("myimage")MultipartFile file){
    File saveFile=new File("F://test//myimage.png");
    try {
        file.transferTo(saveFile);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

这里使用postman去模拟

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J2HfK3M3-1684133790642)(F:\typora插图\image-20230511075059553.png)]

注意:

  1. 这里的参数必须使用MultipartFile类型接收。因为他里边有transfer方法,可以直接把上传过来的文件流保存为图片。
  2. 如果文件太大了,可能上传失败,需要在配置文件中重新配置最大文件大小,max-file-size,具体配置项看官方配置文件。
  3. @RequestPart中的参数传的

但是这个代码存在一个问题,是不能上生产线的——后面上传的文件会覆盖前边上传的。

解决思路:文件的名称不能重复——使用Java里边的UUID(通用唯一id)。他是时间戳+随机数+电脑的mac地址+随机种子。文件格式可能会不同,所以还需要得到原生的后缀名。

这里使用file的获取文件名的方法然后使用substring获得后缀。

//获取上传文件(可以上生产线的代码)
@RequestMapping("/myupload2")
public Object upload2(@RequestPart("test")MultipartFile file){
    String fileName= UUID.randomUUID()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
    File saveFile=new File("F://test//"+fileName);
    try {
        file.transferTo(saveFile);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mUHpLFOL-1684133790643)(F:\typora插图\image-20230511080555774.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7AFfYKme-1684133790643)(F:\typora插图\image-20230511080909278.png)]

补充:目录和文件名都不写死:

//获取文件3:目录和文件名都不写死
public Object upload3(@RequestPart("test")MultipartFile file) throws IOException {
    String contextName=new ClassPathResource("").getFile().getAbsolutePath();
    String fileName= UUID.randomUUID()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
    File saveFile=new File(contextName+fileName);
    try {
        file.transferTo(saveFile);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o1Hu6ijw-1684133790643)(F:\typora插图\image-20230511082212232.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XqM4M23D-1684133790643)(F:\typora插图\image-20230511082137617.png)]

6.获取Cookie——使用@CookieValue注解

获取方式:①使用之前servlet方式(有隐藏参数之前已经提到)②使用注解,比较简洁。这里使用第二种

这里注解的参数有两个值,其中value取决于我们cookie里边的值,这里前端可能没有传递,所以我们这里required设置成false

//获取cookie
@RequestMapping("/getck")
public Object getck(@CookieValue(value = "java",required = false)String java){
    return java;
}

这里因为前端没有传递过来有java的cookie,所以我们这里伪造一个cookie。伪造方法:在浏览器界面f12,点击cookie:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vd2UNBgV-1684133790644)(F:\typora插图\image-20230511084015134.png)]

7.获取Header——使用RequestHeader注解

也有两种方式:①使用request对象②使用注解

代码示例:获取host

//获取Header
@RequestMapping("gethd")
public Object getHeader(@RequestHeader("Host")String ht){
    return ht;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qTSLkUR8-1684133790644)(F:\typora插图\image-20230511084324333.png)]

可以看到这个注解的参数里边还是有前端的名字

8.获取Session——使用@SessionAttribute注解

要获取session我们必须先存

session的存储(没用注解)

存储方式还是之前servlet的方式

private static final String SESSION_KEY="USERINFO_SESSIONKEY";
@RequestMapping("setsess")
public void setsess(HttpServletRequest request) {
    HttpSession session = request.getSession(true);
    if(session!=null){
        session.setAttribute(SESSION_KEY,"zhangsan");
    }
}

session的获取

使用注解@SessionAttribute

//获取Session
@RequestMapping("getsess")
public Object getSession(@SessionAttribute(SESSION_KEY)String name){
    return "session:"+name;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U5hFzD8Y-1684133790644)(F:\typora插图\image-20230511090321950.png)]

系统项的配置

三、返回数据过程

1.返回静态页面(默认类型|不加RestContrlloer或@ResponseBody)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0VEnYsGu-1684133790645)(F:\typora插图\image-20230511091520268.png)]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>返回参数测试</h1>
</body>
</html>
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("test")
public class TestController {
    @RequestMapping("/index")
    public Object getIndex(){
        return "/index.html";
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lp32ZjRj-1684133790645)(F:\typora插图\image-20230511092320887.png)]

注意:加斜杠表示从根目录访问,不加表示在当前路径寻找。

路径问题可以通过抓包访问

默认请求转发

2.返回非静态页面数据——加@ResponsBody注解

可能是json对象或者其他,框架会自动进行映射。这里以json对象为例

//返回json对象
@RequestMapping("/reg2")
public Object reg2(@RequestBody UserInfo userInfo){
    return userInfo;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mA5FRpBe-1684133790645)(F:\typora插图\image-20230510220614933.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qI0Oz1jd-1684133790645)(F:\typora插图\image-20230510220653541.png)]

3.返回跳转/链接【forwardVSredirect】

用的不多,但主要看业务需求。

请求转发(forward)和请求重定向(redirect)是常见面试题

这部分跟注解关系不大,但是面试却很重要,所以单独总结。

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

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

相关文章

2023-5-15-gRpc框架学习

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

前端魔力赏盲盒小程序 UI原生盲盒微信小程序源码下载

前端魔力赏盲盒小程序 UI原生盲盒微信小程序源码下载 亲测可用 前端是小程序原生源码。 很不错的一款盲盒小程序。 完全没有毛病&#xff0c;非常适合研究学习。

【Linux】匿名管道

目录 匿名管道管道特点父子进程通过匿名管道通信匿名管道通信案例 橙色 匿名管道 管道也叫无名&#xff08;匿名&#xff09;管道&#xff0c;是 UNIX 系统 IPC&#xff08;进程间通信&#xff09; 的最古老的形式。 统计一个目录中文件的数目命令 ls | wc -l &#xff0c;为…

会自动化就能拿20K?想多了,你这顶多算是会点皮毛···

现在招个会自动化测试的人是真难呀~ 前一段时间公司计划要招2个自动化测试到岗&#xff0c;同事面试了十几个来应聘的人&#xff0c;发现一个很奇怪的现象&#xff0c;在面试的时候&#xff0c;如果问的是框架API、脚本编写这些问题&#xff0c;基本上所有人都能对答如流&…

湖北省智能科教研究会走进璞华,调研璞公英教学平台个性化教学新模式

2023年5月9日&#xff0c;热烈祝贺湖北省智能科教研究会红5月智能科教走进璞华集团活动圆满成功。会议上&#xff0c;大家畅所欲言&#xff0c;对教育体制改革与教育信息化产品创新&#xff0c;科技成果转化、产教融合、资源互补、学生能力培养等方面展开充分沟通和探讨。 5月9…

解密 Android IPC 机制

在我们使用 Android 手机的时候&#xff0c;有时我们使用的软件会需要消耗比较大的内存&#xff0c;也经常会需要同时打开多个软件。这些时候&#xff0c;我们都会需要使用到多进程技术。作为 Android 开发者&#xff0c;相信我们都知道如何去开启应用的单个多进程&#xff0c;…

【Linux常见指令以及权限理解】权限理解(4)

写在前面 这篇文章&#xff0c;我们来聊一聊Linux下权限相关的知识&#xff0c;我打算从这几个方面展开&#xff1a; 1. 认识Linux下用户的分类 2. 什么叫做权限 3. 没有权限会是什么样子 4. 如何修改权限 5. 其它重要的问题 那么废话不多说&#xff0c;我们现在开始。 …

PDF怎么转换成Word?将PDF转换为Word的三种方法!

在我们需要将PDF文件转换为Word文件时&#xff0c;有几种方法可以选择。通常&#xff0c;我们在文件传输过程中使用的文件格式是PDF&#xff0c;但如果我们需要对文件进行编辑&#xff0c;就需要将其转换为可编辑的Word格式。下面是几种转换方法的介绍&#xff0c;让我们一起来…

【Python从入门到进阶】Python异常处理

接上篇《18、文件内容序列化和反序列化操作》 上一篇我们学习了文件读取及写入数据序列化和反序列化的操作。本篇我们来学习Python中有关异常&#xff08;捕获异常、处理异常等&#xff09;的知识。 一、异常的定义 在编写代码时&#xff0c;我们无法完全掌控程序运行过程中会…

原神服务端建模修改模型贴图(SpecialK)教程

原神服务端建模修改模型贴图(SpecialK)教程 我是艾西&#xff0c;今天跟大家闲聊一下原神建模修改模型等。在一个游戏里开发者会按照自己这个游戏的大方向去运营&#xff0c;而总是有一些小伙伴有不一样的需求&#xff0c;如果是建模拥有独一无二的角色或者是外观装扮等那么艾…

多系统启动U盘Ventory下载、安装、使用

官网链接 Ventoy Ventoy 简介 简单来说&#xff0c;Ventoy是一个制作可启动U盘的开源工具。 有了Ventoy你就无需反复地格式化U盘&#xff0c;你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的文件直接拷贝到U盘里面就可以启动了&#xff0c;无需其他操作。 你可以一次性拷贝很多个…

OpenCL编程指南-4.4矢量操作符

矢量操作符 如下描述了可用于矢量数据类型或矢量和标量数据类型组合的各类操作符。 算术操作符 算术操作符&#xff08;加&#xff08;)、减&#xff08;–)、乘&#xff08;*&#xff09;和除&#xff08;/)&#xff09;&#xff0c;可以作用于内置整数、浮点标量和矢量数…

次郎家书——第一天关于数值计算方法考试后——的一些思考和反思

考试的复盘&#xff1a;传送门&#xff1a;数值计算方法考试复盘 对此次考试的看法&#xff1a; 这次考试考试内容虽然有没复习到的如复合辛普森和复合梯形公式还有最小二乘的推广(这里上课的时候听懂了但是复习的时候嫌麻烦没看原来&#xff0c;结果大题是真的写错了&#…

nuxt 一直报错 http://localhost:24678/_nuxt/

解决&#xff1a; 这个错误可能是由于Nuxt.js应用程序无法正确加载/_nuxt/路径下的资源而导致的。解决这个问题的方法有以下几种&#xff1a; 1.检查nuxt.config.js文件 在nuxt.config.js文件中&#xff0c;检查build.publicPath属性是否设置为正确的公共路径。例如&#xff1a…

UART驱动情景分析-read

一、源码框架回顾 shell读数据&#xff0c;一开始的时候没有就休眠。数据从串口发送到驱动&#xff0c;驱动接收到中断&#xff0c;驱动读取串口数据&#xff0c;这个数据会传给行规程。 行规程获取到数据后&#xff0c;会回显。按下删除就删除一个字符&#xff0c;按下回车&am…

pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍

文章目录 1. 测量时间的方式2. model.eval(), model.train(), torch.no_grad()方法介绍2.1 model.train()和model.eval()2.2 model.eval()和torch.no_grad() 3. 模型推理时间方式4. 一个完整的测试模型推理时间的代码5. 参考&#xff1a; 1. 测量时间的方式 time.time() time.…

使用qt creator编译zlib

zlib被设计为一个免费的&#xff0c;通用的&#xff0c;法律上不受限制的-即不受任何专利保护的无损数据压缩库&#xff0c;几乎可以在任何计算机硬件和操作系统上使用。 官网&#xff1a;http://www.zlib.net/ 下载zlib源码:http://www.zlib.net/zlib1213.zip 备用地址&#x…

关于使用API接口获取商品数据的那些事

随着电商行业的不断发展&#xff0c;越来越多的企业和个人需要获取各大电商平台上的商品数据。而最常用的方法是使用API接口获取商品数据。本文将为您介绍使用API接口获取商品数据的步骤和注意事项。 一、选择API接口 首先需要了解各大电商平台提供的API接口&#xff0c;目前…

由浅入深理解java集合(一)——集合框架 Collection、Map

Java 提供了一套完整的集合类&#xff08;也可以叫做容器类&#xff09;来管理一组长度可变的对象&#xff08;也就是集合的元素&#xff09;&#xff0c;其中常见的类型包括 List、Set、Queue 和 Map。从我个人的编程经验来看&#xff0c;List 的实现类 ArrayList 和 Map 的实…

华为OD机试 - 查找树中元素(Python)

题目描述 已知树形结构的所有节点信息,现要求根据输入坐标(x,y)找到该节点保存的内容值,其中x表示节点所在的层数,根节点位于第0层,根节点的子节点位于第1层,依次类推;y表示节点在该层内的相对偏移,从左至右,第一个节点偏移0,第二个节点偏移1,依次类推; 举例:…