【无废话版】SpringBoot系列:Web开发

目录

一,简介

二,配置文件与yaml语法基础

三,Web开发

 1.SpringBoot对静态资源的映射问题

 2.SpringBoot中Thymeleaf引擎模板的使用

 3.SpringBoot实现登录拦截

 4.Restful风格API构建

 5.SpringBoot的错误处理机制
 

一,简介

开发工具:IntelliJ IDEA 2020.1.1 x64

俗话说的好,“工欲善其事必先利其器”,高效率完成工作,工具的好用于否起到至关重要的作用,IDEA是目前java开发中最受欢迎的,简化的了很多配置,为开发者提供了很多插件。比如SpringBoot项目的构建。

本文用IDEA创建SpringBoot项目

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot 默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。它的核心设计思想是:约定优于配置,Spring Boot 所有开发细节都是依据此思想进行实现的。

优点:
    (1)快速创建独立运行的Spring项目以及与主流框架集成
    (2) 使用嵌入式的Servlet容器,应用无需打成WAR包
    (3) starters启动器自动依赖与版本控制
    (4)大量的自动配置,简化开发,也可修改默认值
    (5)无需配置XML,无代码生成,开箱即用
    (6) 准生产环境的运行时应用监控
    (7)与云计算的天然集成
如果非要说SpringBoot有什么缺点的额话,那就是方便的springboot让一些程序员丧失了对其封装实现原理有更深了解的机会。因为springboot是在spring基础上的再次封装。所以如果如果你需要对springboot深度定制,必须对spring本身有相当的了解。

1.创建SpringBoot项目

这里需要注意下,有些小伙伴使用默认的URL会出现创建失败的情况,我这里提供一个阿里巴巴的镜像地址,直接复制到custom 里就可以了

https://start.aliyun.com/

直接点“下一步”

项目创建好,maven自动下载包,默认情况下使用idea默认的maven仓库,这个仓库在国外,所以首次加载时间会很慢。提供解决方案,去maven官网下载maven仓库,然后修改setting配置文件的镜像,使用阿里镜像,国内的加载速度会快很多。

 

SpringBoot有内置的启动类,直接点击启动就好。

启动成功

,配置文件与yaml语法基础

在Spring Boot中,默认使用两种类型的配置文件来作为Spring Boot项目的全局配置:

1、application.properties
2、application.yml  (更常用)

注: 全局配置文件的名字固定不可改变,SpringBoot是默认加载他们的,写了别的名字的配置文件,要通过其他方式导入。

 SpringBoot将默认从以下四个位置开始加载配置文件: ​        

       1、当前目录下的/config子目录; ​ 

       2、当前目录; ​        

       3、一个classpath下的/config包; ​ 

       4、classpath根路径。     

配置文件的优先级按上面的排序从高到低是从1到4, SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与低优先级中属性不重复,则会共同存在—互补配置,如果重复,则高有先级会覆盖低优先级.

注:同优先级下,application.properties  加载优于 application.yml

YML配置文件

    SpringBoot支持properties 和 yml 两种格式的配置文件,但是在实际开发的过程中,yml配置文件的使用频率更高,yml天然的树状结构,使我们在阅读时对内容一目了然,更加友好。

YAML配置文件可以简单理解是xml+json+Properties 的融合,他将这者最简单易用的地方结合到了一起,可读性比这3者更强,而且所需的字符更少。

  

 我们可以看到右侧的yml配置文件内容会更有层次感一些,阅读会更加友好,更加简洁;  

   注:Idea可能会出现不支持yml文件的情况,此时需要们自行下载插件和进行配置

1.yml基础语法

   (1) 以 key:  value 的形式来表示数据, 注意: 在value值的前面要加空格;    

   (2)以空格的缩进来控制层级关系;只要左对齐一列数据,都是一个层级的,

如: 

