springboot01(系统学习):概念 案例 热部署 自定义banner action的写法 过滤器 拦截器

1 springboot概念

springboot:  一种约定优于配置: 去繁就简  简化ssm的框架

javaweb:jsp+servlet        
ssm : 对action和dao进行封装  配置麻烦

springboot :简化配置

Spring Boot 是一种用来简化 Spring 应用的初始搭建以及开发过程的全新框架。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。spring Boot采用约定大约配置的方式,大量的减少了配置文件的使用。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。 




特点:
(1)可以创建独立的[Spring]应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化[Maven]配置;为各种应用场景设置了不同的启动器
(4)尽可能自动配置Spring容器;
(5)绝对没有代码生成,不需要XML配置。


为所有 Spring 开发提供一个更快更广泛的入门体验。

SpringBoot框架中还有两个非常重要的策略:**开箱即用和约定优于配置**。

1.1 开箱即用

开箱即用,Outofbox,是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。

springBoot将繁琐的配置和依赖封装到jar包中.此jar引入即可使用.只需要少量的配置就可以拥有其功能的方式 叫做 “开箱即用”。

1.2 约定优于配置

约定优于配置,Convention over  configuration,是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,  但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。

约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。

在SpringBoot中,约定大于配置可以从以下两个方面来理解:

开发人员仅需规定应用中不符合约定的部分+在没有规定配置的地方,采用默认配置。
开发人员配置 项目就使用此配置   
开发人员没有配置的  项目就使用默认配置

那么SpringBoot中有哪些约定呢?
Maven的目录结构。默认有resources文件夹,存放资源配置文件。src-main-resources,src-main-java。默认的编译生成的类都在targe文件夹下面。

spring boot默认的配置文件必须是,也只能是application.命名的yml文件或者properties文件,且唯一。

application.yml中默认属性。数据库连接信息必须是以spring.datasource: 为前缀

2 案例1

2.1 project-model-spring initializer

指定加载目录的网页

在这里插入图片描述在这里插入图片描述

2.1 启动器选择+版本

2.3 指定位置

在这里插入图片描述

2.4 目录介绍

在这里插入图片描述

  • pom.xml文件
注意jdk版本和springboot版本
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zhiyou100</groupId>
    <artifactId>springboot01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot01</name>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    ...
</project>

2.5 运行启动类

在这里插入图片描述

2.6 页面访问

http://localhost:8080/static01.html

http://localhost:8080/public01.html

默认页面:index.html

3 idea热部署

当更改资源时 编译软件会自动重启项目
注意:不是万能的  万全之策 清除编译后  手动启动

3.1 setting设置 maven的自动构建项目

在这里插入图片描述

3.2 配置registry

在这里插入图片描述

3.3 添加热部署依赖

<!--添加热部署依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

3.4 热部署插件

<!--引入maven的插件:实现maven对项目构建的管理-->
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <!--以下配置是:热部署-->
    <configuration>
        <fork>true</fork>
        <addResources>true</addResources>
    </configuration>
</plugin>

3.5 核心配置文件

# 位置:application.properties
spring.devtools.restart.enabled=true

3.6 效果

在这里插入图片描述

4 自定义logo

  • 在resources中添加名字为banner.txt文本内容

在这里插入图片描述


                                .::::.
                              .::::::::.
                              :::::::::::
                              ':::::::::::..
                               :::::::::::::::'
                                ':::::::::::.
                                  .::::::::::::::'
                                .:::::::::::...
                               ::::::::::::::''
                   .:::.       '::::::::''::::
                 .::::::::.      ':::::'  '::::
                .::::':::::::.    :::::    '::::.
              .:::::' ':::::::::. :::::      ':::.
            .:::::'     ':::::::::.:::::       '::.
          .::::''         '::::::::::::::       '::.
         .::''              '::::::::::::         :::...
      ..::::                  ':::::::::'        .:' ''''
   ..''''':'                    ':::::.'
  • 参考
https://patorjk.com/software/taag/#p=display&f=Ivrit&t=spring01%0A

5 测试springboot的action的参数列表

