mumei2018 发表于 2024-4-28 11:17:17

这里的输入验证无法实现是怎么回事

我想实现在一个里面里 验证用户输入的数据 如果合乎要求 用户可以点击Confirm按钮 进入confirm页面 如果用户输入不符合验证要求 会提示相应错误但是无法实现 下面是我的所有代码 请问问题出在哪
/Udemy1/src/main/java/com/example/demo/app/inquiry/InquiryController.java中代码如下
package com.example.demo.app.inquiry;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/inquiry")
public class InquiryController {
       
       
        @GetMapping("/form")
        public String form(InquiryForm inquiryForm, Model model) {
                model.addAttribute("title", "Inquiry Form");
                return "inquiry/form";
               
        }
       
        @PostMapping("/confirm")
        public String confirm(@Validated InquiryForm inquiryForm,
                        BindingResult result,
                        Model model) {
                if(result.hasErrors()) {
                        model.addAttribute("title", "Inquiry Form");
                        return "inquiry/form";
                }
                model.addAttribute("title", "Confirm Page");
                return "inquiry/confirm";
        }

}
/Udemy1/src/main/java/com/example/demo/app/inquiry/InquiryForm.java中代码如下
package com.example.demo.app.inquiry;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;



public class InquiryForm{

        public InquiryForm() {}

    public InquiryForm(String name, String email, String contents) {
                super();
                this.name = name;
                this.email = email;
                this.contents = contents;
        }

    private int id;


    public InquiryForm(int id, String name,String email, String contents) {
                super();
                this.id = id;
                this.name = name;
                this.email = email;
                this.contents = contents;
        }

        public int getId() {
                return id;
        }

        public void setId(int id) {
                this.id = id;
        }

        @Size(min = 1, max = 20, message="Please input 20 characters or less")
    private String name;

        @NotNull
    @Email(message = "Invalid E-mail Format")
    private String email;

    @NotNull
    private String contents;

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public String getEmail() {
                return email;
        }

        public void setEmail(String email) {
                this.email = email;
        }

        public String getContents() {
                return contents;
        }

        public void setContents(String contents) {
                this.contents = contents;
        }


}

/Udemy1/src/main/resources/templates/inquiry/confirm.html中代码如下
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:text="${title}">Insert title here</title>
</head>
<body>
<h1 th:text="${title}">仮のタイトル</h1>
<p>入力内容をご確認ください</p>
<p th:text="${inquiryForm.name}"></p>
<div th:object="${inquiryForm}">
<p th:text="*{name}"></p>
<p th:text="*{email}"></p>
<p th:text="*{contents}"></p>
<form method="post" action="#" th:action="@{/inquiry/form}">
        <input type="hidden" name="name" th:value="*{name}">
        <input type="hidden" name="email" th:value="*{email}">
        <input type="hidden" name="contents" th:value="*{contents}">
        <input type="submit" value="Go Back">
</form>
<form method="post" action="#" th:action="@{/inquiry/complete}">
        <input type="hidden" name="name" th:value="*{name}">
        <input type="hidden" name="email" th:value="*{email}">
        <input type="hidden" name="contents" th:value="*{contents}">
        <input type="submit" value="Complete">
</form>
</div>
</body>
</html>
/Udemy1/src/main/resources/templates/inquiry/form.html中代码如下
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:text="${title}">Insert title here</title>
</head>
<body>
<h1 th:text="${title}"></h1>
<form method="post" action="#" th:action="@{/inquiry/confirm}" th:object="${inquiryForm}">
        <label for="name">Name:</label>
        <input id="name" name="name" type="text" th:value="*{name}"><br>
        <div th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></div>
        <label for="email">Email:</label>
        <input id="email" name="email" type="text"><br>
        <div th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></div>
        <label for="contents">Detail :</label>
        <textarea name="contents" id="contents" rows="3" cols="40" th:field="*{contents}"></textarea><br>
        <div th:if="${#fields.hasErrors('contents')}" th:errors="*{contents}"></div>
        <input type="submit" value="Confirm">
       
</form>
</body>
</html>

请问无法实现用户输入校验是哪里出问题了 要怎么解决

FishC 发表于 2024-4-28 11:17:29

根据您提供的代码,可以看出您使用了Spring的表单验证机制(@Validated和BindingResult)来实现输入验证。然而,根据您的描述,无法确定具体的问题出在哪里。

首先,请确保您已经正确配置了Spring的验证器,并且在启动应用程序时没有抛出任何异常。

其次,请检查InquiryForm类中的注解是否正确。您的代码看起来没有问题,但也有可能是注解的配置有误导致验证无法生效。您可以尝试使用其他简单的验证规则(例如@NotNull)进行测试。

最后,请检查您的HTML模板文件是否与控制器方法的返回值匹配。确认确认页面的模板(confirm.html)与控制器中的返回值("inquiry/confirm")相对应,并且表单页面的模板(form.html)与控制器中的返回值("inquiry/form")相对应。

