SpringBoot学习笔记(1)

1.Web技术基础

**BS:(Browser/Server,浏览器/服务器架构模式)。**C/S架构主要特点是交互性强,具有安全访问模式,网络流量低,响应速度快,因为客户端负责大多数业务逻辑和UI演示,所以也被称为胖客户端,C/S结构的软件需要针对不同的操作系统开发不同版本的软件。

**CS:(Client/Server,客户端/服务器架构模式)。**随着互联网的兴起,CS架构不适合Web,最大的原因是Web应用程序的修改和升级非常迅速,而CS架构需要每个客户端逐个升级桌面App,因此,Browser/Server模式开始流行,简称BS架构。B/S架构的主要特点是分散性高、维护方便、开发简单、共享性高、总拥有成本低。

2.BS架构原理

在BS架构下,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web页面,并把Web页面展示给用户即可。

3.SpringBoot

遵循"约定优于配置"的原则,只需要很少的配置或使用默认的配置。

能够使用内嵌的Tomcat、Jetty服务器,不需要部署war文件。

提供定制化的启动器Starters,简化Maven配置,开箱即用。

纯Java配置,没有代码生成,也不需要XML配置。

提供了生产级的服务监控方案,如安全监控、应用监控、健康检测等。

3.1 pom.xml

pom.xml是Maven项目的核心配置文件,它是 项目对象模型 - Project Object Model(POM)的缩写。

全面详解Maven的配置文件pom.xml(含常用plugin)_maven pom.xml-CSDN博客

3.2 resources目录

存放web资源。static主要存放静态资源,如图片、css、js等;templates主要存放html等;

application.properties:

05全局配置文件application.properties详解-CSDN博客

application.properties与 application.yaml都可以作为Spring Boot的配置文件,只是书写格式不同而已,在 Spring Boot 启动时被自动读取。当然也可以同时使用,但同级目录下读取的顺序是先读取application.properties,读取application.yaml。该配置文件的存放路径如下图所示。

3.3 控制器

Spring Boot提供了**@Controller** 和**@RestController**两种注解来标识此类负责接收和处理HTTP请求。

如果请求的是页面和数据 ,使用**@Controller**注解即可;

如果只是请求数据 ,则可以使用**@RestController**注解(本文使用)。

3.3.1 @RestController注解使用

默认情况下,@RestController注解会将返回的对象数据转换为JSON格式。

3.3.2 实践

在包下创建Controller包,再创建controller的class,@RestController是对控制器的标记,代表这个类已经变成了一个控制器,可用于接收客户端的请求了;

加上请求**@GetMapping("/hello")** 来访问这个方法,括号内的是链接地址:"/hello"

浏览器: /http://localhost:8080/hello (这是本地访问,后续如果部署到云端后可以写别的域名。)

java 复制代码
@RestController    //控制器的标记
public class contrller {

    //http://localhost:8080/hello?nickname=xinge&phone=123456
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    //该方法等价于:
    //@GetMapping("/hello")
    public String Hello(){    //添加方法

        return "你好";

    }
}

如果使用**@Controller**注解,则需要返回一个html页面,即在return中去找一个名为hello的html文件。

4. web入门

Spring Boot将传统Web开发的mvc、json、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了Web应用配置。

++创建SpringBoot项目勾选Spring Web选项后++,会自动将spring-boot-starter-web组件加入到项目中。

spring-boot-starter-web启动器主要包括web、webmvc、json、tomcat等基础依赖组件,作用是提供Web开发场景所需的所有底层依赖。

++webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带的容器依赖。++

4.1 路由映射

控制器通过路由映射接收请求。

@RequestMapping 注解主要负责URL的路由映射。它可以添加在Controller类 或者具体的方法上。

如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效。

4.1.1 请求方法

@RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性如下:

value: 请求URL的路径,支持URL模板、正则表达式

method: HTTP请求方法

consumes: 请求的媒体类型(Content-Type),如application/json

produces: 响应的媒体类型

params,headers: 请求的参数及请求头的值

4.1.2 value匹配

@RequestMapping的value属性用于匹配URL映射,value支持简单表达式@RequestMapping("/user")

@RequestMapping支持使用通配符匹配URL,用于统一映射某些URL规则类似的请求:@RequestMapping("/getJson/*.json"),当在浏览器中请求/getJson/a.json或者/getJson/b.json时都会匹配到后台的Json方法

@RequestMapping的通配符匹配非常简单实用,支持 "*" "?" "**" 等通配符

符号 "*" 匹配任意字符,符号 "**" 匹配任意路径,符号 "?" 匹配单个字符。

