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类
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内容
<!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类
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
<!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类
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类
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类
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)
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接口
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类
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值
10.@Configuration,@ConfigurationProperties和@Bean
@Configuration:声明一个类为配置类,代替xml文件
@ConfigurationProperties:该注解可以将springboot的配置文件(默认必须为application.properties或application.yml)中的配置项读取到一个对象中
格式:
@ConfigurationProperties(prefix="xxx")
prefix表示配置项的前缀
@Bean:声明在方法上,将方法的返回值加入Bean容器,代替<bean>标签
11.@value和@PropertySource
@value:属性注入
@PropertySource:指定外部属性文件
(项目完整包,可见资源绑定里,如有问题,可在评论区留言)