如果以上步骤都没有发现问题,可以尝试清除浏览器缓存并重新访问页面,以确保最新的代码生效。

希望以上解答能对您有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

mumei2018 发表于 2024-4-28 11:34:54

FishC 发表于 2024-4-28 11:17
根据您提供的代码,可以看出您使用了Spring的表单验证机制(@Validated和BindingResult)来实现输入验证。 ...

有没有办法通过日志来查看@NotNull之类的校验是否被调用

FishC 发表于 2024-4-28 11:35:14

mumei2018 发表于 2024-04-28 11:34
有没有办法通过日志来查看@NotNull之类的校验是否被调 ...

是的,您可以通过在应用程序中启用日志记录来查看验证是否被调用。Spring框架使用了一些内置的日志记录器,例如Logback或Log4j。

首先,请确保您的应用程序已经正确地配置了日志记录器。这通常在配置文件(如application.properties或logback.xml)中进行。您可以参考Spring文档或相关日志记录器的官方文档来了解如何配置日志记录器。

然后,您可以在代码中使用日志记录器来打印验证是否被调用。例如,在`InquiryController`类的`confirm`方法中添加以下代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static final Logger logger = LoggerFactory.getLogger(InquiryController.class);

@PostMapping("/confirm")
public String confirm(@Validated InquiryForm inquiryForm,
      BindingResult result,
      Model model) {
    logger.info("Validation called");
    // 其他代码...

    if(result.hasErrors()) {
      logger.info("Validation errors found");
      // 其他代码...
    }

    // 其他代码...
}

这样,当您提交表单并调用验证时,验证方法的调用和验证错误的信息将会在日志中显示。您可以查看应用程序的日志文件来确认验证是否被调用以及验证结果。

记得在完成调试后,将日志级别设置为适当的水平(例如INFO)或禁用调试日志记录,以避免产生过多的日志信息。

希望这能帮到您!如果您有任何其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

mumei2018 发表于 2024-4-28 11:48:37

FishC 发表于 2024-4-28 11:35
是的,您可以通过在应用程序中启用日志记录来查看验证是否被调用。Spring框架使用了一些内置的日志记录 ...

通过日志 我发现 控制台输出了Validation called 但是明明输入有误 却没显示Validation errors found

FishC 发表于 2024-4-28 11:48:50

mumei2018 发表于 2024-04-28 11:48
通过日志 我发现 控制台输出了Validation called 但是 ...

根据您的描述,调用了验证方法但没有输出验证错误信息。这可能是因为在验证失败时,并没有正确处理验证错误并将其添加到模型中。

在`InquiryController`类的`confirm`方法中,当验证失败时,您需要将验证错误添加到模型中以便在表单页面上显示错误信息。您可以使用`result`对象获取验证错误。

请修改`confirm`方法如下:

@PostMapping("/confirm")
public String confirm(@Validated InquiryForm inquiryForm,
      BindingResult result,
      Model model) {
    logger.info("Validation called");

    if(result.hasErrors()) {
      logger.info("Validation errors found");
      model.addAttribute("title", "Inquiry Form");
      return "inquiry/form";
    }

    // 其他代码...

    // 验证通过,进入确认页面
    model.addAttribute("title", "Confirm Page");
    return "inquiry/confirm";
}

在这个修改后的代码中,如果验证失败(即存在验证错误),将验证错误添加到模型中,并返回到表单页面,以便显示错误信息。

请确保在修改后重新启动应用程序,并重新测试验证过程。验证错误信息应该能够正确地显示在表单页面上。

希望这次的回答能解决您的问题!如有其他疑问,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

mumei2018 发表于 2024-5-13 15:22:45

FishC 发表于 2024-4-28 11:48
根据您的描述,调用了验证方法但没有输出验证错误信息。这可能是因为在验证失败时,并没有正确处理验证 ...

Exception processing template "inquiry/form": An error happened during template parsing (template: "class path resource ")
请问以上报错是生么意思

FishC 发表于 2024-5-13 15:23:07

mumei2018 发表于 2024-05-13 15:22
Exception processing template "inquiry/form": An e ...

这个错误提示表明在处理模板文件("inquiry/form")时出现了解析错误。可能有几个原因导致这个错误:

1. 模板文件路径错误:请确保模板文件 "form.html" 在正确的位置,即位于 "src/main/resources/templates/inquiry/" 目录下。

2. 模板语法错误:请检查模板文件中的语法是否正确。比如,确保所有的标签、表达式和变量都有正确的闭合或引用。

3. 缺少对应的模板文件:如果模板文件确实存在,但是文件内容为空或者损坏,都会导致解析错误。

针对以上可能的原因,您可以逐一排查以确定问题所在。您可以尝试重新检查模板文件的路径和内容是否正确,并确保模板文件的编码格式正确。如果问题仍然存在,请将完整的错误堆栈信息和相关的模板文件代码提供给我,以便更准确地分析和定位问题。

希望能帮到您!如果还有其他问题,请随时追问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 这里的输入验证无法实现是怎么回事