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 (这是本地访问,后续如果部署到云端后可以写别的域名。)
@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等注解代替。
@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这个的参数。
@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
@RestController
public class TestController {
@RequestMapping(value = "/getTest01",method = RequestMethod.GET)
public String getTest01(){
return "GET请求";
}
}
4.2.2.2 例2
@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的注解,则代表该参数是必须的,即必须传递这个参数)
@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)
@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
@GetMapping("/test/**")
public String test04(){
return "通配符请求";
}
"**" 代表后面可以跟任意字符、任意级。
"*" 代表后面可以跟任意字符、1级。
4.2.3 post请求
4.2.3.1 例4
模拟前端发送username和password参数
@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类:
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 + '\'' +
'}';
}
}
类的传递:
@RequestMapping(value = "/posttest02",method = RequestMethod.POST)
public String postTest02(User user){
System.out.println(user);
return "POST请求02";
}
发送请求:
当然也可以在类里面封装更多对象,方便传递。