我正在使用Spring和Hibernate框架进行一个java web项目。正如你们中的许多人所知,在Spring中,在form:form中,我们可以通过@ModelAttribute提交对象(如果我理解错误,请为我解释)。
<form:form action="student.do" method="GET" commandName="student">
<form:input path="id"/>
<form:input path="name"/>
<form:input path="age"/>
</form:form>
使用此表单,URL将是?id=1&name=karliekloss&年龄=24岁。这很简单,对吧?但是,如果我将另一个对象设置为这个学生对象示例的子对象,比如带有元素的HomeWork:score,name。所以如果我在上面做同样的代码
<form:form action="student.do" method="GET" commandName="student">
<form:input path="id"/>
<form:input path="name"/>
<form:input path="age"/>
<form:select path="homeWork">
<form:option itemValue="${value1}"/>
<form:option itemValue="${value2}"/>
</form:select>
</form:form>
URL会这样显示吗?id=1&name=karliekloss&年龄=24&在家工作=model.HomeWork@4f0f43fe,我发现model.HomeWork@4f0f43fe'是类HomeWork的toString()函数的结果,我的问题是,如何重写toString(,或者toString(返回的String的结构是什么,以使控制器可以确定Student对象(将HomeWork对象作为子对象),因为它总是返回"客户端发送的请求在语法上不正确"。感谢您阅读我的文章,请帮助我!
更新控制器:
@RequestMapping(value = "/student.do", method = RequestMethod.GET)
public String doActions(@ModelAttribute("student") Student student, @RequestParam String action,
BindingResult result, Map<String, Object> map) {
switch (action.toLowerCase()) {
case "add":
break;
case "update":
break;
case "cancel":
break;
}
return "quantity";
}
您应该使用path="homework.score"
和path="homework.name"
来设置Student
对象中HomeWork
对象的值,前提是您的字段名称与path
属性中指定的字段名称匹配。这样,您的查询参数将为&homework.score=90&homework.name=math
。无需重写toString()
方法。
<tr>
<td>Homework Score:</td>
<td><form:select path="homework.score"
items="${scoreList}" /></td>
</tr>
<tr>
<td>Homework Name:</td>
<td><form:select path="homework.name"
items="${nameList}" /></td>
</tr>
您可以简单地通过在控制器中打印这些值来测试这一点-student.getHomeWork().getScore();
和student.getHomeWork().getName()