springboot之常用注解(全网最详细,保姆教程,一步一步教你操作)

1.准备环境

创建一个springboot项目

参考:idea2023创建spring boot项目,并在本地运行起来(最详细保姆教程)-CSDN博客

(根据自己的jdk版本选择,创建项目的时候也可用默认的maven)

本人是创建了空项目,并在空项目创建了boot3-03-demo

步骤可参考Spingboot3详解(全网最详细,新建springboot项目并详解各种组件的用法)-CSDN博客

2.@Controller和@RequestMapping

@Controller寻找的是页面

注意:如果resources下没有templates文件夹,就自己创建一个,该文件夹存放html文件

如果resources下的static文件夹下有html文件,就删了,static不要存放html文件

(1)创建controller包(com.example.boot303demo下),再在下面创建ViewController类

(2)再src/main/resources/templates下创建一个html文件view.html

(如果view.html放在static文件夹下,访问网址可能会报错)

ViewController类

java 复制代码
package com.example.boot303demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * 描述:controller注解相关的测试
 * @description
 * @author: Admin
 * @create: 2023/12/9 10:26
 */
@Controller
public class ViewController {
    @RequestMapping("view")  //url访问链接:http://localhost:8080/view
//    @RequestMapping("/view/list")  //url访问链接:http://localhost:8080/view/list
    public String view(){
        return "view.html";
    }
}

view.html内容

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>视图页面</title>
</head>
<body>
<div>我的页面</div>
</body>
</html>

运行主类Boot303DemoApplication.java后,再网页上访问http://localhost:8080/view

如果说你把ViewController中的return返回改成return "view";

重启主类,访问网址,不会报错

因为application.properties配置文件的配置

3.@RequestParam

(1)再controller包中创建一个ParamController类

(2)再src/main/resources/templates下创建一个html文件param.html

ParamController类

java 复制代码
package com.example.boot303demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * 描述:参数相关的测试(问号后面的参数)
 * @description
 * @author: Admin
 * @create: 2023/12/9 13:03
 */
@Controller
public class ParamController {
    @RequestMapping("/param")
    //url的链接:http://localhost:8080/param?id=100(id后面的数值可任意编写)
    public String param(@RequestParam("id") int id){
        return "param";
    }
}

param.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>你已经跳转到一个param.html的界面</div>
</body>
</html>

运行主类,访问网址:http://localhost:8080/param?id=100

考虑一个问题:再访问网址时,如果后面不跟id会怎么样(直接报错)

解决方法:

键盘按着Ctrl键点击@RequestParam,会跳转到一个新的类,如下图

再ParamController类中修改代码

重新运行主类,再访问 http://localhost:8080/param

如下图就不会再报错了

4.@RestController和@GetMapping

@RestController不会去找页面,会把返回的内容直接在浏览器中显示

再controller包下创建一个RestFullController类

RestFullController类

java 复制代码
package com.example.boot303demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 描述:测试RestController相关注解
 * @description
 * @author: Admin
 * @create: 2023/12/9 14:01
 */
@RestController
@RequestMapping("rest")
public class RestFullController {
    @GetMapping("get")  //url的链接:http://localhost:8080/rest/get
    public String get(){
        return "我在这里么!";
    }
}

运行主类,输入网址:http://localhost:8080/rest/get

思考:如果想返回的是一个类,应该怎么做?

方法:

(1)在包中(com/example/boot303demo)新建一个entity包,再在entity包下新建一个User类

User类

java 复制代码
package com.example.boot303demo.entity;

/**
 * 描述:用户
 * @description
 * @author: Admin
 * @create: 2023/12/9 14:43
 */
