2017-07-27 106 views
0

我遵循教程来处理Spring中的表单提交。我想用表单填充我的TaskEntity bean,并在我的控制器的taskSubmit方法中使用此bean的值。但是,当我填写表单并点击提交时,此方法中task的所有属性均为空。相关代码如下:@ModelAttribute字段在Spring控制器中为空

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> 
+0

如果将'model.addAttribute(“taskEntity”,new TaskEntity());'添加到readTasks()方法会怎样? – StanislavL

+0

请发布您的Spring MVC配置,至少是'ViewResolver'(s)。 –

+0

@SotiriosDelimanolis我已经更新了我的问题,谢谢 – petehallw

回答

0

与您编辑您确认您的视图分辨率是JSP的。

你有看起来像

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

<input>元素JSP页面大概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

+0

有没有什么办法可以避免在我的JSP页面中使用简单的Thymeleaf和POST方法? – petehallw

+0

@petehallw当然。使用像EL和JSTL这样的JSP功能。 Spring也有自己的标签库。 –

0

你有GET/POST对同一个URL,通过TASKS = "/tasks"

表示这种情况下,因此有以下根据:

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

在其中创建TaskEntity对象?

你必须在addTask方法model.addAttribute("taskEntity", new TaskEntity());,但与其他URL工作,在这种情况下ADD_TASK = "/addTask"

您需要了解的是,根据通过GET事件创建的模型加载Web表单,然后在发生提交事件时(网页表单已填充)发生POST事件。在这种情况下是正常的,GET/POST(由@RequestMapping处理)共享'相同'的网址。

观察:Thymeleaf不以UrlBasedViewResolver工作,它有自己的ViewResolverThymeleaf,此外,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不常见。
+0

我很欣赏你对不良练习的评论,我对此很陌生,你可能在那里是正确的。但我不认为这实际上是我的问题的答案。关于Thymeleaf的一点可能是相关的,但我不相信我在混淆网址。我通过/ addTask和POST的表单导航到/任务。其他/任务方法readTasks()与我的问题无关,但用于从数据库中获取任务。 – petehallw

相关问题