繁体   English   中英

如何在Thymeleaf / HTML中将Checkbox与Java + Spring一起使用?

[英]How do I use the Checkbox with Java + Spring in Thymeleaf/HTML?

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

  1.   org.thymeleaf.exceptions.TemplateInputException:\n 模板解析期间发生错误(模板:“类路径资源[templates / normal / start-dag.html]”) 
  2.   引起原因:org.attoparser.ParseException:\n 执行处理器'org.thymeleaf.spring5.processor.SpringInputCheckboxFieldTagProcessor'时出错(模板:“ normal / start-dag”-第24行,col 44) 
  3.   引起原因:org.thymeleaf.exceptions.TemplateProcessingException:\n 执行处理器'org.thymeleaf.spring5.processor.SpringInputCheckboxFieldTagProcessor'时出错(模板:“ normal / start-dag”-第24行,col 44) 
  4.   2018-07-17 09:05:16.097错误6713-[nio-8080-exec-2] oaccC [。[。[/]。[dispatcherServlet]:Servlet [dispatcherServlet]的Servlet.service()路径[]引发异常[请求处理失败;\n 嵌套的异常是org.thymeleaf.exceptions.TemplateInputException:模板解析期间发生了根本原因(模板:“类路径资源[templates / normal / start-dag.html]”)) 
  5.   java.lang.IllegalStateException:Bean名称“ goodNightOfSleep”的BindingResult和普通目标对象都不能用作请求属性\n 在org.springframework.web.servlet.support.BindStatus。(BindStatus.java:153)〜[spring-webmvc-5.0.7.RELEASE.jar:5.0.7.RELEASE]\n 在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>

这实际上使我能够进入页面,但是我的复选框如下所示,并且不返回任何值: 在此处输入图片说明

控制器方法:

@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";
}

模板代码段:

<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.)接收对象作为输入参数。

警告:代码未经测试即被写入编辑器。 也许有错别字。

您是否尝试过返回ModelAndView而不是String ,并按此处所述将StartDay添加为Model属性?

例如

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

    ModelAndView mav = new ModelAndView("normal/start-dag");
    mav.addObject("StartDay", new StartDay());
    return mav;
}
  1. java.lang.IllegalStateException:BeanResult'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 。发布]

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

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

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

并确保在用户界面中定义了startDay“ th:object”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM