目录
- 1. Maven
- Maven的介绍
- 创建Maven项目:
- 2. Spring Boot
- Spring Boot的介绍
- 创建项目
- 安装插件(专业版可跳过)
- 创建第一个Spring Boot项目
- 实现SpringBoot的helloworld
- 3. Spring MVC
- 创建Spring MVC项目
- 建立连接
- @RequestController注解
- @RequestMapping 注解
- @GetMapping注解
- @PostMapping注解
- 请求
- 接收一个参数
- 接收多个参数
- 使用对象接收多个参数
- 参数重命名
- 使用数组接收多个参数
- 使用集合接收
- 接收json数据
- 获取url中路径参数
- 获取上传的文件
- 获取Cookie和Session
- 获取Header
- 响应
- 返回html页面
- 返回html代码片段
- 返回json数据
- 设置状态码
- 设置Header
- 4. 应用分层
- 5. 小案例:加法计算器
在介绍SpringBoot之前,先介绍一下Maven~
1. Maven
Maven的介绍
Maven 是一个项目管理和构建自动化工具,主要服务于基于 Java 的项目。它由 Apache 软件基金会维护。Maven 主要用于项目的依赖管理、构建过程的自动化、项目信息管理等。
什么是依赖?:“依赖”通常指的是一个软件组件(如库、框架、模块等)在运行或构建过程中需要的其他组件
Maven的核心功能:
- 依赖管理:Maven 能够自动下载项目所需的所有依赖,并管理这些依赖的版本,确保项目中使用的库是最新且兼容的。
- 项目构建:Maven 定义了一系列生命周期(如编译、测试、打包、部署等),通过简单的命令可以自动执行这些构建步骤。
- 项目管理:Maven 通过
pom.xml
文件(Project Object Model)来定义项目的构建过程、依赖关系、插件配置等,使得项目管理更加标准化和自动化。
创建Maven项目:
IDEA帮我们集成了Maven,所以我们不需要自己再去下载安装了~
创建项目之前,先设置好本地仓库以及镜像源:
在IDEA中,打开设置settings,搜索框中输入Maven,下面的设置尽量和我的一样
大家可以自己创建一个目录作为本地仓库,结构如下
在settings.xml文件添加下面的内容:
<mirrors><mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></mirror>
</mirrors>
如果大家没有这个文件,可以去我的仓库中下载[仓库链接](https://gitee.com/vampire-wpre/learning-resource/tree/master/配置文件/Maven 配置文件)
接下来就可以创建项目了
选择项目路径,点击finish
点开pom.xml文件,添加下面的代码
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency>
</dependencies>
之前我们编写JDBC程序时需要自己下载导入jar包,非常麻烦,现在我们只需要在pom.xml文件中添加下面的内容,然后点击刷新,就可以完成jar包的加载。
如果找不到刷新按钮,点击右上角的Maven
有一个刷新按钮
刷新之后我们可以找到Maven帮我们加载的jar包
如果我们需要下载其他的jar包,直接去Maven中央仓库https://mvnrepository.com/搜索
选择我们想要的jar包以及版本,直接把这段代码复制到pom.xml文件中就可以了
2. Spring Boot
Spring Boot的介绍
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它简化了基于Spring的应用开发,通过“约定大于配置”的原则,让开发者可以轻松地创建独立运行的、生产级别的Spring应用。
创建项目
安装插件(专业版可跳过)
IDEA社区版需要下载Spring Boot Helper插件才能创建SpringBoot项目(专业版不需要),Spring Boot Helper插件下载链接
有一个免费版本,其他是收费的,并且这个免费版本的插件要求我们的IDEA是2021.1~2022.1.4这个范围内才能使用
下载好之后是个压缩包,不需要压缩,我们打开IDEA,
选择我们下载好的压缩包
这样插件就安装好了
创建第一个Spring Boot项目
打开IDEA,选择new Project
项目类型选择Maven
选择web->Spring Web
Spring Boot版本选择3.3.4或者3.2.10
接下来选择项目路径,然后点击finish
这样我们的项目就创建好了,创建好之后,右下角的Load Maven Project一定要点~
点开pom.xml文件,
修改之后刷新Maven
实现SpringBoot的helloworld
创建一个新的类ParamController,代码如下
@RestController
public class ParamController {@RequestMapping("/p1")public String p1() {return "Hello World";}
}
启动程序,
接着在浏览器中输入
http://127.0.0.1:8080/p1
http:请求的协议
127.0.0.1:IP地址,127.0.0.1表示本机(自己的电脑)
8080:端口号,8080是Tomcat(一个Web服务器)的端口号
p1:资源路径
3. Spring MVC
关于Spring MVC:
- Spring MVC 是 Spring 框架中的一个模块,专门用于构建 Web 应用程序。
- 它实现了 MVC(Model-View-Controller)设计模式,帮助开发者将应用程序分为模型、视图和控制器,以实现关注点分离。
- Spring MVC 提供了强大的数据绑定、验证、选择视图和处理异常等功能。
- 它通常与 Spring 框架的其他模块一起使用,以构建完整的 Web 应用程序。
学习Spring MVC,主要学习以下几个方面:
1、建立连接: 将用户(浏览器)和Java程序连接,使得访问一个地址就能调用我们写的Spring程序
2、请求: 用户发送请求时会携带一下参数,我们要获取到这些参数
3、响应: 执行一些业务逻辑后,把结果返回给用户
创建Spring MVC项目
创建的方式和Spring Boot项目创建方式一模一样
建立连接
首先介绍一个工具Postman的使用:
Postman可以帮我们快速建立http请求
后续我们进行测试的时候就可以直接使用Postman帮我们构造http请求,发送给服务器,而不是自己写前端代码。
@RequestController注解
表明该类是一个控制器,用于处理 HTTP 请求。
@RequestMapping 注解
可以将一个或多个 HTTP 请求映射到一个控制器的方法上。这意味着当一个匹配的请求到达时,Spring MVC 将调用相应的方法来处理这个请求,建立连接通过RequestMapping。RequestMapping可以修饰类(类路径),也可以修饰方法(方法路径),访问时是类路径+方法路径。例如
@RestController
@RequestMapping("/param")//类路径是/param
public class ParamController {@RequestMapping("/p1")//方法路径是/p1public String p1(String name) {return name;}
}
上述代码中既有类路径又有方法路径,所以我们在访问某个方法时,必须是类路径+方法路径
http://127.0.0.1:8080/param/p1
RequestMapping既支持get请求,又支持post请求,但是我们通过可以设置参数来规定只支持get或者post,
//设置参数method = RequestMethod.GET,表示只接收get请求
@RequestMapping(value = "/p4", method = RequestMethod.GET)
public String p4() {return "p4";
}//设置参数method = RequestMethod.POST,表示只接收post请求
@RequestMapping(value = "/p5", method = RequestMethod.POST)
public String p5() {return "p5";
}
@GetMapping注解
表示只接收get请求
//GetMapping,只接收get请求
@GetMapping("/p6")
public String p6() {return "p6";
}
@PostMapping注解
表示只接收post请求
//PostMapping,只接收post请求
@PostMapping("/p7")
public String p7() {return "p7";
}
请求
我们需要从请求中接收、获取到某些信息
接收一个参数
请求参数要和url中查询字符串中的参数名一致才能接收
方法中的参数名要和url中查询字符串中的参数名一致才能接收
//1个参数
@RequestMapping("/p8")
public String p8(String name) {return "name: " + name;
}
接收多个参数
//多个参数
@RequestMapping("/p9")
public String p9(String name, Integer age) {//尽量使用包装类,因为前端传递的普通参数默认是String类型,后端接收时,使用包装类可以进行类型转换return "name: " + name + ", age: " + age;
}
使用对象接收多个参数
我们可以自定义一个类
public class User {private int age;private String name;private String gender;
}
//使用对象接收,多个参数
@RequestMapping("/p11")
public String p11(User user) {return "user: " + user;
}
Spring会根据参数名自动绑定到对象的各个属性上,如果某个参数没有传递,会赋值为默认值。
参数重命名
如果对前端传递过来的参数名字不习惯,我们可以对参数重命名,通过使用@RequestParam注解来完成。
//给前端的传递过来的参数重命名
@RequestMapping("/p12")
public String p12(@RequestParam("username") String name) {//前端的参数名字是username,我们后端定义的是name,@RequestParam的作用就是参数绑定//如果加上了这个注解,前端的参数名字必须和@RequestParam()括号内的名字一样,否则会报错return "name:" + name;
}@RequestMapping("/p13")
public String p13(@RequestParam(value = "username", required = false) String name) {//@RequestParam的required默认是true,表示必传参数,前端没有传这个参数会报错,//设置为false后,即使前端的参数为name,也不会报错return "name:" + name;
}
使用数组接收多个参数
当前端传递的参数像 name=张三&name=李四 这样重复的参数,会把它们封装成一个数组,我们后端可以使用数组接收
@RequestMapping("/p14")
public String p14(String[] arr) {return "arr: " + List.of(arr);
}
如果前端传的参数像 name=张三,李四,王五 此时数组的长度应该是3(会自动切割)
使用集合接收
前端封装好的数组,我们同样可以使用集合来接收,只不过需要加上@RequestParam来将数组绑定成对应的集合类型
//使用集合接收
@RequestMapping("/p15")
public String p15(@RequestParam List<String> list) {//前端传递的同样是数组,我们后端需要加上@RequestParam把前端传递的数组绑定成List//所以说,RequestParam既可以绑定参数名,也可以绑定类型return "list: " + list;
}
接收json数据
使用对象接收,并且加上@RequestBody注解
@RequestMapping("/p16")
public String p16(@RequestBody User user) {//RequestBody,表示从请求正文中拿到数据return "user: " + user;
}
获取url中路径参数
上述说的参数都是查询字符串中的参数,这里说的是路径上的参数,例如
url为
http://127.0.0.1:8080/param/p17/article/articleId
如果想要获取参数articleId,可以使用@PathVariable注解,例如:
@RequestMapping("/article/{articleId}")
public String p17(@PathVariable String articleId) {return "article" + articleId;
}
如果参数不止一个
//2个参数
@RequestMapping("/article/{articleId}/{name}")
public String p18(@PathVariable String articleId, @PathVariable String name) {return "article" + articleId + ", name" + name;
}
"/article/{articleId}/{name}"中,{articleId}和{name}是占位符,如果只有name没有articleId则访问失败。
获取上传的文件
使用注解@RequestPart,MultipartFile类型的参数接收
//获取上传的文件
@RequestMapping("/p19")
public String p19(@RequestPart("fileName") MultipartFile file) {String name = file.getOriginalFilename();return "file: " + name;
}
获取Cookie和Session
获取Cookie:利用HttpServletRequest
//获取Cookie:传统方式,利用HttpServletRequest
@RequestMapping("/p20")
public String p20(HttpServletRequest request) {Cookie[] cookies = request.getCookies();if (cookies == null) {//Cookie可能为空return "Cookie为空";}for (Cookie cookie : cookies) {System.out.println("name: " + cookie.getName() + " value: " + cookie.getValue());}return "获取到Cookie";
}
获取Cookie:使用注解
//注解的方式获取Cookie
@RequestMapping("/p21")
public String p21(@CookieValue("Vampire") String Vampire) {//@CookieValue(),括号中填写想要获取的key,获取到的key的value会给方法中的参数Vampirereturn "获取到Cookie,Vampire的值为 " + Vampire;
}
设置Session:Session是存储在内存中的,重启服务器会丢失Session,所以要设置Session
//设置Session
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {HttpSession session = request.getSession();//先获取到Session,如果没有会创建一个session.setAttribute("username", "张三");//设置session,key-valuesession.setAttribute("age", 18);//设置session,key-valuereturn "设置Session成功";
}
获取Session:使用HttpServletRequest
getSession有参数版本:true->如果Session对象为空会创建一个Session对象;false->如果Session对象为空,不会创建Session对象,getSession默认为true
//获取Session
@RequestMapping("/p22")
public String p22(HttpServletRequest request) {//原理: 从Cookie中找到SessionID,根据SessionID拿到SessionHttpSession session = request.getSession();Object username = session.getAttribute("username");//可以理解为根据key获取valueObject age = session.getAttribute("age");if (username == null || age == null) {return "null";}return "name: " + username + ", age: " + age;
}
获取Session:使用HttpSession
@RequestMapping("/p23")
public String p23(HttpSession session) {Object username = session.getAttribute("username");Object age = session.getAttribute("age");if (username == null || age == null) {return "null";}return "name: " + username + ", age: " + age;
}
获取Session:使用注解@SessionAttribute
//第三种获取Session:使用注解
@RequestMapping("/p24")
public String p24(@SessionAttribute String username) {return "获取Session信息,username: " + username;
}
获取Header
使用HttpServletRequest
//获取Header:使用HttpServletRequest
@RequestMapping("/p25")
public String p25(HttpServletRequest request) {String UserAgent = request.getHeader("User-Agent");String ContentType = request.getHeader("Content-Type");return "UserAgent: " + UserAgent + ", ContentType: " + ContentType;
}
使用注解@RequestHeader
//获取Header:使用注解
@RequestMapping("/p26")
public String p26(@RequestHeader("User-Agent") String UserAgent) {return "UserAgent: " + UserAgent;
}
响应
在接收到请求之后,经过某些逻辑,我们给需要返回响应,这时我们会接触到另一个注解Controller。
Controller和RestController的区别
@Controller
:是一个通用的控制器注解,它标记的类可以处理HTTP请求,但返回的视图通常需要通过Spring MVC的视图解析器来解析,适用于需要返回视图的Web应用程序,如传统的服务器渲染的Web页面@RestController
:是@Controller
和@ResponseBody
的组合注解。这意味着任何标记了@RestController
的类中的方法都会自动应用@ResponseBody
,即方法的返回值将直接作为HTTP响应的正文返回,而不是通过视图解析器解析。适用于构建RESTful API,通常返回JSON或XML格式的数据给客户端。
如果想返回数据,使用ResponseBody,如果想返回html页面,使用Controller。Controller是类注解,ResponseBody即是类注解,又是方法注解,加在类上表示该类的所有方法都返回数据,加在方法上表示该方法返回数据,其他方法不受影响。
返回html页面
@RequestMapping("/Response")
@Controller
public class ResponseController {//返回html页面@RequestMapping("/r1")public String r1() {return "/Test.html";}
}
返回html代码片段
@RequestMapping("/Response")
@Controller
public class ResponseController {//返回html代码片段@RequestMapping("/r3")@ResponseBodypublic String r3() {return "<h1>你好</h1>";//浏览器会解析成html代码}
}
返回json数据
@RequestMapping("/Response")
@Controller
public class ResponseController {//返回json数据@ResponseBody@RequestMapping("/r4")public User r4() {User user = new User();user.setAge(18);user.setName("张三");user.setGender("男");return user;//虽然这里返回的是user对象,但是实际上返回的就是json}
}
设置状态码
使用HttpServletResponse
@RequestMapping("/Response")
@Controller
public class ResponseController {//设置状态码,使用HttpServletResponse@ResponseBody@RequestMapping("/r5")public String r5(HttpServletResponse response) {response.setStatus(500);//设置状态码return "状态码设置成功";}
}
设置Header
@RequestMapping("/Response")
@Controller
public class ResponseController {//设置响应的Header,设置返回的数据类型@RequestMapping(value = "/r6", produces = "application/json")@ResponseBodypublic String r6() {return "{\"user\":wpre}";}//设置响应的Header,自定义key,value@RequestMapping(value = "/r7")@ResponseBodypublic String r7(HttpServletResponse response) {response.setHeader("Key1", "value1");return "设置成功";}}
4. 应用分层
应用分层是一种软件开发思想,它将应用程序分成N个层次,每个层次负责自己的工作,多个层次之间协同完成整个应用的功能。
对于Java后端,有一种新的分层架构
三层架构:
1、表现层:就是展示数据结果(返回结果)和接收用户指令接收参数的,是最靠近用户的一层
2、业务逻辑层:负责处理业务逻辑
3、数据层:负责存储、管理业务数据,包括增删查改
Spring中的体现:
Controller:控制层,也就是表现层,负责接收前端发送的请求,对请求进行处理并响应数据
Service:业务逻辑层
Dao:数据访问层,也称为持久层
5. 小案例:加法计算器
实现一个加法计算器,用户在浏览器中输入两个数后,后端返回这两个数相加的结果,最后将结果显示在浏览器中
前端代码:前端代码一般放在static文件夹中
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><form action="calc/sum" method="post"><h1>计算器</h1>数字1:<input name="num1" type="text"><br>数字2:<input name="num2" type="text"><br><input type="submit" value=" 点击相加 "></form></body></html>
后端代码:
@RestController
@RequestMapping("/calc")
public class CalcController {//实现计算器功能@RequestMapping("/sum")public String sum(@RequestParam("num1") Integer num1, @RequestParam("num2") Integer num2) {Integer sum = num1 + num2;return "计算结果:" + sum;}
}
效果展示
输入内容,点击按钮之后