public class User {
    int id;
    String name;
    String Sex;
    int age;
    //无参构造方法
    public User() {
    }
    //有参构造方法
    public User(int id, String name, String sex, int age) {
        this.id = id;
        this.name = name;
        Sex = sex;
        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 String getSex() {
        return Sex;
    }
    public void setSex(String sex) {
        Sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", Sex='" + Sex + '\'' +
                ", age=" + age +
                '}';
    }
}

RestFullController类修改

重新运行主类,输入网址访问:http://localhost:8080/rest/get

5.@PostMapping和@DeleteMapping

(1)再RestFullController中添加一个新的方法post()

@RequestBody的用法是:如果我们需要前端把一个对象封装成json格式传给后端接收要用 @RequestBody

注意:@PostMapping注释,再接口中是Post方法,不能在浏览器中访问,要不然会直接报错

如下图

想验证的话,可用接口测试工具(Postman)

如下图所示,则代表成功

思考:如果说@GetMapping和 PostMapping的后面不加路径(这样的话,路径就会一样),那么他返回的内容会不会冲突

试验:

修改RestFullController类

java 复制代码
package com.example.boot303demo.controller;
import com.example.boot303demo.entity.User;
import org.springframework.web.bind.annotation.*;
/**
 * 描述:测试RestController相关注解
 * @description
 * @author: Admin
 * @create: 2023/12/9 14:01
 */
@RestController
@RequestMapping("rest")
public class RestFullController {
    /**
     * 查询数据
     * @return
     */
    @GetMapping  //url的链接:http://localhost:8080/rest
    public User get(){
        User user=new User(1,"张三","男",20);
        return user;
    }
    /**
     * 增加数据
     */
    @PostMapping //url的链接:http://localhost:8080/rest
    public User post(@RequestBody User user){
        System.out.println("新增的user:"+user);
        return user;
    }
}

用Postman

@PostMapping就相当于是Post方法

@GetMapping就相当于是Get方法

结论: @GetMapping和 PostMapping的后面不加路径,那么他返回的内容不会冲突

(这两个注解就相当于给他们提供了方法)

@PutMapping和@DeleteMapping同理,就不举例了

6.@ResponseBody与@CrossOrigin

(1)再ParamController.java类中新增一个方法,如下

重新运行主类,访问网址:http://localhost:8080/param/user

由此可知:@RestController与@Controller+@ResponseBody是等价的

@RestController=@Controller+@ResponseBody

(所以如果只写一个@Controller,不加@ResponseBody的话,访问该网址http://localhost:8080/param/user,就会报错,因为他会去找网址,找不到就报错)

@RequestBody的用法是:如果我们需要前端把一个对象封装成json格式传给后端接收要用 @RequestBody(例子看第5点中的RestFullController类)

@CrossOrigin是解决跨域问题的

7.@Service和@Autowired

|------------|--------|
| 注解 | 备注 |
| @Service | bean注册 |
| @Autowired | 获取bean |

(1)再com.example.boot303demo包下创建一个Service包

(2)再Service包下创建impl包和UserService接口

(3)再impl包下创建一个UserserviceImpl类

(4)把controller中的RestFullController复制粘贴到相同的目录下,名字换成RestFullActionController

RestFullActionController类(此时是不需要new)

java 复制代码
package com.example.boot303demo.controller;
import com.example.boot303demo.entity.User;
import com.example.boot303demo.service.UserService;
import com.example.boot303demo.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 描述:测试RestController相关注解
 * @description
 * @author: Admin
 * @create: 2023/12/9 14:01
 */
@RestController
@RequestMapping("action")
public class RestFullActieonController {
    @Autowired
    private UserService userService;
    @GetMapping  //url的链接:http://localhost:8080/action
    public User get(){
        return userService.get();
    }

}

userService接口

java 复制代码
package com.example.boot303demo.service;

import com.example.boot303demo.entity.User;
/**
 * @description
 * @author: Admin
 * @create: 2023/12/11 13:33
 */
public interface UserService {
    public User get();
}

userServiceImpl类

java 复制代码
package com.example.boot303demo.service.impl;
import com.example.boot303demo.entity.User;
import com.example.boot303demo.service.UserService;
import org.springframework.stereotype.Service;
/**
 * 描述:用户服务--核心逻辑
 * @description
 * @author: Admin
 * @create: 2023/12/11 13:34
 */
@Service
public class UserServiceImpl implements UserService {
    public User get(){
        User user=new User(1,"张三","男",20);
        System.out.println("UserServiceImpl user:"+user);
        return user;
    }
}

运行主类,访问网址:http://localhost:8080/action

8.@Component

|------------|--------|
| 注解 | 备注 |
| @Component | 注册bean |

复制代码
修改UserServiceImpl类,把@Service换成@Component即可

重新启动主类,访问网址:http://localhost:8080/action

9.@Atuowired,@Resource以及区别

|-----------|--------|
| 注解 | 备注 |
| @Resource | 获取bean |

复制代码
修改RestFullActieonController中的@Atuowired为@Resource,重启主类即可运行

@Atuowired和@Resource的区别

@Resource=@Atuowired+@Qualifier

如果接口实现只有一个,那么用@Atuowired就可以了,也不需要指定名字。

如果接口实现有多个,那么,用@Resource,并指定name(建议)

或者使用@Atuowired+@Qualifier+Qualifier的value值

(项目完整包,可见资源绑定里,如有问题,可在评论区留言)

相关推荐
Dola_Pan26 分钟前
Linux文件IO(二)-文件操作使用详解
java·linux·服务器
wang_book28 分钟前
Gitlab学习(007 gitlab项目操作)
java·运维·git·学习·spring·gitlab
蜗牛^^O^1 小时前
Docker和K8S
java·docker·kubernetes
从心归零2 小时前
sshj使用代理连接服务器
java·服务器·sshj
一个诺诺前行的后端程序员2 小时前
springcloud微服务实战<1>
spring·spring cloud·微服务
IT毕设梦工厂3 小时前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
Ylucius3 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
七夜zippoe4 小时前
分布式系统实战经验
java·分布式
是梦终空4 小时前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
落落落sss4 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle