飞道的博客

Spring Boot Flash属性

307人阅读  评论(0)

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

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

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

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

弹簧启动闪存属性示例

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

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


  
  1. src
  2. ├───main
  3. │ ├───java
  4. │ │ └───com
  5. │ │ └───zetcode
  6. │ │ │ Application.java
  7. │ │ └───controller
  8. │ │ MyController.java
  9. │ │
  10. │ └───resources
  11. │ └───templates
  12. │ index.html
  13. │ showMessage.html
  14. └───test
  15. └───java

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

绒球.xml

  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>springflashmessage</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <maven.compiler.source>17</maven.compiler.source>
  13. <maven.compiler.target>17</maven.compiler.target>
  14. </properties>
  15. <parent>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-parent</artifactId>
  18. <version>2.6.7</version>
  19. </parent>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.hibernate</groupId>
  31. <artifactId>hibernate-validator</artifactId>
  32. <version>6.0.13.Final</version>
  33. </dependency>
  34. </dependencies>
  35. <build>
  36. <plugins>
  37. <plugin>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-maven-plugin</artifactId>
  40. <version>2.6.7</version>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

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

com/zetcode/controller/MyController.java

  
  1. package com.zetcode.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.ui.Model;
  4. import org.springframework.validation.annotation.Validated;
  5. import org.springframework.web.bind.annotation.ExceptionHandler;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. import org.springframework.web.context.request.WebRequest;
  9. import org.springframework.web.servlet.ModelAndView;
  10. import org.springframework.web.servlet.mvc.support.RedirectAttributes;
  11. import org.springframework.web.servlet.view.RedirectView;
  12. import org.thymeleaf.util.StringUtils;
  13. import javax.validation.ConstraintViolationException;
  14. import javax.validation.constraints.Size;
  15. import java.util.ArrayList;
  16. import java.util.HashMap;
  17. import java.util.Map;
  18. @Controller
  19. @Validated
  20. public class MyController {
  21. @RequestMapping("/")
  22. public String index(Model model) {
  23. return "index";
  24. }
  25. @RequestMapping("/message")
  26. public ModelAndView message(@RequestParam @Size(min = 2, max = 255) String name,
  27. @RequestParam @Size(min = 2, max = 255) String occupation) {
  28. var msg = String.format("%s is a %s", name, occupation);
  29. Map<String, Object> params = new HashMap<>();
  30. params.put("message", msg);
  31. return new ModelAndView("showMessage", params);
  32. }
  33. @ExceptionHandler(ConstraintViolationException.class)
  34. public RedirectView handleError(ConstraintViolationException ex,
  35. WebRequest request,
  36. RedirectAttributes atts) {
  37. var name = request.getParameter("name");
  38. var occupation = request.getParameter("occupation");
  39. var errorMessages = new ArrayList<String>();
  40. var violations = ex.getConstraintViolations();
  41. violations.forEach(violation -> {
  42. var error = String.format("%s: %s", violation.getPropertyPath(),
  43. violation.getMessage());
  44. errorMessages.add(error);
  45. });
  46. if (!StringUtils.isEmptyOrWhitespace(name)) {
  47. atts.addFlashAttribute("name", name);
  48. }
  49. if (!StringUtils.isEmptyOrWhitespace(occupation)) {
  50. atts.addFlashAttribute("occupation", occupation);
  51. }
  52. atts.addFlashAttribute("messages", errorMessages);
  53. var redirectView = new RedirectView("/");
  54. return redirectView;
  55. }
  56. }

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


  
  1. @Controller
  2. @Validated
  3. public class MyController {

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


  
  1. @RequestMapping("/")
  2. public String index(Model model) {
  3. return "index";
  4. }

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


  
  1. @RequestMapping("/message")
  2. public ModelAndView message(@RequestParam @Size(min = 2, max = 255) String name,
  3. @RequestParam @Size(min = 2, max = 255) String occupation) {
  4. var msg = String.format("%s is a %s", name, occupation);
  5. Map<String, Object> params = new HashMap<>();
  6. params.put("message", msg);
  7. return new ModelAndView("showMessage", params);
  8. }

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


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

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


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

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


  
  1. var errorMessages = new ArrayList<String>();
  2. var violations = ex.getConstraintViolations();
  3. violations.forEach(violation -> {
  4. var error = String.format("%s: %s", violation.getPropertyPath(),
  5. violation.getMessage());
  6. errorMessages.add(error);
  7. });

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


  
  1. if (!StringUtils.isEmptyOrWhitespace(name)) {
  2. atts.addFlashAttribute("name", name);
  3. }
  4. if (!StringUtils.isEmptyOrWhitespace(occupation)) {
  5. atts.addFlashAttribute("occupation", occupation);
  6. }

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

atts.addFlashAttribute("messages", errorMessages);

错误消息存储为 flash 属性。


  
  1. var redirectView = new RedirectView("/");
  2. return redirectView;

我们重定向到带有 .RedirectView

templates/index.html

  
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Home page</title>
  6. <link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.1/semantic.min.css"
  7. rel="stylesheet">
  8. </head>
  9. <body>
  10. <section class="ui container">
  11. <ul th:each="message : ${messages}">
  12. <li th:text="${message}" class="ui error message" />
  13. </ul>
  14. <form class="ui form" action="message" method="post">
  15. <div class="field">
  16. <label>Name:</label>
  17. <input type="text" name="name" th:value="${name}">
  18. </div>
  19. <div class="field">
  20. <label>Occupation:</label>
  21. <input type="text" name="occupation" th:value="${occupation}">
  22. </div>
  23. <button class="ui button" type="submit">Send</button>
  24. </form>
  25. </section>
  26. <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.1/semantic.min.js"></script>
  27. </body>
  28. </html>

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


  
  1. <ul th:each="message : ${messages}">
  2. <li th:text="${message}" class="ui error message" />
  3. </ul>

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

templates/showMessage.html

  
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Message</title>
  6. </head>
  7. <body>
  8. <p th:text="${message}"/>
  9. </body>
  10. </html>

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

com/zetcode/Application.java

  
  1. package com.zetcode;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

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


转载:https://blog.csdn.net/allway2/article/details/128222227
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场