springboot的action写法和ssm的action完全相同
1: 单值类型:8基本/string/date:::方法参数用于接收同名的请求参数
2: 对象类型:Student s:::方法参数对象的属性来接收同名的请求参数
3: HttpServletRequest类型:request请求对象:::获取请求参数+获取请求头+请求转发请求包含+request
    域+其他功能
4: HttpServletResponse类型:response响应对象:::设置响应题+设置响应头+重定向+其他功能
5: HttpSeesion类型:session回话对象::session域
6: model类型:设置request域属性
7: MultiPartFile类型::多部件表单的文件域
8: @PathVariable修饰的参数::url模板映射
9: @RequestBody修饰的参数::请求是json对象

action

package com.zhiyou100.action;


import com.zhiyou100.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/test02")
public class Test02 {
//    1: 单值类型:8基本/string/date:::方法参数用于接收同名的请求参数
      @RequestMapping("/m1.action")
      @ResponseBody
      public String  method01(int age,int id,String name){
           return "参数类型:单值类型:"+age+"::"+name+"::"+id;
      }

//    2: 对象类型:Student s:::方法参数对象的属性来接收同名的请求参数
     @RequestMapping("/m2.action")
     @ResponseBody
     public String  method02(Student s){
         return "参数类型:对象类型:"+s.toString();
     }

//    3: HttpServletRequest类型:request请求对象:::获取请求参数+获取请求头+请求转发请求包含+request
//        域+其他功能
    @RequestMapping("/m3.action")
    @ResponseBody
    public String  method03(HttpServletRequest req){
        return "参数类型:HttpServletRequest类型:"+req.getParameter("age")+":"+ req.getParameter("id")+":"+ req.getParameter("name");
    }

//    4: HttpServletResponse类型:response响应对象:::设置响应题+设置响应头+重定向+其他功能
    @RequestMapping("/m4.action")
    @ResponseBody
    public void  method04(Student s, HttpServletResponse resp)throws Exception{
          resp.setCharacterEncoding("utf-8");
          resp.setContentType("text/html;charset=utf-8");
          resp.getWriter().println("参数类型:HttpServletResponse类型:"+s);
    }

//    5: HttpSeesion类型:session回话对象::session域
    @RequestMapping("/m5.action")
    @ResponseBody
    public String  method05(Student s, HttpSession session){
        return "参数类型:HttpSeesion类型:"+s+":::sessionId="+session.getId();
    }
//   6: model类型:设置request域属性
    @RequestMapping("/m6.action")
    public String  method06(Model model,HttpServletRequest req){
          model.addAttribute("hehe","hehe_value");
          return "forward:/test02/m62.action";//跳转到m62
    }
    @RequestMapping("/m62.action")
    @ResponseBody
    public String  method062(HttpServletRequest req){
        return "参数类型:Model类型:"+req.getParameter("age")+":"+ req.getParameter("id")+":"+ req.getParameter("name")+"::request域属性hehe="+req.getAttribute("hehe");
    }

//    7: MultiPartFile类型::多部件表单的文件域
    @RequestMapping("/m7.action")
    @ResponseBody
    public String  method07(Student s, @RequestParam("file") MultipartFile file){
        return "参数类型:MultipartFile类型:"+s+"::上传图片:"+file.getOriginalFilename();
    }
//    8: @PathVariable修饰的参数::url模板映射
    @RequestMapping("/m8/{score}.action")
    @ResponseBody
    public String  method08(Student s, @PathVariable("score") float score){
        return "参数类型:@PathVariable类型:"+s+"::score="+score;
    }
//    9: @RequestBody修饰的参数::请求是json对象
    @RequestMapping("/m9.action")
    @ResponseBody
    public String  method09(@RequestBody Student s){
        return "参数类型:@RequestBody类型:"+s.toString();
    }
}

html

