我按照教程处理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>
答案 0 :(得分:0)
通过编辑,您已确认您的视图解析是针对JSP的。
您有一个带有<input>
元素的JSP页面,看起来像
<input type="text" th:field="*{description}" />
据推测,th:field
是Thymeleaf 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
不适用于UrlBasedViewResolver
,ViewResolver
也有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
并不常见。