有通配符的优先级低于没有通配符的,比如/user/add.json比/user/*.json优先匹配。

有"**"通配符的优先级低于有"*"通配符的。

4.1.3 Method匹配

HTTP请求Method有GET、POST、PUT、DELETE等方式。HTTP支持的全部Method

@RequestMapping注解提供了method参数指定请求的Method类型,包括RequestMethod.GET、RequestMethod.POST、RequestMethod.DELETE、RequestMethod.PUT等值,分别对应HTTP请求的Method

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

java 复制代码
@RestController    //控制器的标记
public class contrller {

    //http://localhost:8080/hello?nickname=xinge&phone=123456
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    //只能接受GET请求
    public String Hello(){    //添加方法

        return "你好";

    }
}

4.2参数专递

@RequestParam将请求参数绑定到控制器的方法参数上,接收的参数来自HTTP请求体或请求url的QueryString,当请求的参数名称与Controller的业务方法参数名称一致时,@RequestParam可以省略。

@PathVaraible:用来处理动态的URL,URL的值可以作为控制器中处理方法的参数。

@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:`application/json`、`application/xml`等类型的数据。

4.2.1 参数传递

zhangsan的名字被传递给了nickname这个的参数。

java 复制代码
@RestController
public class contrller {

    //http://localhost:8080/hello?nickname=xinge&phone=123456
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    //该方法等价于:
    //@GetMapping("/hello")
    public String Hello(String nickname,String phone){
        System.out.println(phone);
        return "你好" + nickname;

    }
}
4.2.2 get请求
4.2.2.1 例1
java 复制代码
@RestController
public class TestController {

    @RequestMapping(value = "/getTest01",method = RequestMethod.GET)
    public String getTest01(){

        return "GET请求";
    }
}
4.2.2.2 例2
java 复制代码
@RestController
public class TestController {

    @RequestMapping(value = "/getTest01",method = RequestMethod.GET)
    public String getTest01(){

        return "GET请求";
    }
    @RequestMapping(value = "/getTest02",method = RequestMethod.GET)
    //http://localhost:8080/getTest02?nickname=zhagsan&phone=123
    public String getTest02(String nickname,String phone){
        System.out.println(phone);
        return "你好呀" + nickname;
    }
}

如果传递过来的参数名称和方法的名称不一致该怎么办?

4.2.2.3 例3

传过来的是nickname,而方法定义的是name;

在定义前面加一个注解如下:(@RequestParam(value = "nickname")

注意:如果加了**@RequestParam** 的注解,则代表该参数是必须的,即必须传递这个参数**)**

java 复制代码
@RestController
public class TestController {


    @RequestMapping(value = "/getTest03",method = RequestMethod.GET)
    //http://localhost:8080/getTest03?nickname=XXX
    public String getTest03(@RequestParam(value = "nickname") String name){
        //将name与Nickname绑定
        //required = false表示可以不传递
        System.out.println("nackname:" + name);
        return "GET请求";
    }
}

报错:400

如果想不一定传递这个参数,那么可以加一个required = false,即**(@RequestParam(value = "nickname",required = false)**

java 复制代码
    @RequestMapping(value = "/getTest03",method = RequestMethod.GET)
    //http://localhost:8080/getTest03?nickname=XXX
    public String getTest03(@RequestParam(value = "nickname",required = false) String name){
        //将name与Nickname绑定
        //required = false表示可以不传递
        System.out.println("nackname:" + name);
        return "GET请求";
    }
4.2.2.4 例3.5
java 复制代码
    @GetMapping("/test/**")
    public String test04(){
        return "通配符请求";
    }

"**" 代表后面可以跟任意字符、任意级。

"*" 代表后面可以跟任意字符、1级。

4.2.3 post请求
4.2.3.1 例4

模拟前端发送username和password参数

java 复制代码
    @RequestMapping(value = "/posttest01",method = RequestMethod.POST)
    public String postTest01(String username,String password){
        System.out.println("username:" + username);
        System.out.println("password:" + password);
        return "post请求";
    }

终端显示:

也可以把信息放到请求体里,也可以放到url后面(如下)

4.2.3.2 例5.把许多参数封装到对象里去(实体entity)

创建entity类User(保证类里的属性名称和传输过来的参数名称一致

User类:

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

public class User {
    private String username;
    private String password;


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

类的传递:

java 复制代码
    @RequestMapping(value = "/posttest02",method = RequestMethod.POST)
    public String postTest02(User user){
        System.out.println(user);
        return "POST请求02";
    }

发送请求:

当然也可以在类里面封装更多对象,方便传递。

相关推荐
爱吃生蚝的于勒4 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
cuisidong19972 小时前
5G学习笔记三之物理层、数据链路层、RRC层协议
笔记·学习·5g
乌恩大侠2 小时前
5G周边知识笔记
笔记·5g
南宫理的日知录2 小时前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
数据与后端架构提升之路3 小时前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
一行13 小时前
电脑蓝屏debug学习
学习·电脑
咔叽布吉3 小时前
【论文阅读笔记】CamoFormer: Masked Separable Attention for Camouflaged Object Detection
论文阅读·笔记·目标检测
Gemini19953 小时前
分布式和微服务的区别
分布式·微服务·架构
johnny2333 小时前
《大模型应用开发极简入门》笔记
笔记·chatgpt
亦枫Leonlew3 小时前
微积分复习笔记 Calculus Volume 1 - 4.7 Applied Optimization Problems
笔记·数学·微积分·1024程序员节