SpringBoot

SpringBoot Controller

WEB

1.Spring Boot将传统Web开发的mvc、json、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了Web应用配置。
2.创建SpringBoot项目勾选Spring Web选项后,会自动将spring-boot-starterweb组件加入到项目中。
3.spring-boot-starter-web启动器主要包括web、webmvc、ison、tomcat等基础依赖组件,作用是提供Web开发场景所需的所有底层依赖。
4.webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带的容器依赖。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

控制器

1.Spring Boot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求。
2.如果请求的是页面和数据,使用@Controller注解即可;如果只是请求数据则可以使用@RestController注解。

在这里插入图片描述

@Controller的用法

  • 示例中返回了hello页面和name的数据,在前端页面中可以通过$name)参数获取后台返回的数据并显示。
  • @Controller通常与Thymeleaf模板引擎结合使用。
@Controller
public class HelloController {
	
	@RequestMapping("/hello")
	public String index(ModelMap map){
		map.addAttribute( attributeName: "name",attributeValue: "zhangsan");
		return "hello";
		}
}

@RestController的用法

  • 默认情况下转化成JSON格式
@RestController
public class HelloController{
	@RequestMapping("/user")
	public User getUser(){
		User user = new User();
		user.setUsername("zhangsan");
		user.setPassword("123");
	return user;
	}
}	

路由映射

路由映射

  • @RequestMapping注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上。
  • 如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效。
  • @RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性参数如下:
  • value:请求URL的路径,支持URL模板、正则表达式
  • method:HTTP请求方法
  • consumes: 请求的媒体类型(Content-Type) ,如application/json
  • produces:响应的媒体类型
  • params,headers: 请求的参数及请求头的值
  • @RequestMapping的value属性用于匹配URL映射,value支持简单表达式@RequestMapping(“/user”)
  • @RequestMapping支持使用通配符匹配URL,用于统一映射某些URL规则类似的请求: @RequestMapping(“/getJson/*.json”),当在浏览器中请求/getJson/a.json或者/getJson/bjson时都会匹配到后台的Json方法
  • @RequestMapping的通配符匹配非常简单实用,支持"*" “?” "**"等通配符
  • 符号“*”匹配任意字符,符号“**”匹配任意路径,符号“?”匹配单个字符
  • 有通配符的优先级低于没有通配符的,比如/user/add.json比/user/*.json优先匹配。
  • 有“**”通配符的优先级低于有“*”通配符的。

方法匹配

  • HTTP请求Method有GET、POST、PUT、DELETE等方式。HTTP支持的全部Method
  • @RequestMapping注解提供了method参数指定请求的Method类型,包括RequestMethod.GET、RequestMethod.POST、RequestMethod.DELETE、RequestMethod.PUT等值,分别对应HTTP请求的Method
@RestController
public class HelloController {

    //http://localhost:8080/hello
    @RequestMapping(value="/hello",method= RequestMethod.GET)
   // 上面的等价于m@GetMapping(value="/hello") 
    public String hello(){
        return "小桃气";
    }
}

在这里插入图片描述

  • Method匹配也可以使用@GetMapping、@PostMapping等注解代替

参数传递

  • @RequestParam将请求参数绑定到控制器的方法参数上,接收的参数来自HTTP请求体或请求url的QueryString,当请求的参数名称与Controller的业务方法参数名称一致时@RequestParam可以省略
  • @PathVaraible:用来处理动态的URL,URL的值可以作为控制器中处理方法的参数
  • @RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非Content-Type: application/x-www-form-urlencoded编码格式的数据比如: application/json、application/xml等类型的数据

数据响应


@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String hello(String nickname){
return "你好" + nickname;
}

如果参数名称不一致就要以下注解:
在这里插入图片描述
接收JSON数据的参数要加以下注解:
在这里插入图片描述

(4开头错误一般是浏览器的错误)
404错误:路径错误或者没重启项目
405错误:请求错误,在地址栏发送get请求,但是方法需要post请求

WEB开发进阶

静态资源访问

  • 使用IDEA创建Spring Boot项目,会默认创建出classpath:/static/目录,静态资源一般放在这个目录下即可。
  • 如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略。
  • 在applicationproperties中直接定义过滤规则和静态资源位置:
(注意这些后面不需要加符号)
spring.web.resources.static-locations=classpath:/static
spring.mvc.static-path-pattern=/static/**
  • 过滤规则为/static/**,静态资源位置为classpath:/static/

在这里插入图片描述

要访问static中的图片,url:http://localhost:8080/test.jpg在这里插入图片描述
如果自己要统一路径,则要配置:spring.mvc.static-path-pattern=/images/**
在这里插入图片描述
如果要自己创建一个文件夹css,则需配置:spring.web.resources.static-locations = classpath:/css

文件上传

文件上传原理

  • 表单的enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。
  • 当表单的enctype=“application/x-www-form-urlencoded”(默认)时,form表单中的数据格式为:key=value&key=value
  • 当表单的enctype="multipart/form-data"时,其传输数据形式如下:
    在这里插入图片描述

springboot实现文件上传功能

  • SpringBoot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。
  • 要更改这个默认值需要在配置文件(如application.properties)中加入两个配置
spring.servlet,multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
  • 当表单的enctype="multipart/form-data"时,可以使用MultipartFile获取上传的文件数据,再通过transferTo方法将其写入到磁盘中
@RestController
public class FileController {
private static final String UPLOADED_FOLDER = System.getProperty("user.dir")+"/upload/";

@PostMapping("/up")
public String upload(String nickname, MultipartFile f) throws IOException {
        System.out.println("文件大小:"+f.getSize());
        System.out.println(f.getContentType());
        System.out.println(f.getOriginalFilename());
        System.out.println(System.getProperty("user.dir"));
        saveFile(f);
        return"上传成功";
        }
public void saveFile(MultipartFile f) throws IOException{
    File upDir = new File(UPLOADED_FOLDER);
    if(!upDir.exists()){
        upDir.mkdir();
        }
    File file = new File(UPLOADED_FOLDER+f.getOriginalFilename());
    f.transferTo(file);
        }
}

拦截器

拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:

  1. 权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。
  2. 性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程 序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间
  3. 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现。
  • SpringBoot定义了HandlerInterceptor接口来实现自定义拦截器的功能
  • HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作
    在这里插入图片描述

拦截器定义

public class LoginInterceptor extends HandlerInterceptor {
        /**
         *在请求处理之前进行调用 (controller方法调用之前)
         */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        if (条件) {
            System.out.println("通过");
            return true;
        }else{
        System.out.println("不通过");
        return false;
        }
        }
}