server:
  port: 8080 #端口配置
  servlet:
    context-path: /demo #项目路径配置

  (3)大小写敏感;        

  (4)使用缩进表示层级关系;       

  (5)缩进时不允许使用Tab键,只允许使用空格;        

  (6)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。

2.在yml中value值的形式支持三种数据结构:

   2.1 字面量——即单个的、不可再分的值,常见的字面纯量如下所示:

     (1) 整数值    numberInt:  12       

     (2) 浮点数    numberDouble: 12.3         

     (3) 布尔值    isTrue: true(用on、1、true来表示true,off、0、false来表示false)       

     (4) 日期        date: 2018-11-12 (日期必须为ios8602格式,即为yyyy-MM-dd)           

     (5) 时间        dateTime: 2018-11-12T20:21:30+08:00(时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区 )              

     (6)  null        ~ 表示null                 

     (7) 字符串    username: ckzz    

使用字符串作为值时的注意事项:   

     在yaml中字符串默认是不用加双引号和单引号的。 

 双引号:如果使用了双引号,不会转义字符串中的特殊字符   

 栗子: name:  "zhangsan  \n  lisi"       则会得到: zhangsan  换行  lisi      ​  

单引号:如果使用了单引号,则会将特殊字符转义,即转换成一个字符串输出,不表示特殊含义      ​                    

 栗子:  name:  'zhangsan  \n  lisi'      则会得到: zhangsan  \n  lisi       

 注: 一般来说如果字符串中有特殊符号,我们就需要将它放在引号中:          

   如: str: “内容:字符串”   (这里的  :就是特殊符号)

  2.2、数组(list、set):       

 在yml中,value值也可以是数组或则list,此时我们用连字符“-”来表示           

 (1)普通方式书写               

 animals:                   
       - dog                     
       - cat                     
       - pig     

 注意:  - 连字符和值之间需要有空格             

(2)行内方式写法:     animals: [dog,pig,cat]

2.3、对象/map:   

     (1)普通写法:      

 user:                     
      name: 王二麻子                    
       age: 18                     
    gender: 男  

          

     (2)行内写法:   user: {name: 王二麻子,age: 18,gender: 男}   

     注: map和数组之间也可以互相嵌套,如: {languages: [c,java,c++],score :[80,89,80]}

测试用例:

student:
        id: 1
        name: 小林
        sex : 男
        teacher:
                 name: 林老师
                 sex: 男
        hoby:
             - 篮球
             - 足球

 注意:通过读取配置文件的信息注入到java对象,需要导入jar包:

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
@Component
@ConfigurationProperties(prefix ="student")
@Data
public class Student {
    private int id;
    private String name;
    private String sex;
    private List<String> hoby;
    private Teacher teacher;
}

单元测试:

注:通过Spring容器配置的对象的属性后,注入对象。

输出结果:

获取配置文件中的数据—@Value注解读取

     1、通过@Value注解将数据注入指定的属性中,先来进行配置文件的书写

     properties中:                  

 teacher.name=Mr.chen     teacher.id=10   

注:这个方式只能从properties结尾的配置文件中获取

   通过@Value注解将配置文件中的值读到对应的属性中:

@Data
@Component
public class Student1 {

    @Value("${teacher.id}")
    private  int id;

    @Value("${teacher.name}")
    private  String name;

}

这里提供一个从yml配置文件中,通过@Value 注解获取值

@Data
@Component
@PropertySource("classpath:application.yml")
@ConfigurationProperties(prefix = "student1")
public class Student1 {

    @Value("${student1.id}")
    private  int id;

    @Value("${student1.name}")
    private  String name;
}

,Web开发

     1.SpringBoot对静态资源的映射问题

(1) "/**" 访问当前项目的任何资源,都去(静态资源的文件夹)找映射

"classpath:/META‐INF/resources/", 
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目的根路径

(2)、欢迎页; 静态资源文件夹下的所有index.html页面;被"/**"映射;                

 localhost:8080/ 找index页面    

