我正在使用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&amp; name = karliekloss&amp; age = 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>
网址会显示如下?id = 1&amp; name = karliekloss&amp; age = 24&amp; homeWork=model.HomeWork@4f0f43fe,我发现值'model.HomeWork@4f0f43fe'是toString()的结果类HomeWork的功能,我的问题是,如何覆盖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";
}
答案 0 :(得分:0)
您应该使用path="homework.score"
和path="homework.name"
将值设置为HomeWork
对象中的Student
对象,前提是您的字段名称与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()