拦截器注册

  • addPathPatterns方法定义拦截的地址
  • excludePathPatterns定义排除某些地址不被拦截
  • 添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求
  • 如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求。
@Configuration
public class Webconfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addpathpatterns("/user/**");
    }
}

构建RESTful服务

RESTfull介绍

  • RESTful是目前流行的互联网软件服务架构设计风格。
  • REST(RepresentationalStateTransfer,表述性状态转移)一词是由RoyThomasFielding在2000年的博士论文中提出的,它定义了互联网软件服务的架构原则,如果一个架构符合REST原则,则称之为RESTful架构。
  • REST并不是一个标准,它更像一组客户端和服务端交互时的架构理念和设计原则,基于这种架构理念和设计原则的WebAPI更加简洁,更有层次。

RESTful特点

  • 每一个URI代表一种资源
  • 客户端使用GET、POST、PUT、DELETE四种表示操作方式的动词对服务端资源进行操作:GET用于获取资源,POST用于新建资源(也可以用于更新资源),PUT用于更新资源,DELETE用于删除资源。
  • 通过操作资源的表现形式来实现服务端请求操作。
  • 资源的表现形式是JSON或者HTML。
  • 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个
    请求都包含必需的信息。

RESTfulAPI

符合RESTful规范的WebAPI需要具备如下两个关键特性:

  1. 安全性:
    安全的方法被期望不会产生任何副作用,当我们使用GET操作获取资源时,不会引起资源本身的改变,也不会引起服务器状态的改变。
  2. 幂等性:
    幂等的方法保证了重复进行一个请求和一次请求的效果相同(并不是指响应总是相同的,而是指服务器上资源的状态从第一次请求后就不再改变了)在数学上幂等性是指N次变换和一次变换相同。