<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<h1>测试 action的方法参数类型</h1>
<a  href="/test02/m1.action?id=11&name=hmm&age=18">参数是单值类型</a><br/>
<a  href="/test02/m2.action?id=11&name=hmm&age=18">参数是对象类型</a><br/>
<a  href="/test02/m3.action?id=11&name=hmm&age=18">参数是HttpServletRequest类型</a><br/>
<a  href="/test02/m4.action?id=11&name=hmm&age=18">参数是HttpServletResponse类型</a><br/>
<a  href="/test02/m5.action?id=11&name=hmm&age=18">参数是HttpSeesion类型</a><br/>
<a  href="/test02/m6.action?id=11&name=hmm&age=18">参数是model类型</a><br/>
<form action="/test02/m7.action" method="post" enctype="multipart/form-data">
    age:<input  type="text" name="age"/><br/>
    name:<input  type="text" name="name"/><br/>
    id:<input  type="text" name="id"/><br/>
    file:<input  type="file" name="file"/><br/>
    <input  type="submit" value="文件上传"/><br/>
</form>
<a  href="/test02/m8/11.5.action?id=11&name=hmm&age=18">参数是@PathVariable修饰的参数</a><br/>
<a  href="javascript:test09();">参数是@RequestBody修饰的参数</a><br/>
<script type="text/javascript">
    function test09(){
        $.ajax({
            type:"post",
            url:"/test02/m9.action",
            success:function(data){alert(data);},
            dataType:"text",
            data:'{"name":"韩梅梅","age":11,"id":1001}',//请求参数必须是json格式的字符串
            //可以使用var jsonStr=JSON.stringify(jsonObj);方法由json对象获取字符串
            contentType:"application/json;charset=utf-8",/*请求参数是json:必须加请求头contentType 指定请求参数的类型*/
        });
    }
</script>

6 测试springboot的action的返回值类型

1:返回值类型:String::逻辑路径(请求转发+重定向)
2:返回值类型:ModelAndView::request域属性+逻辑路径
3:返回值类型:@ResponseBody String:::响应一个字符串(拼凑响应体)
4:返回值类型:@ResponseBody Student:::响应一个josn对象
5:返回值类型:@ResponseBody void:::没有响应内容
6:返回值类型:ResponseEntry<byte[]>::文件下载

准备工作

在核心配置文件application.properties中配置视图解析器

# 设置视图解析器
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html

action

package com.zhiyou100.action;
...

@Controller
@RequestMapping("/test03")
public class Test03 {
        @RequestMapping("/m10.action")
        public String  method01(){
            System.out.println("/m10.action");
            return "success";
        }
        //1:返回值类型:String::逻辑路径(请求转发+重定向)
        //默认请求转发到页面
        @RequestMapping("/m11.action")
        public String  method011(){
            System.out.println("/m11.action");
            return "success";
        }

        //请求转发到action
        @RequestMapping("/m12.action")
        public String  method012(){
            System.out.println("/m12.action:::请求转发到action");
            return "forward:/test03/m10.action";
        }

        //重定向到页面
        @RequestMapping("/m13.action")
        public String  method013(){
            System.out.println("/m13.action:::重定向到页面");
            return "redirect:/success.html";
        }

        //重定向到action
        @RequestMapping("/m14.action")
        public String  method014(){
            System.out.println("/m14.action:::重定向到action");
            return "redirect:/test03/m10.action";
        }


        //2:返回值类型:ModelAndView::request域属性+逻辑路径
        @RequestMapping("/m2.action")
        public ModelAndView method02(){
            ModelAndView mdv=new ModelAndView();
            mdv.addObject("aa","aa_value");
            mdv.setViewName("success");
            return mdv;
        }

        //3:返回值类型:@ResponseBody String:::响应一个字符串(拼凑响应体)
        @RequestMapping("/m3.action")
        @ResponseBody
        public String method03(){
            return "拼凑响应体:success";
        }

        //4:返回值类型:@ResponseBody Student:::响应一个josn对象
        @RequestMapping("/m4.action")
        @ResponseBody
        public Student method04(){
            return new Student().setSex("女").setAge(11).setId(1001).setName("韩梅梅");
        }

        //5:返回值类型:@ResponseBody void:::没有响应内容
        @RequestMapping("/m5.action")
        @ResponseBody
        public void method05(HttpServletResponse resp)throws Exception{
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().println("响应是void::拼凑页面:success");
        }

