Spring Boot Flash属性教程展示了如何在 Spring 引导应用程序中创建闪存消息。
Spring 是一个流行的 Java 应用程序框架,Spring Boot 是 Spring 的演变,有助于 轻松创建独立的、生产级基于Spring的 应用程序。
Flash 消息是用于用户通知或存储表单输入的临时数据。 它们存储在会话中,并在检索后立即消失。
Spring 中的 Flash 消息是使用RedirectAttributes的
addFlashAttribute()
它们与RedirectView
结合使用。
弹簧启动闪存属性示例
在下面的应用程序中,我们为通知和 用于记住表单输入值。我们有一个包含两个输入的表单。如果输入 值不符合验证条件,应用程序重定向到 表单页面并显示错误消息;这些消息作为闪存属性发送。
此外,还会记住表单的正确值。
-
src
-
├───main
-
│ ├───java
-
│ │ └───com
-
│ │ └───zetcode
-
│ │ │ Application.java
-
│ │ └───controller
-
│ │ MyController.java
-
│ │
-
│ └───resources
-
│ └───templates
-
│ index.html
-
│ showMessage.html
-
└───test
-
└───java
这是 Spring 应用程序的项目结构。
-
<?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
-
http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<modelVersion>4.0.0</modelVersion>
-
-
<groupId>com.zetcode</groupId>
-
<artifactId>springflashmessage</artifactId>
-
<version>1.0-SNAPSHOT</version>
-
-
<properties>
-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
<maven.compiler.source>17</maven.compiler.source>
-
<maven.compiler.target>17</maven.compiler.target>
-
</properties>
-
-
<parent>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-parent</artifactId>
-
<version>2.6.7</version>
-
</parent>
-
-
<dependencies>
-
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-thymeleaf</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.hibernate</groupId>
-
<artifactId>hibernate-validator</artifactId>
-
<version>6.0.13.Final</version>
-
</dependency>
-
-
</dependencies>
-
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-maven-plugin</artifactId>
-
<version>2.6.7</version>
-
</plugin>
-
</plugins>
-
</build>
-
-
-
</project>
这是 Maven 文件。我们用于使用百里香叶进行模板化和表单数据的验证。pom.xml
spring-boot-starter-thymeleaf
hibernate-validator
-
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<String, Object> 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<String>();
-
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;
-
}
-
}
这是。它响应来自客户端的请求。 它找出当前日期和时间,并将处理解析为模板,并向其传递数据。MyController
showMessage.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<String, Object> params = new HashMap<>();
-
params.put("message", msg);
-
-
return new ModelAndView("showMessage", params);
-
-
}
此操作将响应表单提交。两个输入参数,名称和职业, 用 注释。如果一切正常,则从参数构建一条消息 并随视图一起发送给客户端。@Size
showMessage
-
@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<String>();
-
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
-
<!DOCTYPE html>
-
<html lang="en" xmlns:th="http://www.thymeleaf.org">
-
<head>
-
<meta charset="UTF-8">
-
<title>Home page</title>
-
<link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.1/semantic.min.css"
-
rel="stylesheet">
-
</head>
-
<body>
-
-
<section class="ui container">
-
-
<ul th:each="message : ${messages}">
-
<li th:text="${message}" class="ui error message" />
-
</ul>
-
-
<form class="ui form" action="message" method="post">
-
-
<div class="field">
-
<label>Name:</label>
-
<input type="text" name="name" th:value="${name}">
-
</div>
-
-
<div class="field">
-
<label>Occupation:</label>
-
<input type="text" name="occupation" th:value="${occupation}">
-
</div>
-
-
<button class="ui button" type="submit">Send</button>
-
-
</form>
-
</section>
-
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.1/semantic.min.js"></script>
-
</body>
-
</html>
这是主页模板。它发送一个包含两个输入的表单:姓名和职业。 样式是使用语义 UI 库完成的。
-
<ul th:each="message : ${messages}">
-
<li th:text="${message}" class="ui error message" />
-
</ul>
如果有任何错误消息,将显示它们。
-
<!DOCTYPE html>
-
<html lang="en" xmlns:th="http://www.thymeleaf.org">
-
<head>
-
<meta charset="UTF-8">
-
<title>Message</title>
-
</head>
-
<body>
-
-
<p th:text="${message}"/>
-
-
</body>
-
</html>
模板在表单成功时显示一条消息 处理。showMessage
-
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 引导的入口点 应用。
转载:https://blog.csdn.net/allway2/article/details/128222227