欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 SpringBoot系列:Web开发

程序员文章站 2022-04-15 23:24:19
目录一,简介二,配置文件与yaml语法基础三,Web开发1.SpringBoot对静态资源的映射问题2.SpringBoot中Thymeleaf引擎模板的使用3.Thymeleaf基础语法4.SpringBoot实现登录拦截5.Restful风格API构建6.SpringBoot的错误处理机制一,简介开发工具:IntelliJ IDEA 2020.1.1 x64俗话说的好,“工欲善其事必先利其器”,高效率完成工作,工具的好用于否起到至......

目录

一,简介

二,配置文件与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项目

荐
                                                        SpringBoot系列:Web开发

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

https://start.aliyun.com/

荐
                                                        SpringBoot系列:Web开发

直接点“下一步”

荐
                                                        SpringBoot系列:Web开发

荐
                                                        SpringBoot系列:Web开发

荐
                                                        SpringBoot系列:Web开发

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

 荐
                                                        SpringBoot系列:Web开发

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

荐
                                                        SpringBoot系列:Web开发

启动成功

荐
                                                        SpringBoot系列:Web开发

,配置文件与yaml语法基础

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

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

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

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

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

       2、当前目录; ​        

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

       4、classpath根路径。     

荐
                                                        SpringBoot系列:Web开发

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

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

YML配置文件

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

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

荐
                                                        SpringBoot系列:Web开发荐
                                                        SpringBoot系列:Web开发

  

 我们可以看到右侧的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;
}

荐
                                                        SpringBoot系列:Web开发

单元测试:

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

荐
                                                        SpringBoot系列:Web开发

输出结果:

荐
                                                        SpringBoot系列:Web开发

获取配置文件中的数据—@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";
    } 
}

荐
                                                        SpringBoot系列:Web开发

Thymeleaf 语法可以参照这个博客,比较详细:https://blog.csdn.net/zhangcc233/article/details/80831056

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";
        }
    }
 

测试

荐
                                                        SpringBoot系列:Web开发

总结下几个步骤:

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

 4.Restful风格API构建

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

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

荐
                                                        SpringBoot系列:Web开发

Restful风格api

荐
                                                        SpringBoot系列:Web开发

 

 5.SpringBoot的错误处理机制

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

荐
                                                        SpringBoot系列:Web开发   

  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;
 }
}

 

本文地址:https://blog.csdn.net/qq_19641369/article/details/107358608