        //6:返回值类型:ResponseEntry<byte[]>::文件下载
        @RequestMapping("/m6.action")
        public ResponseEntity<byte[]> method06(String fileName,HttpServletRequest req)throws Exception{
            File file=new File("C:\\Users\\Administrator\\Desktop\\img",fileName);
            FileInputStream fin=new FileInputStream(file);
            byte[] arr=new byte[(int)file.length()];
            fin.read(arr);
            fin.close();

            HttpHeaders httpHeaders=new HttpHeaders();
            httpHeaders.set("content-type",req.getServletContext().getMimeType(fileName));//响应内容类型
            httpHeaders.set("content-disposition","attachment;filename="+fileName);//以附件形式下载
            return new ResponseEntity<byte[]>(arr,httpHeaders, HttpStatus.OK);


        }

}

页面

<h1>测试 action的方法返回值</h1>
<a  href="/test03/m11.action">//1:返回值类型:String::逻辑路径(请求转发+重定向)::默认请求转发到页面</a><br/>
<a  href="/test03/m12.action">//1:返回值类型:String::逻辑路径(请求转发+重定向)::请求转发到action</a><br/>
<a  href="/test03/m13.action">//1:返回值类型:String::逻辑路径(请求转发+重定向)::重定向到页面</a><br/>
<a  href="/test03/m14.action">//1:返回值类型:String::逻辑路径(请求转发+重定向)::重定向到action</a><br/>
<a  href="/test03/m2.action">//2:返回值类型:ModelAndView::request域属性+逻辑路径</a><br/>
<a  href="/test03/m3.action">//3:返回值类型:@ResponseBody String:::响应一个字符串(拼凑响应体)</a><br/>
<a  href="/test03/m4.action">//4:返回值类型:@ResponseBody Student:::响应一个josn对象</a><br/>
<a  href="/test03/m5.action">//5:返回值类型:@ResponseBody void:::没有响应内容</a><br/>
<a  href="/test03/m6.action?fileName=33.jpeg">//6:返回值类型:ResponseEntry<byte[]>::文件下载</a><br/>

7 过滤器和拦截器

7.1 不同和相同

  • 相同
都可以对action请求进行拦截
都可以选择放行或者不放行
都可以在放行前后添加代码:对功能进行扩展
  • 不同之处
1 实现的接口不同:filter/MethodInterceptor
2 拦截的资源不同:拦截所有请求/只能拦截action
3 原理不同:函数回调/反射动态登录
4 是否依赖web容器:

7.2 通过注解WebFilter+ServletComponentScan实现过滤器

  • 创建过滤器
package com.zhiyou100.filter_interceptor;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(urlPatterns = {"/*","*.action","*.js"})
public class MyFilter01  implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
           HttpServletRequest req=(HttpServletRequest)request;
           System.out.println("filter01 拦截到请求:"+req.getServletPath());
           System.out.println("filter01:::放行前");
           chain.doFilter(request,response);
            System.out.println("filter01:::放行后");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter01::初始化方法");
    }

    @Override
    public void destroy() {
        System.out.println("filter01::销毁方法");
    }
}
  • 在启动来上指定扫描的包
package com.zhiyou100;
...

//启动类只能扫描本包和子包中的bean为其创建对象
@SpringBootApplication
@ServletComponentScan(basePackages = {"com.zhiyou100.filter_interceptor"})//指定需要扫描的包
public class Springboot01Application {

    public static void main(String[] args) {

        SpringApplication.run(Springboot01Application.class, args);
    }
}
  • 测试

在这里插入图片描述

7.3 通过配置类实现过滤器

  • 创建过滤器:加注解@Component
package com.zhiyou100.filter_interceptor;
...
@Component
public class MyFilter02 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
           HttpServletRequest req=(HttpServletRequest)request;
           System.out.println("filter0222 拦截到请求:"+req.getServletPath());
           System.out.println("filter0222:::放行前");
           chain.doFilter(request,response);
            System.out.println("filter0222:::放行后");
    }
    ....
}

