专栏首页关忆北.Spring Boot 学习三:静态资源、整合 Thymeleaf 页面模板、@RestControllerAdvice

Spring Boot 学习三:静态资源、整合 Thymeleaf 页面模板、@RestControllerAdvice

1.静态资源

在 Spring Boot 中,默认情况下,一共有5个位置可以放静态资源,五个路径分别是如下:

classpath:/META-INF/resources/ classpath:/resources/ classpath:/static/ classpath:/public/

2.整合Thymeleaf

Thymeleaf 是支持HTML的 Java 模板引擎,它类似于 Velocity、FreeMarker 等传统 Java 模板引擎。 Thymeleaf 模板后缀为 .html,可以直接被浏览器打开。 引入pom:

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

创建Controller

@Controller
public class IndexController {
    @GetMapping("/index")
    public String index(Model model) {
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User u = new User();
            u.setId((long) i);
            u.setName("javaboy:" + i);
            u.setAddress("深圳:" + i);
            users.add(u);
        }
        model.addAttribute("users", users);
        return "index";
    }
}
public class User {
    private Long id;
    private String name;
    private String address;
    //getter/setter
}

HTML

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="1">
    <tr>
        <td>编号</td>
        <td>用户名</td>
        <td>地址</td>
    </tr>
    <tr th:each="user : ${users}">
        <td th:text="${user.id}"></td>
        <td th:text="${user.name}"></td>
        <td th:text="${user.address}"></td>
    </tr>
</table>
</body>
</html>

2.@RestControllerAdvice注解

增强的 Controller:适用于所有@RequestMapping方法的@ExceptionHandler、@InitBinder和@ModelAttribute方法。 所以其作用是:

  1. 全局异常处理
  2. 全局数据绑定
  3. 全局数据预处理

全局异常处理

@RestControllerAdvice(packages="xxxController")
public class MyGlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView customException(Exception e) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("message", e.getMessage());
        mv.setViewName("myerror");
        return mv;
    }
}

在该类中可以定义多个方法,不同的方法处理不同的异常,空指针、数组越界、自定义业务异常等,也可以定义一个Exception,处理所有的异常。 @ExceptionHandler 注解用来指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来。

全局数据绑定 全局数据绑定功能可以用来做一些初始化的数据操作,我们可以将一些公共的数据定义在添加了 @ControllerAdvice 注解的类中,这样,在每一个 Controller 的接口中,就都能够访问导致这些数据。

@ControllerAdvice
public class MyGlobalExceptionHandler {
    @ModelAttribute(name = "my")
    public Map<String,Object> mydata() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("age", 99);
        map.put("gender", "男");
        return map;
    }
}

@ModelAttribute 注解标记该方法的返回数据是一个全局数据,全局数据的 key 就是返回的变量名,value 就是方法返回值。

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model) {
        Map<String, Object> map = model.asMap();
        System.out.println(map);
        return "hello controller advice";
    }
}

全局数据预处理

public class Book {
    private String name;
    private Long price;
    //getter/setter
}
public class Author {
    private String name;
    private Integer age;
    //getter/setter
}

新增接口

@PostMapping("/book")
public void addBook(Book book, Author author) {
    System.out.println(book);
    System.out.println(author);
}

问题: 两个实体类都有相同的参数name,在解析时无法区分。 1.给接口变量取别名

@PostMapping("/book")
public void addBook(@ModelAttribute("b") Book book, @ModelAttribute("a") Author author) {
    System.out.println(book);
    System.out.println(author);
}

2.进行数据预处理 @ControllerAdvice 标记的类中

@InitBinder("b")
public void b(WebDataBinder binder) {
    binder.setFieldDefaultPrefix("b.");
}
@InitBinder("a")
public void a(WebDataBinder binder) {
    binder.setFieldDefaultPrefix("a.");
}
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/weixin_42313773复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 极简 Spring Boot 整合 Thymeleaf 页面模板

    虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在做前后端不分的开发,而在前后端不分的开发中,我们就会需要后端页面模板(实际上,即使前后端...

    江南一点雨
  • 重学SpringBoot系列之整合静态资源与模板引擎

    当然,可以通过spring.resources.static-locations配置指定静态文件的位置。但是要特别注意,一旦自己指定了静态资源目录,系统默认的静...

    大忽悠爱学习
  • Spring Boot 与 kotlin 使用Thymeleaf模板引擎渲染web视图

    在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源,使用Spring Boot 与 kotlin如何去支持这些静态资源?,很简单。

    全科
  • Springboot系列:Springboot与Thymeleaf模板引擎整合基础教程(附源码)

    前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的...

    程序员十三
  • SpringBoot---Web开发第一部分

    例如: 访问localhost:8080/abc时,如果没人处理,那么默认就去这些存在的静态资源文件夹中寻找对应资源

    大忽悠爱学习
  • javaweb-springboot-2-73

    https://spring.io/projects/spring-boot 有助于开发工程,减少配置,使得开发者更关注于业务实现而非技术配置,创建java应...

    全栈程序员站长
  • Spring Boot开发Web应用

    《SpringBoot快速入门》 中我们完成了一个简单的RESTful Service,体验了快速开发的特性。在留言中也有朋友提到如何把处理结果渲染到页面上。那...

    程序猿DD
  • Spring boot集成模板引擎swagger2实现

    系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取。 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:...

    IT架构圈
  • Spring Boot入门

    Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用...

    xiangzhihong
  • Spring Boot搭建Web应用

    Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用...

    xiangzhihong
  • springboot学习笔记-thymeleaf

    简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下三个极吸...

    Janti
  • Thymeleaf一篇就够了

    大家好,我是bigsai,今天我们来学习Thymeleaf,如果你对Thymeleaf比较陌生也不要紧,它很容易学习与理解,并有着自己鲜明的特色。

    bigsai
  • SpringBoot静态化

    src/main/resources/templates/*.html,默认是从templates文件夹里找html资源。

    南风
  • Spring Cloud 2.x系列之模板引擎thymeleaf

    相对html+js的传统设计,现在很多网站都采用div&css+标签化+模块化的设计。模板引擎根据一定的语义,将数据填充到模板中,产生最终的HTML页面。模板引...

    BUG弄潮儿
  • 『互联网架构』软件架构-Spring boot集成模板引擎swagger2实现(87)

    系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取。Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:/...

    IT架构圈
  • Springboot整合web相关技术

    它是基于Servlet 技术实现的, 简单的来说,过滤器就是起到过滤的作用,在web项目开发中帮我们过滤一些指定的 url做一些特殊的处理

    上分如喝水
  • 看到Thymeleaf之后,我立马放弃了jsp!

    2.jsp 技术已经是很多年前的老技术了,现在的主流框架都不推荐使用,基本被淘汰了。

    知否技术

扫码关注腾讯云开发者

领取腾讯云代金券