SpringBoot框架1


SpringBoot框架

  1. 属于spring全家桶的技术框架

  2. 微服务框架 - 快速搭建一个微服务项目 - [脚手架]

    微服务,分布式,集群三者的概念和区别

  3. SpringBoot相对于Springmvc框架,简化了大量的配置,一定要遵守它很多约定 - 约定大于俗成.

  4. 轻便和简洁,能够快速上手实现一个web应用程序的开发.

搭建一个Springboot工程

可以使用Spring Initializr插件来快速构建Springboot工程

场景启动器

SpringBoot将所有的功能场景,抽取出来,形成一个一个独立的startes启动器.

需要什么样的功能,就引入什么样的场景启动器.比如web项目的web场景启动器就是spring-boot-starter-web

  1. Developer Tools

    a. Lombok

    b. SpringBoot DevTools - 热部署

    c. Spring Configuration Proccessor 配置文件处理器

  2. Web

    a. Spring Web - 构建web项目必须要勾选的,包含了web工程需要的依赖.

  3. 模板引擎 - 第三方的jsp

  4. Security

    a. Spring Security - Spring权限安全框架.

  5. SQL

    a. Spring Data JPA - 持久层的技术框架

    b. Mybatis Framework - Mybatis框架

    c. Mysql Driver - Mysql的驱动

  6. No SQL

    a. Spring Data Redis - Redis非关系型数据库[键值对数据库]

    b. Spring Data Mongodb - 非关系型数据库[文档型数据库]

  7. Messaging

    a. Spring for RabbitMQ

  8. 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服务器

  1. 直接运行主程序中的main方法.

    SpringbootJ03sApplication主程序一定是在项目的根包下.

如何部署

  1. 用maven对整个项目进行打包

    mvn package
    它会自动去执行src/test/java所有的单元测试类中的所有的测试方法.
    
    希望 - 打包之后,不经过单元测试
    mvn package -Dmaven.test.skip=true
    

    效果就在target/springboot-j03s-0.0.1-SNAPSHOT.jar

  2. 直接将这个jar放入到阿里云服务器

    java -jar springboot-j03s-0.0.1-SNAPSHOT.jar
    

SpringBoot”依赖总管家”

未来导入依赖的步骤,先到”依赖总管家”中去寻找一下,是否管理了这个依赖,如果没有 - 百度 - maven仓库

如果存在了.直接拿过来引用,但是不需要加入版本号了.

  1. 每个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>
    
  2. 父工程的父工程

    <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.3.1.RELEASE</version>
    </parent>
    
  3. spring-boot-dependencies - “依赖总管家”

    对常见的依赖的版本进行了一个统一的管理.全部放在了

SpringBoot整合JSP

  1. SpringBoot对jsp支持不是特别友好.所以需要配置一下
<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-jasper</artifactId>
</dependency>
  1. src/main/webapp - 专门存放web资源[html,css,js,图片以及jsp文件]

    WEB-INF - 安全级别很高的文件夹.该文件夹下的文件不能够直接通过浏览器进行直接的访问.只能通过转发的方式.

    web.xml - web工程的描述性文件 - 不能缺.

  2. 配置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";
}

效果:

  1. 地址栏地址变化情况-没有变化
  2. 共享request作用域中的数据.
  3. 服务器端的跳转

示意图

重定向

本质:就相当于从浏览器端发送请求.意味着是不能够直接重定向到WEB-INF下的资源.

return "redirect:/day01/to1";

效果:

  1. 地址栏地址变化情况:地址栏变化了 - 变成最后一次客户端的请求
  2. 不能够共享request作用域中的数据的.
  3. 发生在客户端的跳转
  4. 重定向可以跳转到其他站点.

示意图

作用域

理解为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表单

  1. 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";
    }
    
  2. 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技术

  1. 传统的纯js写法
  2. 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字符串

  1. post请求一定要加上contentType:’application/json’

  2. 如果是json字符串,一定要加上dataType:’json’

    $.ajax({
      type:'post',
      contentType:"application/json",
      url:'/boot/ajax/login4',
      dataType:"json",
      data: param,
      success:function(res){
        console.log(res)
      }
    })
    
  3. 控制层代码

     /**
         * 如果传入过来的是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

输出数据

  1. 直接转发到某个jsp页面 - @Controller
  2. 返回一个json数据出去 - @Controller+@ResponseBody
  3. 如果某个控制层的所有的方法都是转换成json数据出去,那么就在控制类上直接加@RestController
  4. @RestController = @Controller+@ResponseBody

总结传参

get请求

@GetMapping来接受

  1. a标签
  2. 直接在url输入地址
  3. form - method=’get’
  4. 普通按钮 - window.location=’’
  5. $.get
  6. $.ajax({type:’get’})

post请求

@PostMapping来接受

  1. form - method - ‘post’
  2. $.post
  3. $.ajax({type:’post’})

参数的格式

  1. 传参

    a. key-value形式

    b. json对象

    上面这俩种,后端接受的时候,要么采用散列的数据或者实体对象来接受.

  2. 传参 - json字符串

    $.ajax({
      type:'post',
      contentType:"application/json",
      url:'/boot/ajax/login4',
      dataType:"json",
      data: param,
      success:function(res){
        console.log(res)
      }
    })
    

    后端接受的时候,一定要在接受的实体对象前面加上@RequestBody

SpringBoot整合Mybatis

  1. 导入依赖

      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <exclusions>
          <exclusion>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
          </exclusion>
        </exclusions>
    </dependency>
    
  2. mybatis-spring场景启动器依赖

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    
  1. 配置文件

    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
    
  1. 需要配置一个mapper接口的扫描 - 所有的mapper动态代理对象受spring容器来管理

    @SpringBootApplication
    @MapperScan(basePackages = "tech.aistar.mapper")
    public class SpringbootJ03sApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootJ03sApplication.class, args);
        }
    }
    

文章作者: 码农耕地人
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 码农耕地人 !
  目录