【问题标题】:How do I use the Checkbox with Java + Spring in Thymeleaf/HTML?如何在 Thymeleaf/HTML 中使用带有 Java + Spring 的复选框?
【发布时间】:2018-12-24 19:16:59
【问题描述】:

如何通过 Thymeleaf 将 html 中的复选框接收到 true 或 false 到我的控制器,因此我可以将值设为 true 或 false 并保存在我的数据库中。到目前为止,我收到了这些错误:

  1. org.thymeleaf.exceptions.TemplateInputException:
    模板解析时出错(模板:“类路径资源[templates/normal/start-dag.html]”)
  2. 引起:org.attoparser.ParseException:
    执行处理器“org.thymeleaf.spring5.processor.SpringInputCheckboxFieldTagProcessor”时出错(模板:“normal/start-dag” - 第 24 行,第 44 列)
  3. 引起:org.thymeleaf.exceptions.TemplateProcessingException:
    执行处理器“org.thymeleaf.spring5.processor.SpringInputCheckboxFieldTagProcessor”时出错(模板:“normal/start-dag” - 第 24 行,第 44 列)
  4. 2018-07-17 09:05:16.097 错误 6713 --- [nio-8080-exec-2] oaccC[.[.[/].[dispatcherServlet] : Servlet.service() 用于 servlet [dispatcherServlet] 在路径 [] 的上下文中抛出异常 [请求处理失败;
    嵌套异常是 org.thymeleaf.exceptions.TemplateInputException: An error occurred during template parsing (template: "class path resource [templates/normal/start-dag.html]")] 根本原因
  5. java.lang.IllegalStateException:Bean 名称“goodNightOfSleep”的 BindingResult 和普通目标对象都不能用作请求属性
    在 org.springframework.web.servlet.support.BindStatus.(BindStatus.java:153) ~[spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    在 org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903) ~[spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]

我的 html 看起来像这样:

<table>
    <tr>
        <input type="checkbox" th:path="goodNightOfSleep">
        <label th:for="${#ids.next('goodNightOfSleep')}" th:text="#{StartDay.goodNightOfSleep}">Kan du huske hvad du drømte?</label>
        <input type="checkbox" th:field="*{goodNightOfSleep}"/>
    </tr>
</table>

还有我的控制器:

// Start Day
@GetMapping("/normal/start-dag")
public  String opretGoal() {
    return "normal/start-dag";
}

@PostMapping("/normal/start-dag")
public String opretGoal(@ModelAttribute StartDay startDay, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "/normal/menu";
    }
    startDayService.createGoalOfTheDay(startDay);

    return "normal/menu";
}

我的 StartDay.java 类:

@Entity
@Table(name = "start_day")
public class StartDay {

    @Id
    @Column(name = "age_in_days", nullable = true)
    private int ageInDays;
    @Column(name = "day_created", nullable = true)
    private String dayCreated;
    @Column(name = "username", nullable = true)
    private String username;
    @Column(name = "dream_remembered", nullable = true)
    private boolean dreamRemembered;
    @Column(name = "nightmare", nullable = true)
    private boolean nightmare;
    @Column(name = "waking_time", nullable = true)
    private int wakingTime;
    @Column(name = "good_night_of_sleep", nullable = true)
    private boolean goodNightOfSleep;

任何帮助表示赞赏:)

更新 #1

所以我只是试图从 html 中移动第二个 th:field,所以它看起来像这样:

<table>
    <tr>
        <input type="checkbox" th:path="goodNightOfSleep">
        <label th:for="${#ids.next('goodNightOfSleep')}" th:text="#{StartDay.goodNightOfSleep}">Kan du huske hvad du drømte?</label>
    </tr>
</table>

这让我实际上能够登陆页面,但我的复选框看起来像这样,并且没有返回值:

【问题讨论】:

  • 我认为您的 标签末尾缺少斜线。
  • @pDer666:这是有效的 html5 语法。
  • 刚刚添加 - 没有任何改变,但感谢 :)
  • 好的,是否应该有一个是复选框和一个否复选框?目前,第一个输入字段中的 th:path 和第二个输入字段中的 th:field 的组合没有多大意义。
  • @Mongo:我写了一个小样本。等几分钟(我在工作,我的老板对工作中的私人事情很讨厌)

