Spring控制器中的@ModelAttribute字段为空

时间:2017-07-27 14:58:04

标签: java forms jsp spring-mvc thymeleaf

我按照教程处理Spring中的表单提交。我想用表单填充我的TaskEntity bean,并在我的控制器的taskSubmit方法中提供这些bean的值。但是,当我填写表单并点击提交时,此方法中task的所有属性都为null。相关代码如下:

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

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>

TaskController.java

@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();
    }
}

我预计传递给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>

2 个答案:

答案 0 :(得分:0)

通过编辑,您已确认您的视图解析是针对JSP的。

您有一个带有<input>元素的JSP页面,看起来像

<input type="text" th:field="*{description}" />

据推测,th:fieldThymeleaf element,但您的页面未由Thymeleaf处理,它由JSP Servlet处理。 JSP Servlet不关心th:field,它对它没有任何特殊意义。它只是字面上复制它。此外,您的input没有name属性。 As such, when you submit the form, your browser doesn't send a corresponding value.(即使它确实如此,它也没有Spring MVC识别的名称,并且可以绑定到您的模型属性。)

设置MVC配置以正确呈现Thymeleaf视图而不是JSP视图。

或者如果您真的想使用JSP,请使用相应的技术:EL,JSTL和Spring的标记库。在线有大量的教程,如this one

答案 1 :(得分:0)

您有相同网址的GET / POST,在这种情况下由TASKS = "/tasks"表示

因此根据以下内容:

@RequestMapping(value = TASKS, method = RequestMethod.GET)
public ModelAndView readTasks() 
{
    return new ModelAndView("tasks");
}

在哪里创建了TaskEntity对象?

model.addAttribute("taskEntity", new TaskEntity());方法中有addTask,但使用其他网址,本例ADD_TASK = "/addTask"

您需要了解Web表单是根据通过GET事件创建的模型加载的,然后当提交事件发生时(Web表单已填满),POST事件就会发生。在这种情况下,GET / POST(由@RequestMapping处理)共享相同的&#39;是正常的。 URL。

观察 Thymeleaf不适用于UrlBasedViewResolverViewResolver也有Thymeleaf,此外,Thymeleaf }使用.html文件,而不是.jsp。因此,我假设 POST事件无效,Model应该如何预期。

注意@Controller@Repository有直接依赖关系是不好的做法,应该是@Service

根据:

@RequestMapping(value = TASKS, method = RequestMethod.POST)
public void taskSubmit(@ModelAttribute TaskEntity task)
{
    // Fields for 'task' are all null!      
    taskEntityDao.createTask(task);

    readTasks();
}
  • 对于Fields for 'task' are all null!,您是如何确认的?
  • 在移除readTasks()时考虑一下。 @RequestMapping调用其他@RequestMapping并不常见。