(3)、所有的 **/favicon.ico 都是在静态资源文件下找;

 2.SpringBoot中Thymeleaf引擎模板的使用

SpringBoot支持多种模板引擎,如 JSP、Velocity、Freemarker、Thymeleaf,但是其中Thymeleaf语法更简单,功能更强大,所以在SpringBoot中推荐使用该模板引擎。   

 Thymeleaf引擎模板的使用:

引入pom依赖:

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

设置thymeleaf版本,版本3检查html标签可以没有闭合结束符

 <properties>
        <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
        <thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version>
    </properties>

配置文件设置thymeleaf属性

spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
spring.thymeleaf.mode=HTML5

在resources/templates新建index.html文件

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Hello World!</title>
</head>
<body>
    <h1 th:inline="text">Hello</h1>
    <p th:text="${hello}"></p>
</body>
</html>

编写controller

@RequestMapping
@Controller
public class IndexController {

    @GetMapping("/helloHtml")
    public String testHelloHtml(Model model){
        model.addAttribute("hello", "你好");
         return "index";
    } 
}

Thymeleaf 语法可以参照官方文档(https://www.thymeleaf.org/index.html

3.SpringBoot实现登录拦截

 实例:实现简单的登录拦截

创建拦截器

public class LoginFilter extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("-----登录状态拦截");
        //判断Session中有没有admin对象
        Object admin = request.getSession().getAttribute("admin");
        if (admin!=null){
            System.out.println("----登录成功");
            return true;//放行
        }else {
            System.out.println("----还没有登录");
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("请先登入用户!");
            return false;
        }

    }
}

实现WebMvcConfigurer 接口,重写addInterceptors方法

@Configuration
public class LoginConfig implements WebMvcConfigurer {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginFilter())
                //拦截所有url,但是忽略“/login”和“/”
                .addPathPatterns("/**")
                .excludePathPatterns("/login")
                .excludePathPatterns("/aaa")
                .excludePathPatterns("/");
    }
}
 

controller里添加登入方法

/**
     * 登录
     *
     */
    @RequestMapping("/login")
    public  String login(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        Admin admin = new Admin();
        admin.setUsername(username);
        admin.setPassword(password);
        //可以去数据库查询
        //这里做查询 ,前端传过来有值就加入到Session作用域中
        if (admin != null) {
            //不为空
            request.getSession().setAttribute("admin",admin);
            return "back";
        }else {
            return "index";
        }
    }
 

测试

总结下几个步骤:

1、创建我们自己的拦截器类并继承 HandlerInterceptorAdapter类,重写preHandle方法。
2、创建一个Java类实现WebMvcConfigurer接口,并重写 addInterceptors 方法。
3、实例化我们自定义的拦截器,然后将对象手动添加到拦截器链中(在addInterceptors方法中添加)。

 4.Restful风格API构建

@GetMapping,处理 Get 请求    
@PostMapping,处理 Post 请求
@PutMapping,用于更新资源  		
@DeleteMapping,处理删除请求
@PatchMapping,用于更新部分资源

URI: /资源名称/资源标识 HTTP请求方式区分对资源CRUD操作

Restful风格api

 

 5.SpringBoot的错误处理机制

  1、默认效果,浏览器,返回一个默认的错误页面,如下所示:

  

  2、自定义错误页面:       

 (1)有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下】,发生此状态码的错误就会来到 对应的页面; 可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html);

(2)没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找;         

(3)以上都没有错误页面,就是默认来到SpringBoot默认的错误提示页面;

@ControllerAdvice
public class ErrorController {
    /**
     * 处理所有的异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = {Exception.class})
    public ModelAndView exceptions(Exception e) {
         ModelAndView modelAndView = new ModelAndView();
         modelAndView.addObject("error", e);
         modelAndView.setViewName("error");
     return modelAndView;
 }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

study@lin017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值