我试图通过使用Thymeleaf的表单请求两个数字(第一个和第二个)作为输入,并添加数字并返回答案。代码运行自: http://localhost:8080/add
我已在此链接上使用该程序: https://spring.io/guides/gs/validating-form-input/
我还使用最新版本的Springboot,目前为1.5.8。
我发现这个简单的任务变得有些复杂(与python相比),持续的错误并没有任何意义。我目前的问题是我收到以下错误,即使在线查看类似帖子后,我也无法解决...
错误: "异常处理模板"添加":执行处理器时出错&org.thymeleaf.spring4.processor.attr.SpringInputGeneralFieldAttrProcessor'"
根据这些帖子,我已经改变了#长;" to" Long"在我的NumberForm中,并将我的NumberForm.java移到" sec.calculator"下,但没有快乐......
这是我的代码:
1)src / main / java
CalculatorController.java:
package sec.calculator;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class CalculatorController {
@GetMapping("/add")
public String addForm(Model model) {
model.addAttribute("add", new NumberForm());
return "add";
}
@PostMapping("/add")
public String addSubmit(@ModelAttribute NumberForm add) {
return "result";
}
}
CalculatorApplication.java
package sec.calculator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CalculatorApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(CalculatorApplication.class, args);
}
}
NumberForm.java
package sec.calculator;
/ * *要更改此许可证标题,请在“项目属性”中选择“许可证标题”。 *要更改此模板文件,请选择“工具”|模板 *并在编辑器中打开模板。 * /
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**import javax.validation.constraints.Size;
*/
public class NumberForm {
@NotNull
@Min(0)
private Long first;
private Long second;
public Long add_out;
public Long add_output() {
return add_out ;
}
public void Setfirst(Long first) {
this.first = first;
}
public void Setsecond(Long second) {
this.second = second;
}
}
2)src / main / resources / templates
add.html
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project
Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<body>
<h1>Form</h1>
<form action="#" th:action="@{/add}" th:object="${NumberForm}" method="post">
<p>First: <input type="text" th:field="*{First}" /></p>
<p>Second: <input type="text" th:field="*{Second}" /></p>
<p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>
</body>
</html>
答案 0 :(得分:0)
欢迎来到SO。
这里有几个问题。特别是,Java非常区分大小写。
按照convention关注setter,以便Thymeleaf可以 理解它:
public void setFirst(Long first) {
this.first = first;
}
public void setSecond(Long second) {
this.second = second;
}
我假设你省略了类似的getter方法。
更好的是,请参阅Project Lombok - 完全停止疯狂并使用
@Setter
和@Getter
或@Data
。
在表单中,小写字段名称:
<p>First: <input type="text" th:field="*{first}" /></p>
<p>Second: <input type="text" th:field="*{second}" /></p>
我也会远离这些变量名称,因为它们会变得非常混乱。
同样在您的表单中,您正在使用th:object="${NumberForm}"
但是
您将变量命名为add
。 Thymeleaf对这个名为NumberForm
的变量一无所知。您的变量名为add
,类型为NumberForm
,但Thymeleaf将需要此变量的名称。
所以你可以这样做:model.addAttribute("numberForm", new
NumberForm());
和th:object="${numberForm}"
对th:object
(modelAttribute)使用小写是
约定。
您实际上需要包含一些代码来对值进行求和。生病 留下那部分给你。