我有一个带有Thymeleaf的Spring-boot Java应用程序。当根网页访问过具有窗体的页面时,将从此控制器显示。
@Controller
@Scope("session")
public class AController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String queryForm(Model model) {
model.addAttribute("query", new Query());
System.out.println("added query to model");
return "question_page";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String querySubmit(@ModelAttribute Query query) {
System.out.println("button pressed");
return "result";
}
}
窗体如下所示。填写表格并点击提交时。我希望先前创建的查询是从具有集内容的请求映射器模型传递的。但这似乎是一个不同的查询,因为它具有不同的内存地址。
<div clas="queryFrom">
<form action="#" th:action="@{/}" th:object="${query}" method="post"
class="embed-submit-field">
<input type="text" th:field="*{content}" id="query" list="suggestions" autocomplete="off"
class="inputField"/>
<button type="submit" value="Submit" id="submitButton" class="btn">
<i class="material-icons">search</i>
</button>
</form>
</div>
结果页面上有一个按钮,用于触发控制器的以下请求映射器。我预计控制器会获得与内容集相同的查询,但它会获得另一个不是内容集的查询。
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String trigger_reload(@ModelAttribute Query query) {
System.out.println(query.getContent()); // content is null
return "result";
}
我不确定我做错了什么。欢迎任何建议。
此问题被标记为可能与另一个问题重复。我只是想确保这些问题是完全不同的。内容字段从百里香叶设置正确。问题是我没有从我的模型中获取设置字段的 Query 类的实例。完全不同的问题!
我自己想通了。我只需要将模型属性添加到会话中,否则它将丢失。我只是在班级中增加了@SessionAttributes({ "query" })
,我解决了我的问题。
你可以使用这种方法。
不要使用 th:field,请使用 html id 和名称。使用 th:value 设置值
<input class="form-control"
type="text"
th:value="${content}" id="content" name="content" />