SpringBoot+SpringMVC常用注解

文章目录

发展历程

SpringBoot环节:主力,要掌握,熟练使用

发展历程:

之后同一期出现的三种:

SSH1:

servlet+jsp,这是初级阶段。mvc三层架构。m:model,v:view,c:controller

struct 1.0 起初解决mvc 扩展名为.do的网站

spring 1.0:专注于帮程序员创建对象(程序员new对象容易失控)。单例对象(只创建一次对象就行了,属性类没有必要重复使用)

hibernate 1.0 :orm关系映射。将数据库中的结果集转换为Java对象,无需自己写sql。

之后发展:

SSH2:

struct 2.0 .action扩展名

spring 2.0 加入aop功能,面向切面功能

mybaits:orm 轻量级,需要程序员自己写sql

hibernate 2.0+

SSM:需要使用xml配置

springMVC:解决MVC,替代struct2.0。容易

Spring 3.0+ 增加更多功能,模块化

mybaits 3.0+ 替代hibernate

微服务:把一个大项目拆分成小的项目,然后根据需要进行整合。(例如:微信上面的小程序)规模小。

SprigBoot:不是一个框架。是一个快速开发脚手架。快速开发,在一定程度上限制了自由性。有固定的目录结构,有约定俗成的配置。约定大于配置(配置越少越好,快速开发)。SpringBoot用于整合SSM。

项目创建


项目创建完成后首先检查编码,配置maven

项目结构

xml配置文件说明:

以spring-boot-starter开头的包,叫启动器。对项目进行自动化配置。

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.4.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.situ</groupId>
    <artifactId>demo01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo01</name>
    <description>demo01</description>

    <properties>
        <java.version>21</java.version>
    </properties>

    <dependencies>
    <!--        thymeleaf启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
<!--        SpingMVC启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

<!--        单元测试启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

入门案例

根包。所有的自己写的java部分写在根包下:约定大于配置

主启动类。

在类上面加上Controller表示这个类是一个控制器类。

在方法上加上GetMapping注解表示这个方法可以接收请求,指定请求的路径。

如果方法上面不加GetMapping注解表示这个方法就是普通方法。

java 复制代码
package com.situ.controller;


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

@Controller//表明这是一个控制器类
public class HelloWorldController {
    
    @GetMapping("/hello")//方法的路径
    public String hello(){
        System.out.println("hello");
        return "hello";
    }
}
html 复制代码
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<p>你好</p>

</body>
</html>

启动:

配置文件的两种方式:只能使用一种

创建项目二

创建的时候加入:

以spring-boot-starter开头的包,叫启动器。对项目进行自动化配置。

xml 复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

入门案例

根包。所有的自己写的java部分写在根包下:约定大于配置

主启动类。

在类上面加上Controller表示这个类是一个控制器类。

在方法上加上GetMapping注解表示这个方法可以接收请求,指定请求的路径。

如果方法上面不加GetMapping注解表示这个方法就是普通方法。

list.html:

html 复制代码
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>学生信息列表页面</title>
</head>
<body>
    <h1>学生信息列表页面</h1>
    <table>
      <thead>
          <tr>
            <th>姓名</th>
            <th>性别</th>
            <th>出生日期</th>
          </tr>
      </thead>
    </table>

</body>
</html>

结果展示:

常用知识及注解

@Controller:类上面加,SpringMVC的注解

类上面加上Controller表示这个类是一个控制器类。

@GetMapping:方法上面加

方法 上加上GetMapping注解表示这个方法可以接收请求 ,指定请求的路径。

如果方法上面不加GetMapping注解表示这个方法就是普通方法。

Spring框架的两项核心功能

控制反转: Spring:将创建对象的权限交给spring框架,称之为控制反转 Inverse Of Control 简称ioc

依赖注入:Spring框架自动将容器中的实例,自动赋值给需要的类,DI

@Component:组件。控制反转,加在业务类上面:比如SudentServiceImpl

Spring:将创建对象的权限交给spring框架,称之为控制反转 。Inverse Of Control,简称Ioc

加上这个注解,spring在启动的时候会自动扫描根包下面的所有带这个注解的类,如果发现就会创建唯一实例 (控制反转),是单例的

创建出来的唯一实例放在了哪里?创建出来了如何获取?

手动获取:

创建出来的唯一实例放在了容器对象里面, 然后将容器对象放在全局域中:

java 复制代码
package com.situ.controller;
import com.situ.model.Student;
import com.situ.service.StudentService;
import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import java.util.List;
import java.util.Map;

@Controller//控制器类
public class StudentController {
    private StudentService studentService;

    @GetMapping("/student/list")//访问路径,能够接收请求。
    public String list(Map<String, Object> map, HttpServletRequest request){//这个方法只能使用反射的方式调用:因为参数可以加,不确定多少个

        //手动获取实例:
        ServletContext ctx = request.getServletContext();//全局域
        //spring的应用上下文对象。容器 。创建的唯一实例会放在容器里面,然后放在全局域中:
        ApplicationContext ac = WebApplicationContextUtils.findWebApplicationContext(ctx);
        studentService = ac.getBean(StudentService.class);//取出指定类型的唯一实例

        List<Student> students = studentService.findAll();//调用方法:
        map.put("students", students);//放到请求域中:底层自动进行参数校验
        return "student/list";//return就是请求转发,请求转发到templates下面的student/list文件
    }
}

