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配置,至少