SpringBoot框架
属于spring全家桶的技术框架
微服务框架 - 快速搭建一个微服务项目 - [脚手架]
微服务,分布式,集群三者的概念和区别
SpringBoot相对于Springmvc框架,简化了大量的配置,一定要遵守它很多约定 - 约定大于俗成.
轻便和简洁,能够快速上手实现一个web应用程序的开发.
搭建一个Springboot工程
可以使用Spring Initializr插件来快速构建Springboot工程
![]()
场景启动器
SpringBoot将所有的功能场景,抽取出来,形成一个一个独立的startes启动器.
需要什么样的功能,就引入什么样的场景启动器.比如web项目的web场景启动器就是spring-boot-starter-web
Developer Tools
a. Lombok
b. SpringBoot DevTools - 热部署
c. Spring Configuration Proccessor 配置文件处理器
Web
a. Spring Web - 构建web项目必须要勾选的,包含了web工程需要的依赖.
模板引擎 - 第三方的jsp
Security
a. Spring Security - Spring权限安全框架.
SQL
a. Spring Data JPA - 持久层的技术框架
b. Mybatis Framework - Mybatis框架
c. Mysql Driver - Mysql的驱动
No SQL
a. Spring Data Redis - Redis非关系型数据库[键值对数据库]
b. Spring Data Mongodb - 非关系型数据库[文档型数据库]
Messaging
a. Spring for RabbitMQ
IO
a. Java Mail Sender
HelloWorld工程
Springboot工程配置文件有俩种形式,一种是properties,一种是.yml文件[yarn语法 - 格式非常严格 - 缩进和空格]
如果同时存在的话,那么优先级别比较高的是properties文件.并且无论是哪种文件存在.主入口文件的名称一定是application
yml文件的占位符
application-{prod}.yml
开发中需要涉及到多个场景[多个环境],比如开发环境,测试环境,生产环境 - 三种环境下的配置肯定略有区别
application.yml - 仍然作为主配置文件,一定不能少.需要在主配置文件中去激活具体使用的是哪个配置文件.
spring: profiles: active: dev
application-dev.yml
application-prod.yml
application-test.yml
如何启动springboot工程
Springboot工程内嵌了服务器 - tomcat服务器
直接运行主程序中的main方法.
SpringbootJ03sApplication主程序一定是在项目的根包下.
如何部署
用maven对整个项目进行打包
mvn package 它会自动去执行src/test/java所有的单元测试类中的所有的测试方法.
希望 - 打包之后,不经过单元测试 mvn package -Dmaven.test.skip=true
效果就在target/springboot-j03s-0.0.1-SNAPSHOT.jar
直接将这个jar放入到阿里云服务器
java -jar springboot-j03s-0.0.1-SNAPSHOT.jar
SpringBoot”依赖总管家”
未来导入依赖的步骤,先到”依赖总管家”中去寻找一下,是否管理了这个依赖,如果没有 - 百度 - maven仓库
如果存在了.直接拿过来引用,但是不需要加入版本号了.
每个springboot工程都有一个父工程 - spring-boot-starter-parent
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
父工程的父工程
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.1.RELEASE</version> </parent>
spring-boot-dependencies - “依赖总管家”
对常见的依赖的版本进行了一个统一的管理.全部放在了
SpringBoot整合JSP
- SpringBoot对jsp支持不是特别友好.所以需要配置一下
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>
src/main/webapp - 专门存放web资源[html,css,js,图片以及jsp文件]
WEB-INF - 安全级别很高的文件夹.该文件夹下的文件不能够直接通过浏览器进行直接的访问.只能通过转发的方式.
web.xml - web工程的描述性文件 - 不能缺.
配置webapp
File - Project - Structure -
![]()
感受
ProductController.java
@Controller
public class ProductController {
@GetMapping("/product/index")
public String index(){
return "/WEB-INF/index.jsp";
}
}
浏览器输入的就是url - 统一资源定位器,资源包括静态资源已经java应用程序.这些资源拥有唯一的一个地址
http://localhost:8081/boot/product/index
协议://服务器所在主机ip地址:端口号/项目的上下文路径/控制层程序的映射路径
http协议 - 无状态的协议
localhost/127.0.0.1 - 都是本地主机的意思
端口号-8081 - 计算机中端口号是和应用程序之间是1:1的关系.根据端口号来定位到具体的打开的哪个tomcat
项目的上下文路径 - 访问的是这个服务器上的具体的哪个项目
映射路径 - 具体定位到访问的是控制层的哪段代码.
配置前缀和后缀
spring:
mvc:
view:
prefix: /WEB-INF/
suffix: .jsp
转发和重定向
转发
@GetMapping("/day01/f1")
public String hello12(){
//service.delById(10);
//return "forward:后台的资源的映射路径"
System.out.println("f1....");
return "forward:/day01/to1";
}
@GetMapping("/day01/to1")
public String hello1(){
//service.findAll();
System.out.println("to1...");
return "day02/index";
}
效果
:
- 地址栏地址变化情况-没有变化
- 共享request作用域中的数据.
- 服务器端的跳转
示意图
重定向
本质:就相当于从浏览器端发送请求.意味着是不能够直接重定向到WEB-INF下的资源.
return "redirect:/day01/to1";
效果
:
- 地址栏地址变化情况:地址栏变化了 - 变成最后一次客户端的请求
- 不能够共享request作用域中的数据的.
- 发生在客户端的跳转
- 重定向可以跳转到其他站点.
示意图
作用域
理解为tomcat服务器内部的内存区域.不同的作用域的生命周期是不一样的.相当于”容器”
后端把db中或者经过处理的数据放入到作用域中.然后在jsp中/controller中获取这个作用域中的数据.
Request作用域
可以把数据放入到作用域中,可以从作用域中获取数据.
生命周期 - 一次请求[客户端到server服务器端的请求],一次响应.
输入数据
后端controller如何接受页面传过来的数据.
a-单个参数
<%-- 传入一个参数 key=value --%>
<a href="/boot/param/del?id=100">删除</a>
/**
* 接受一个参数
* 保证方法的参数的名称和a的href中的key保持一致即可
* @return
*/
@GetMapping("/del")
public String del(Integer id){
System.out.println("id:"+id);
return "/day02/param";
}
a-多个参数
<%-- 多参--%>
<a href="/boot/param/search?id=100&username=admin">查询</a>
/**
* 多参处理方式一:采用"摆地摊"的方式
* /boot/param/search?id=100&username=admin
* @return
*/
@GetMapping("/search")
public String search(String username,Integer id){
System.out.println(id+":"+username);
return "/day02/param";
}
普通按钮-多个参数
<%-- 普通按钮配合js事件搭配--%>
<button type="button" onclick="register()">提交</button>
<script>
function register(){
//1. 获取表单中的数据
let username = document.getElementById("username").value;
let password = document.getElementById("password").value;
//2. 发送
window.location='/boot/param/btn?username='+username+"&password="+password;
}
</script>
/**
* 普通按钮 - 单击事件
* @return
*/
@GetMapping("/btn")
public String search2(User user){
System.out.println(user);
return "/day02/param";
}
form表单
get请求 - http://localhost:8081/boot/param/login?username=admin&password=123
地址栏会展示请求的地址
get请求后面拼接的参数是有限制的,不同的浏览器略有差别的.范围[2kb~4kb]
get请求通常是用来进行查询,GET请求会被缓存
GET请求参数是通过URL传递的,多个参数以&连接
<%-- 默认就是get请求 - form表单给定name属性的值 name属性的值会自动成为传数据的key,输入的值就是我们的value --%> <form action="/boot/param/login" method="get"> <input type="text" name="username"> <input type="password" name="password"> <input type="submit" value="login"> </form>
/** * 只要保证form表单控件的name属性的值和此处的对象的属性名称保持一致. * @param user * @return */ @GetMapping("/login") public String login(User user){ System.out.println(user); return "/day02/param"; }
post请求 - 增删改.
post请求会比post请求更加安全
post请求不会缓存
POST请求放在request body中
post请求的参数理论上是没有限制的.
form的method设置成post即可 @PostMapping("/login") public String login(User user){ System.out.println(user); return "/day02/param"; }
注意点
[org.springframework.web.HttpRequestMethodNotSupportedException: Request method ‘POST’ not supported]
ajax提交
ajax技术 - 页面不刷新技术,项目使用频率最多的技术
ajax发送过来的请求,一定是返回json数据出去.不会涉及到页面的跳转.
ajax技术
- 传统的纯js写法
- jquery的写法,jquery对js的封装,属于js框架
jquery-ajax
get请求
key-value形式
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: admin
Date: 2021/9/26
Time: 11:08 上午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<%= new Date()%>
<input type="text" id="username">
<button type="button" onclick="get()">ajax-get请求</button>
<div id="outer"></div>
<script src="/boot/plugins/jquery/jquery.min.js"></script>
<script>
function get(){
//1. 获取文本框的值
//只有jquery对象才能资格调用jquery方法.
//js对象
//let username = document.getElementById("username");
//jquery对象
let username = $("#username").val();
//发送ajax-get请求
// $.get(url,参数,fun);
//参数形式1 - key=value的形式
let param = "username="+username;
$.get('/boot/ajax/get',param,function(res){
console.log(res);
//此处的res就是后端返回过来的json数据
//res本质上就是自动是js的json对象
//通过json对象.key去访问json的value
let arr = res.data;
let str = "";
for(let i=0;i<arr.length;i++){
str+=arr[i].id+":"+arr[i].username+" ";
}
// document.getElementById("outer").innerHTML=str;
$("#outer").html(str);
});
}
</script>
</body>
</html>
/**
* 1. 接受key=value形式的数据
* 2. 直接返回一个json数据
* @return
*/
@GetMapping("/get")
@ResponseBody
public Result get(String username){
User user = new User();
user.setId(100);
user.setUsername(username);
User user2 = new User();
user2.setId(200);
user2.setUsername("tom");
List<User> userList = new ArrayList<>();
userList.add(user);
userList.add(user2);
return new Result("200"," 查询成功",userList);
}
发送的数据就是json对象的格式
function get2(){ //jquery对象 let username = $("#username").val(); let password = $("#password").val(); //参数形式2 - 直接是一个json对象格式 let param = {username:username,password:password}; $.get('/boot/ajax/get2',param,function(res){ console.log(res); let user = res.data; console.log(user) $("#outer").html(user.username+":"+user.password); }); }
@GetMapping("/get2") @ResponseBody public Result get2(User user){ return new Result("200"," 查询成功",user); }
post提交-form表单-ajax提交-
<form action="/boot/ajax/get4" id="login_form">
<input type="text" name="username">
<input type="text" name="password">
<input type="button" onclick="login2()" value="提交">
</form>
@PostMapping("/login2")
@ResponseBody
public Result login(User user){
return new Result("200"," 查询成功",user);
}
也可以传入一个json对象
let uname = $("#uname").val(); let pwd = $("#pwd").val(); let param={username:uname,password:pwd}; $.post('/boot/ajax/login2',param,function(res){ console.log(res); })
java后端代码同上
jquery-原生ajax
参数格式 - key-value以及json对象
//参数格式1 - key-value 永远是通用的. //let param = $("#login_form2").serialize(); //参数格式2 - json对象 let uname = $("#uname2").val(); let pwd = $("#pwd2").val(); let param={username:uname,password:pwd}; //param = JSON.stringify(param);//json对象转换成json字符串 // 参数格式3 - json字符串 //let param = '{"username":'+uname+',"password":'+pwd+'}'; $.ajax({ type:'get', url:'/boot/ajax/login3', data: param, success:function(res){ console.log(res) } })
@GetMapping("/login3") @ResponseBody public Result login3(User user){ return new Result("200"," 查询成功",user); }
post请求 - json字符串
针对json字符串
post请求一定要加上contentType:’application/json’
如果是json字符串,一定要加上dataType:’json’
$.ajax({ type:'post', contentType:"application/json", url:'/boot/ajax/login4', dataType:"json", data: param, success:function(res){ console.log(res) } })
控制层代码
/** * 如果传入过来的是json字符串,json字符串中的数据自动绑定到实体对象中. * 在实体对象前面@RequestBody - json字符串->json对象->绑定对象 * @param user * @return */ @PostMapping("/login4") @ResponseBody public Result login4(@RequestBody User user){ return new Result("200"," 查询成功",user); }
发送key-value以及json对象
//param={"username":uname,"password":pwd}; param=$("#login_form2").serialize(); $.ajax({ type:'post', //contentType:"application/json", url:'/boot/ajax/login2', //dataType:"json", data: param, success:function(res){ console.log(res) } })
Controller和RestController
输出数据
- 直接转发到某个jsp页面 - @Controller
- 返回一个json数据出去 - @Controller+@ResponseBody
- 如果某个控制层的所有的方法都是转换成json数据出去,那么就在控制类上直接加@RestController
- @RestController = @Controller+@ResponseBody
总结传参
get请求
@GetMapping来接受
- a标签
- 直接在url输入地址
- form - method=’get’
- 普通按钮 - window.location=’’
- $.get
- $.ajax({type:’get’})
post请求
@PostMapping来接受
- form - method - ‘post’
- $.post
- $.ajax({type:’post’})
参数的格式
传参
a. key-value形式
b. json对象
上面这俩种,后端接受的时候,要么采用散列的数据或者实体对象来接受.
传参 - json字符串
$.ajax({ type:'post', contentType:"application/json", url:'/boot/ajax/login4', dataType:"json", data: param, success:function(res){ console.log(res) } })
后端接受的时候,一定要在接受的实体对象前面加上@RequestBody
SpringBoot整合Mybatis
导入依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <exclusions> <exclusion> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> </exclusion> </exclusions> </dependency>
mybatis-spring场景启动器依赖
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency>
配置文件
spring: mvc: view: prefix: /WEB-INF/ suffix: .jsp datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/j03s?useSSL=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true username: root password: root mybatis: type-aliases-package: tech.aistar.model.entity configuration: map-underscore-to-camel-case: true # config-location: classpath:mybatis/mybatis-config.xml
需要配置一个mapper接口的扫描 - 所有的mapper动态代理对象受spring容器来管理
@SpringBootApplication @MapperScan(basePackages = "tech.aistar.mapper") public class SpringbootJ03sApplication { public static void main(String[] args) { SpringApplication.run(SpringbootJ03sApplication.class, args); } }