但是手动获取比较麻烦,所以出现了依赖注入:

@Autowired:依赖注入:spring框架自动将容器中的实例,自动赋值给需要的类。是Spring的注解

依赖关系:实现类实现接口,实现类就依赖于这个接口。让Spring去解决依赖关系。

依赖注入的三种方式:

1.字段注入:加在字段上面,不推荐使用,不方便测试

java 复制代码
 @Autowired
    private StudentService studentService ;

2.setter注入

java 复制代码
  @Autowired
    public void setStudentService(StudentService studentService) {
        this.studentService = studentService;
    }

3.构造器注入

构造器注入可以省略Autowired注解

java 复制代码
   @Autowired   //构造器注入可以省略此行注解
    public StudentController(StudentService studentService){
        this.studentService= studentService;
    }

@Autowired

1.默认按类型匹配 使用频率比较高

当有多个实现类匹配时,可以使用@Primary注解表示优先

2.按名称匹配:需要搭配 @Qualifier()注解,同时指定Bean的名称,bean名称可以在@Component("i2")中指定,要是括号中不指定,则默认以类名(首字母小写)为bean名称

@Resource注解:依赖注入,不是Spring的注解

也是依赖注入

1.默认按名称注入 按name值

复制代码
 @Resource(name = "i1")

2.按类型注入:通过type属性

@Component 和@Service,@Repository (仓储),@Controller ,@RestController一样,自动创建唯一实例

其中,@RestController 是Controller的别名,

@Controller 和@RestController还会被识别出控制器,是不同于上面的额外作用。@Controller 和@RestController一般不用于创建唯一实例。

他们都是自动创建唯一实例的,但是 @Component 比较中性,不能见名知意。所有我们在Servcie层一般使用@Service,在Dao层数据处理层一般使用@Repository创建唯一实例

创建唯一实例:

注入依赖:

@XXXMapping:用在方法上面

在Controller中,一个方法只有指定@XXXMapping,才能接收请求。如果一个方法上面不加注解,那么他就是一个普通方法。

常见方式:

@GetMapping 接收get类型的请求

@PostMapping 接收post类型的请求

@PutMapping 接收put类型的请求

@PatchMapping 接收patch类型的请求

@DeleteMapping 接收delete类型的请求

@RequestMapping:接收任意类型的请求,但可以手动指定请求类型。

produces属性指定响应内容的类型。

@RequestMapping(value = "/student/list",method = RequestMethod.GET)

@XXXMapping也可以添加到类上面:添加到类上,表示所有方法以类上定义的方法作为公共前缀。表示全局统一定义。@GetMapping("/student/list")

参数:是通过反射调用的,数量,顺序可以任意。

1.可以HttpServletRequest,HttpSerlvetResponse,HttpSession

2.基本数据类型,以及包装类,BigDecimal,BigInteger,String。用于接收请求中的参数。

搭配 @RequstParam注解搭配@PathVariable注解(路径变量) 。通过这个注解可以指定获取参数和传输参数名字不一样的情况。这两个都是定义在参数位置上的。

3.javabean,普通类。将请求参数通过反射,设置到javabean实例中。即Spring会自动映射,获取参数,转类型、赋值一系列全部搞定。

4.Map,Model,ModelMap:充当请求域。map最常用。

5.加@RequestParam注解的map,此map不再作为请求域,而是用于存储请求参数。

6.以上类型的任意组合。

map:

返回值:

1.当返回的是字符串且响应内容类型为text/html,返回值即模板文件名 。在满足1的基础上,返回"forword:/xxx",表示请求转发。在满足1的基础上,返回"redirect:/xxx",表示重定向。

2.ModelAndView:即可以指定视图名称,同时可以当请求域使用。前三种本质上也会被包装成ModelAndView

3.如果指定响应内容类型为josn,并且添加了@ResponseBody注解,无论返回值是什么类型,都会序列化成json字符串。

4.返回ResponseEntity类型,仅限于响应json格式。同时封装了业务数据,以及响应的状态码。

相关推荐
保加利亚的风10 分钟前
【Java】使用FreeMarker来实现Word自定义导出
java·word
SteveCode.14 分钟前
SpringBoot 2.x 升 3.x 避坑指南:企业级项目的实战问题与解决方案
java·spring boot
Rust语言中文社区18 分钟前
Rust 训练营二期来袭: Rust + AI 智能硬件
开发语言·后端·rust
Yang-Never24 分钟前
Kotlin -> object声明和object表达式
android·java·开发语言·kotlin·android studio
风萧萧199925 分钟前
Java 实现poi方式读取word文件内容
java·开发语言·word
喵手35 分钟前
如何实现一个简单的基于Spring Boot的用户权限管理系统?
java·spring boot·后端
志如37 分钟前
【校招面试官说】什么样的技术人更容易被大厂校招选中?
前端·后端·面试
天天摸鱼的java工程师43 分钟前
SpringBoot可以同时处理多少请求?
后端
C4程序员1 小时前
北京JAVA基础面试30天打卡01
java·开发语言·面试
我爱娃哈哈1 小时前
熔断器+重试机制,微服务容错的终极武器?一线设计实战全解析!
后端