HTTP Method

  • HTTP提供了POST、GET、PUT、DELETE等操作类型对某个Web资源进行
    Create、Read、Update和Delete操作。
  • 一个HTTP请求除了利用URI标志目标资源之外,还需要通过HTTP Method指
    定针对该资源的操作类型,一些常见的HTTP方法及其在RESTful风格下的使用:
    在这里插入图片描述

HTTP状态码

  • HTTP状态码就是服务向用户返回的状态码和提示信息,客户端的每一次请求,
    服务都必须给出回应,回应包括HTTP状态码和数据两部分。
  • HTTP定义了40个标准状态码,可用于传达客户端请求的结果。状态码分为以下

5个类别:

1xx:信息,通信传输协议级信息
2xx:成功,表示客户端的请求已成功接受
3xx:重定向,表示客户端必须执行一些其他操作才能完成其请求
4xx:客户端错误,此类错误状态码指向客户端
5xx:服务器错误,服务器负责这写错误状态码

  • RESTful API中使用HTTP状态码来表示请求执行结果的状态,适用于REST API设计的代码以及对应的HTTP方法
    在这里插入图片描述

Spring Boot实现RESTfulAPI

  • Spring Boot提供的spring-boot-starter-web组件完全支持开发RESTful API,
    提供了与REST操作方式(GET、POST、PUT、DELETE)对应的注解。
  • @GetMapping:处理GET请求,获取资源。
  • @PostMapping:处理POST请求,新增资源。
  • @PutMapping:处理PUT请求,更新资源。
  • @DeleteMapping:处理DELETE请求,删除资源。
  • @PatchMapping:处理PATCH请求,用于部分更新资源

在RESTful架构中,每个网址代表一种资源,所以URI中建议不要包含动词,只
包含名词即可,而且所用的名词往往与数据库的表格名对应。
用户管理模块API示例:
在这里插入图片描述

Spring Boot实现RESTful API

@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public String getUserById(@PathVariable int id) {
        return "根据ID获取用户";
    }

    @PostMapping("/user")
    public String save(User user) {
        return "添加用户";
    }

    @PutMapping("/user")
    public String update(User user) {
        return "更新用户";
    }

    @DeleteMapping("/user/{id}")
    public String deleteById(@PathVariable int id) {
        return "根据ID删除用户";
    }
}

什么是Swagger

  • Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,是非常流行的API表达工具。
  • Swagger能够自动生成完善的RESTful API文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API
    在这里插入图片描述

使用Swagger生成Web API文

  • 在Spring Boot项目中集成Swagger同样非常简单,只需在项目中引入
    springfox-swagger2和springfox-swagger-ui依赖即可
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency> 

配置Swagger

@Configuration // 告诉Spring容器,这个类是一个配置类
@EnabLeSwagger2 // 启用Swagger2功能
public class Swagger2Config {
    @Bean
    public Docket createRestApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
    // com包下所有API都交给Swagger2管理
            .apis(RequestHandlerSelectors.basePackage("com"))
            .paths(PathSelectors.any()).build();
}
    //API文档页面显示信息
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .titLe("演示项目API")// 标题
                    .description("学习Swagger2的演示项目") // 描述
                    .build();

        }
}

注意事项

  • Spring Boot 2.6.X后与Swagger有版本冲突问题,需要在application.properties中加入以下配置:
spring.mvc.pathmatch.matching-strategy=ant_path_matcher

使用 Swagger2 进行接口测试

  • 启动项目访问 http://127.0.0.1:8080/swagger-ui.html ,即可打开自动生成的可视化测试页面
    在这里插入图片描述

Swagger常用注解

  • Swagger提供了一系列注解来描述接口信息,包括接口说明、请求方法、请求参数、返回信息等
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值