package com.zhiyou100.filter_interceptor;
...
@Component
public class MyFilter03 implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
           HttpServletRequest req=(HttpServletRequest)request;
           System.out.println("filter0333 拦截到请求:"+req.getServletPath());
           System.out.println("filter03333:::放行前");
           chain.doFilter(request,response);
            System.out.println("filter03:::放行后");
    }
    ...
}

  • 创建配置类:添加注解Configuration
package com.zhiyou100.config;
...
@Configuration  //指定当前类是配置类::起的作用类似于配置文件
public class MyFilterConfig {

    @Autowired
    private MyFilter02 myFilter02;
    @Autowired
    private MyFilter03 myFilter03;

    @Bean  //表示当前方法要创建一个对象
    public FilterRegistrationBean getFilterRegistrationBean1(){
        FilterRegistrationBean bean=new FilterRegistrationBean();
        bean.setFilter(myFilter02);
        bean.addUrlPatterns("/*","*.html","*.js");//拦截的资源
        bean.setName("f2_name");//web.xml中filter-name
        bean.setOrder(1);//过滤器的加载顺序
        return bean;
    }
    //有几个过滤器就写几个这样的方法
    @Bean  //表示当前方法要创建一个对象
    public FilterRegistrationBean getFilterRegistrationBean2(){
        FilterRegistrationBean bean=new FilterRegistrationBean();
        bean.setFilter(myFilter03);
        bean.addUrlPatterns("/*","*.html","*.js");//拦截的资源
        bean.setName("f3_name");//web.xml中filter-name
        bean.setOrder(2);//过滤器的加载顺序
        return bean;
    }

}

  • 测试

在这里插入图片描述

7.4 通过配置类实现拦截器

  • 创建拦截器:实现接口HandlerInterceptor 添加注解Component
package com.zhiyou100.filter_interceptor;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyInterceptor01  implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor01::::preHandle::拦截到请求:"+ request.getServletPath());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
         System.out.println("MyInterceptor01::::postHandle:::一般用于action处理后要执行的代码::更改域属性 更改视图");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor02::::afterCompletion:::视图解析器解析完后执行的内容:一般用于异常的处理");
    }
}

  • 创建配置类:实现接口WebMvcConfigurer 添加注解Configuration
package com.zhiyou100.config;

import com.zhiyou100.filter_interceptor.MyInterceptor01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration  //当前类是配置类
public class MyInterceptorConfig  implements WebMvcConfigurer {
    @Autowired
    private MyInterceptor01 myInterceptor01;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor01)
                .addPathPatterns("/test01/**","/test02/**")//指定拦截的请求
                .excludePathPatterns("/test03/**");//指定不拦截的请求
    }
}
  • 测试

在这里插入图片描述

8 springboot配置文件

8.1 设置项目路径和端口

  • 在application.properties中设置属性
#设置项目信息:项目路径+项目端口
server.servlet.context-path=/springboot01
server.port=8081
  • 测试

在这里插入图片描述

8.2 配置文件的位置

位置1:resources/config/application.properties
位置2:resources/application.properties
  • 注意:resources/config优先级高于 resources

在这里插入图片描述

8.3 配置文件的格式

格式1:application.properties 属性集文件
格式2:application.yml        yaml文件
  • 创建yaml文件
# 1:下层对上层缩进
# 2: 缩进空格个数不限
# 3: 同一个等级 缩进个数一致
# 4: 不能用制表符
# 5:  值和:之间必须有空格
server:
         servlet:
              context-path: /springboot013
         port: 8083
  • 注意:application.properties 优先级高于 application.yml

9 把maven项目转换为springboot项目

9.1 创建maven项目

在这里插入图片描述

9.2 补全resources的子目录

在这里插入图片描述

9.3 在pom.xml中引入springboot-starter-parent依赖

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

9.4 在resources下创建默认配置文件

在这里插入图片描述

9.5 创建启动类:添加注解springbootapplication

在这里插入图片描述

9.6 总结

springboot项目其实就是特殊的maven项目
1 默认配置文件
2 默认静态资源存储位置
3 引入spring-boot-starter-parent依赖
4 通过注解springbootapplication指定启动类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值