标签: java spring spring-boot checkbox thymeleaf


【解决方案1】:

控制器方法:

@GetMapping("/normal/start-dag")
public String opretGoal(Model model) {
    ...
    StartDay startDay = .... // e.g. new StartDay();
    model.addAttribute("startDay", startDay);
    ...
    return "normal/start-dag";
}

@PostMapping("/normal/start-dag")
public String opretGoal(@Valid StartDay startDay, BindingResult bindingResult, Model model)
{
    if (bindingResult.hasErrors()) {
        // log and/or handle errors
    }
    else {
        // your logic goes here
        startDayService.createGoalOfTheDay(startDay);
    }
    return "/normal/menu";
}

模板 sn-p:

<form action="... or use th:action" method="post" th:object="${startDay}">
    ...
    <input type="checkbox" name="goodNightOfSleep">
    ...
</form>

您也可以将 th:field 用于 goodNightOfSleep-Input,但它的工作方式与上面所写的一样。 Thymeleaf 按名称将字段与表单元素中定义的对象匹配。如果选中该框,则值为 true,否则为 false。

重点是 1.) 将对象添加到模型和 2.) 接收对象作为输入参数。

警告:代码在未经测试的情况下写入编辑器。可能有错别字。

【讨论】:

  • 好的,所以这完全解决了所有问题,现在我只需要让我的 sql 与数据库一起工作。感谢您的帮助,非常感谢!
【解决方案2】:
  1. java.lang.IllegalStateException:Bean 名称“goodNightOfSleep”的 BindingResult 和普通目标对象都不能用作请求属性 在 org.springframework.web.servlet.support.BindStatus.(BindStatus.java:153) ~[spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE] 在 org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903) ~[spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]

错误 5 是因为 thymeleaf 无法找到“goodNightOfSleep”属性。

尝试在get请求的model属性中传递StartDay对象。

@GetMapping("/normal/start-dag")
public  String opretGoal(Model model){
    model.addAttribute("startDay", new startDay());
    return "normal/start-dag";
}

并确保在 UI 中定义了 startDay "th:object"。

<form th:action="@{normal/start-dag}" th:object="${startDay}" method="post">

【讨论】:

  • 好的,这行得通 - 我现在收到的是真或假,但我的复选框仍然显示标签中的错误文本。你知道如何解决这个问题吗?
【解决方案3】:

您是否尝试过返回ModelAndView 而不是String,并按照here 的描述将StartDay 添加为模型属性?

例如

@GetMapping("/normal/start-dag")
public ModelAndView opretGoal(){

    ModelAndView mav = new ModelAndView("normal/start-dag");
    mav.addObject("StartDay", new StartDay());
    return mav;
}

【讨论】:

  • 不是为了显示一个对象的值吗?我只是通过我的@ModelAttribute 添加 StartDay,然后我应该通过我的表单填充值并返回一个 startDay 对象,然后将其保存到我的数据库中。有人告诉我使用 RequestMapping 是使用 Spring 的一种旧方式,因为我们有 GetMapping 和 PostMapping。还是我错了? - 感谢您的宝贵时间!
  • 哦,那和get/postmapping无关,get/postmapping只是requestmapping(method=GET)/requestmapping(method=POST)的一种更短的写法
  • 哦,好吧!我刚刚尝试了您的代码,但它不起作用,因为我的 StartDayService.createGoalOfTheDay(startDay)); 正在返回 void,所以它不会让我这样做。它的纯 sql (INSERT INTO)。
  • 啊好的,“GET”返回这个异常还是你的“POST”?可能您必须将模型添加到您的“GET”中 - 更新了我的答案以匹配
  • 是的,这行得通 - 现在它返回真或假(如果选中或未选中),但我仍然遇到标签问题,显示的东西与预期的完全不同。
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 2016-05-27
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2023-03-15
相关资源
最近更新 更多