Spring Boot Flash属性

Spring Boot Flash属性教程展示了如何在 Spring 引导应用程序中创建闪存消息。

Spring 是一个流行的 Java 应用程序框架,Spring Boot 是 Spring 的演变,有助于 轻松创建独立的、生产级基于Spring的 应用程序。

Flash 消息是用于用户通知或存储表单输入的临时数据。 它们存储在会话中,并在检索后立即消失。

Spring 中的 Flash 消息是使用RedirectAttributesaddFlashAttribute()它们与RedirectView结合使用。

弹簧启动闪存属性示例

在下面的应用程序中,我们为通知和 用于记住表单输入值。我们有一个包含两个输入的表单。如果输入 值不符合验证条件,应用程序重定向到 表单页面并显示错误消息;这些消息作为闪存属性发送。

此外,还会记住表单的正确值。

src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           └───controller
│   │                   MyController.java
│   │
│   └───resources
│       └───templates
│               index.html
│               showMessage.html
└───test
    └───java  

这是 Spring 应用程序的项目结构。

绒球.xml


    4.0.0

    com.zetcode
    springflashmessage
    1.0-SNAPSHOT

    
        UTF-8
        17
        17
    

    
        org.springframework.boot
        spring-boot-starter-parent
        2.6.7
    

    

        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        

        
            org.hibernate
            hibernate-validator
            6.0.13.Final
        

    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                2.6.7
            
        
    


   

这是 Maven 文件。我们用于使用百里香叶进行模板化和表单数据的验证。pom.xmlspring-boot-starter-thymeleafhibernate-validator

com/zetcode/controller/MyController.java
package com.zetcode.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.view.RedirectView;
import org.thymeleaf.util.StringUtils;

import javax.validation.ConstraintViolationException;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Controller
@Validated
public class MyController {

    @RequestMapping("/")
    public String index(Model model) {

        return "index";
    }

    @RequestMapping("/message")
    public ModelAndView message(@RequestParam @Size(min = 2, max = 255) String name,
                                @RequestParam @Size(min = 2, max = 255) String occupation) {

        var msg = String.format("%s is a %s", name, occupation);

        Map params = new HashMap<>();
        params.put("message", msg);

        return new ModelAndView("showMessage", params);

    }

    @ExceptionHandler(ConstraintViolationException.class)
    public RedirectView handleError(ConstraintViolationException ex,
                                    WebRequest request,
                                    RedirectAttributes atts) {

        var name = request.getParameter("name");
        var occupation = request.getParameter("occupation");

        var errorMessages = new ArrayList();
        var violations = ex.getConstraintViolations();

        violations.forEach(violation -> {
            var error = String.format("%s: %s", violation.getPropertyPath(),
                    violation.getMessage());
            errorMessages.add(error);
        });

        if (!StringUtils.isEmptyOrWhitespace(name)) {
            atts.addFlashAttribute("name", name);
        }

        if (!StringUtils.isEmptyOrWhitespace(occupation)) {

            atts.addFlashAttribute("occupation", occupation);
        }

        atts.addFlashAttribute("messages", errorMessages);

        var redirectView = new RedirectView("/");

        return redirectView;
    }
}

这是。它响应来自客户端的请求。 它找出当前日期和时间,并将处理解析为模板,并向其传递数据。MyControllershowMessage.ftl

@Controller
@Validated
public class MyController {

注释验证带注释的请求参数。 在我们的例子中,我们使用两个注释。@Validated@Size

@RequestMapping("/")
public String index(Model model) {

    return "index";
}

根页返回索引视图,该视图将表单发送到客户端。

@RequestMapping("/message")
public ModelAndView message(@RequestParam @Size(min = 2, max = 255) String name,
                            @RequestParam @Size(min = 2, max = 255) String occupation) {

    var msg = String.format("%s is a %s", name, occupation);

    Map params = new HashMap<>();
    params.put("message", msg);

    return new ModelAndView("showMessage", params);

}

此操作将响应表单提交。两个输入参数,名称和职业, 用 注释。如果一切正常,则从参数构建一条消息 并随视图一起发送给客户端。@SizeshowMessage

@ExceptionHandler(ConstraintViolationException.class)
public RedirectView handleError(ConstraintViolationException ex,
                                WebRequest request,
                                RedirectAttributes atts) {

如果输入参数验证失败,则会抛出 a。我们在提供的异常处理程序中对异常做出反应。ConstraintViolationException

var name = request.getParameter("name");
var occupation = request.getParameter("occupation");

我们获取请求参数。它们用于保持正确的 表单输入值。

var errorMessages = new ArrayList();
var violations = ex.getConstraintViolations();

violations.forEach(violation -> {
    var error = String.format("%s: %s", violation.getPropertyPath(),
            violation.getMessage());
    errorMessages.add(error);
});

我们获取约束冲突并构建错误消息列表。 错误消息将显示在上面的索引表单页面中 窗体。

if (!StringUtils.isEmptyOrWhitespace(name)) {
    atts.addFlashAttribute("name", name);
}

if (!StringUtils.isEmptyOrWhitespace(occupation)) {

    atts.addFlashAttribute("occupation", occupation);
}

我们将填充的输入参数存储为 flash 属性,如果它们不为空且不包含仅空格。addFlashAttribute()

atts.addFlashAttribute("messages", errorMessages);

错误消息存储为 flash 属性。

var redirectView = new RedirectView("/");

return redirectView;

我们重定向到带有 .RedirectView

templates/index.html



    
    Home page
    



这是主页模板。它发送一个包含两个输入的表单:姓名和职业。 样式是使用语义 UI 库完成的。

如果有任何错误消息,将显示它们。

templates/showMessage.html



    
    Message



模板在表单成功时显示一条消息 处理。showMessage

com/zetcode/Application.java
package com.zetcode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application  {
    
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Application是设置 Spring 引导的入口点 应用。

你可能感兴趣的:(spring,boot,java,spring)