Java @Spring控制器中的ModelAttribute字段为空
我在春季学习了一个处理表单提交的教程。我想用表单填充我的Java @Spring控制器中的ModelAttribute字段为空,java,forms,jsp,spring-mvc,thymeleaf,Java,Forms,Jsp,Spring Mvc,Thymeleaf,我在春季学习了一个处理表单提交的教程。我想用表单填充我的TaskEntitybean,并在控制器的taskSubmit方法中提供该bean的值。但是,当我填写表单并点击submit时,此方法中任务的所有属性都为空。有关守则如下: TaskEntity.java public class TaskEntity { private String title; private String description; private Date dueDate; priv
TaskEntity
bean,并在控制器的taskSubmit
方法中提供该bean的值。但是,当我填写表单并点击submit时,此方法中任务的所有属性都为空。有关守则如下:
TaskEntity.java
public class TaskEntity {
private String title;
private String description;
private Date dueDate;
private TaskPriority priority;
public void setTitle(String title)
{
this.title = title;
}
public String getTitle()
{
return this.title;
}
public void setDescription(String description)
{
this.description = description;
}
public String getDescription()
{
return this.description;
}
public void setDueDate(Date dueDate)
{
this.dueDate = dueDate;
}
public Date getDueDate()
{
return this.dueDate;
}
public void setPriority(String priority)
{
this.priority = TaskPriority.valueOf(priority);
}
public TaskPriority getPriority()
{
return this.priority;
}
}
@Controller
public class TaskController {
private static final String TASKS = "/tasks";
private static final String ADD_TASK = "/addTask";
@Autowired
private TaskEntityDao taskEntityDao;
ObjectMapper mapper = new ObjectMapper();
@RequestMapping(value = TASKS, method = RequestMethod.GET)
public ModelAndView readTasks()
{
return new ModelAndView("tasks");
}
@RequestMapping(value = ADD_TASK, method = RequestMethod.GET)
public String addTask(Model model)
{
model.addAttribute("taskEntity", new TaskEntity());
return "addTask";
}
@RequestMapping(value = TASKS, method = RequestMethod.POST)
public void taskSubmit(@ModelAttribute TaskEntity task)
{
// Fields for 'task' are all null!
taskEntityDao.createTask(task);
readTasks();
}
}
addTask.jsp
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>To Do List - Add Task</title>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/stylesheet.css">
</head>
<body>
<form action="tasks" th:action="@{/tasks}" th:object="${taskEntity}" method="post">
<p>Title: <input type="text" th:field="*{title}" /></p>
<p>Description: <input type="text" th:field="*{description}" /></p>
<p>Due Date: <input type="text" th:field="*{dueDate}" /></p>
<p>Priority: <input type="text" th:field="*{priority}" /></p>
<p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>
</body>
</html>
我希望TaskEntity
通过model.addAttribute(“TaskEntity”,new TaskEntity())传递给视图
将表单值映射到它的字段,但我肯定错过了什么
更新:
我正在从Spring配置添加视图解析器代码:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
通过编辑,您已经确认视图分辨率是针对JSP的 您有一个JSP页面,其中的
元素如下所示
<input type="text" th:field="*{description}" />
大概th:field
是一个,但是您的页面不是由Thymeleaf处理的,而是由JSP Servlet处理的。jspservlet不关心th:field
,它在任何方面都不是特别的。它只是逐字复制。此外,您的输入
没有名称
属性。(即使有,它也不会有Spring MVC可以识别的名称,也不能绑定到您的模型属性。)
设置MVC配置,以正确地呈现AFF视图而不是JSP视图
或者,如果您真的想使用JSP,请使用相应的技术:EL、JSTL和Spring的标记库。在线上有很多教程,比如。通过编辑,您已经确认视图分辨率适用于JSP 您有一个JSP页面,其中的
元素如下所示
<input type="text" th:field="*{description}" />
大概th:field
是一个,但是您的页面不是由Thymeleaf处理的,而是由JSP Servlet处理的。jspservlet不关心th:field
,它在任何方面都不是特别的。它只是逐字复制。此外,您的输入
没有名称
属性。(即使有,它也不会有Spring MVC可以识别的名称,也不能绑定到您的模型属性。)
设置MVC配置,以正确地呈现AFF视图而不是JSP视图
或者,如果您真的想使用JSP,请使用相应的技术:EL、JSTL和Spring的标记库。网上有很多教程,比如。对于同一个URL,您有一个
GET
/POST
,在本例中由TASKS=“/TASKS”
因此,根据以下规定:
@RequestMapping(value = TASKS, method = RequestMethod.GET)
public ModelAndView readTasks()
{
return new ModelAndView("tasks");
}
在哪里创建了任务实体
对象
您有model.addAttribute(“taskEntity”,new taskEntity())
在addTask
方法中,但与otherURL一起使用,在本例中为ADD_TASK=“/addTask”
您需要了解,web表单是根据通过GET
事件创建的模型加载的,然后当提交事件发生时(web表单已填充),会发生POST
事件。在这种情况下,GET
/POST
(由@RequestMapping
处理)共享“相同”URL是正常的
观察:
Thymeleaf
不适用于UrlBasedViewResolver
,它有自己的viewsolver
用于Thymeleaf
,此外,Thymeleaf
可用于.html
文件,而不是.jsp
。因此,我假设POST
事件不起作用模型的预期效果如何
注意:一个@控制器
与@存储库
有直接依赖关系是一种不好的做法,它应该用于@服务
根据:
@RequestMapping(value = TASKS, method = RequestMethod.POST)
public void taskSubmit(@ModelAttribute TaskEntity task)
{
// Fields for 'task' are all null!
taskEntityDao.createTask(task);
readTasks();
}
- “任务”的
字段均为空代码>,您是如何确认的
- 请考虑删除
readTasks()
。@RequestMapping
调用其他@RequestMapping
并不常见李>
对于同一URL,您有一个GET
/POST
,在本例中由TASKS=“/TASKS”
因此,根据以下规定:
@RequestMapping(value = TASKS, method = RequestMethod.GET)
public ModelAndView readTasks()
{
return new ModelAndView("tasks");
}
在哪里创建了任务实体
对象
您有model.addAttribute(“taskEntity”,new taskEntity())
在addTask
方法中,但与otherURL一起使用,在本例中为ADD_TASK=“/addTask”
您需要了解,web表单是根据通过GET
事件创建的模型加载的,然后当提交事件发生时(web表单已填充),会发生POST
事件。在这种情况下,GET
/POST
(由@RequestMapping
处理)共享“相同”URL是正常的
观察:Thymeleaf
不适用于UrlBasedViewResolver
,它有自己的viewsolver
用于Thymeleaf
,此外,Thymeleaf
可用于.html
文件,而不是.jsp
。因此,我假设POST
事件不起作用模型的预期效果如何
注意:一个@控制器
与@存储库
有直接依赖关系是一种不好的做法,它应该用于@服务
根据:
@RequestMapping(value = TASKS, method = RequestMethod.POST)
public void taskSubmit(@ModelAttribute TaskEntity task)
{
// Fields for 'task' are all null!
taskEntityDao.createTask(task);
readTasks();
}
- “任务”的
字段均为空代码>,您是如何确认的
- 请考虑删除
readTasks()
。@RequestMapping
调用其他@RequestMapping
并不常见李>
如果添加model.addAttribute(“taskEntity”,new taskEntity())代码>到readTasks()方法?请发布您的Spring MVC配置,至少