[英]Spring MVC - How do I update a model object's attributes using a controller method?
Using Spring MVC 3.0, I am developing a member management system with basic CRUD operations and am having trouble with my Controller.使用 Spring MVC 3.0,我正在开发一个具有基本 CRUD 操作的成员管理系统,但我的控制器遇到了问题。
I cannot update a member record using a Controller method.我无法使用 Controller 方法更新成员记录。 I have methods to display and process my 'Add Member' form and another to display my 'Edit Member' form and they all work fine.
我有显示和处理我的“添加成员”表单的方法,还有另一个显示我的“编辑成员”表单的方法,它们都可以正常工作。
Here is my controller:这是我的控制器:
@Controller
public class MemberController {
private MemberService memberService;
@Inject
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
// Show member list
@RequestMapping(value = "/members/list", method = RequestMethod.GET)
public String showMemberList(Map<String, Object> model) {
model.put("members", memberService.getAllMembers());
return "members/list";
}
// Display add member form
@RequestMapping(value = "/members/add", method = RequestMethod.GET)
public String showAddMemberForm(Model model) {
model.addAttribute(new Member());
return "members/add";
}
// Process add member form
@RequestMapping(value = "/members/add", method = RequestMethod.POST)
public String addMember(Member member) {
memberService.addMember(member);
return "redirect:list";
}
// Display edit member form
@RequestMapping(value = "/members/edit/{id}", method = RequestMethod.GET)
public String showEditMemberForm(Model model, @PathVariable int id) {
String idAsString = Integer.toString(id);
model.addAttribute("member", memberService.getMemberById(idAsString));
return "members/edit/{id}";
}
// Process edit member form
@RequestMapping(value = "/members/edit/{id}", method = RequestMethod.POST)
public String updateMember(@PathVariable int id,
HttpServletRequest request, Member member) {
// Uncommenting the next line of code sets the member objects forename attribute
// to "test forename"
// member.setForename("test forename");
// Uncommenting the next line of code gives the following error:
// HTTP Status 405 - Request method 'POST' not supported
//member.setSurname(request.getParameter("surname"));
memberService.updateMember(member);
return "redirect:/members/list";
}
} }
Here is my update method:这是我的更新方法:
public void update(Member member) {
jdbcTemplate.update(
"UPDATE members SET forename=?, surname=?, address1=?, address1=?, "
+ "city=?, postcode=? WHERE memberId=?",
member.getForename(), member.getSurname(),
member.getAddress1(), member.getAddress2(), member.getCity(),
member.getPostcode(), member.getId());
}
And here is my Edit Member JSP form:这是我的 Edit Member JSP 表单:
<sf:form method="POST" modelAttribute="member"
enctype="multipart/form-data" action="/members/edit/${member.id}">
<fieldset>
<table cellspacing="0">
<tr>
<th><label for="member_id">Id:</label></th>
<td><sf:input path="id" size="15" id="member_id" /></td>
</tr>
<tr>
<th><label for="member_forename">Forename:</label></th>
<td><sf:input path="forename" size="15" id="member_forename" /></td>
</tr>
<tr>
<th><label for="member_surname">Surname:</label></th>
<td><sf:input path="surname" size="15" id="member_surname" /></td>
</tr>
<tr>
<th><label for="member_address1">Address 1:</label></th>
<td><sf:input path="address1" size="15" id="member_address1" />
</td>
</tr>
<tr>
<th><label for="member_address2">Address 2:</label></th>
<td><sf:input path="address2" size="15" id="member_address2" />
</td>
</tr>
<tr>
<th><label for="member_city">City:</label></th>
<td><sf:input path="city" size="15" id="member_city" /></td>
</tr>
<tr>
<th><label for="member_postcode">Postcode:</label></th>
<td><sf:input path="postcode" size="15" id="member_postcode" />
</td>
</tr>
</table>
<input type="submit" value="Update" />
</fieldset>
</sf:form>
Because the 'member.setForename("test forename")' code in my Controller sets the test string, I thought I could use the parameters that are posted from the form to set the atrributes as follows:因为我的 Controller 中的 'member.setForename("test forename")' 代码设置了测试字符串,我想我可以使用从表单发布的参数来设置属性,如下所示:
'member.setSurname(request.getParameter("surname"))' 'member.setSurname(request.getParameter("surname"))'
But this causes an HTTP 405 error.但这会导致 HTTP 405 错误。 Using Firebug, I have confirmed that the 'Edit Member' form is posting the 'forename', 'surname', 'address1', etc. parameters so I can't figure out why I can't pull them off the request.
使用 Firebug,我已经确认“编辑成员”表单正在发布“名字”、“姓氏”、“地址 1”等参数,因此我不知道为什么我不能将它们从请求中拉出来。
Any help would be greatly appreciated as I have been at this for 2 days and am going round in circles.任何帮助将不胜感激,因为我已经在这里呆了 2 天并且正在兜兜转转。
@RequestMapping(value = "/members/edit/{id}", method = RequestMethod.POST)
public String updateMember(@PathVariable int id,
HttpServletRequest request,@ModelAttribute("member") Member member) {
//Hope your MemberService looks similar //希望你的 MemberService 看起来相似
public void edit(Member member) {
logger.debug("Editing existing member");
// Retrieve session from Hibernate, if you are using hibernate
Session session = sessionFactory.getCurrentSession();
// Retrieve existing member via id
Member existingMember = (Member) session.get(Member.class, member.getId());
// Assign updated values to this member
existingMember.setForeName(member.getForeName());
existingMember.setSurName(member.getSurName());
...
...
existingMember.setPostcode(member.getPostcode());
// Save updates
session.save(existingMember);
} }
@RequestMapping(value = "/members/edit/{id}", method = RequestMethod.POST)
public String updateMember(@PathVariable int id,
HttpServletRequest request,@ModelAttribute("member") Member member) {
add @ModelAttribute
before Member
.在
Member
之前添加@ModelAttribute
。 Then this instance will have all the edits.然后这个实例将拥有所有的编辑。 so you don't need to set new values by
request.getParameter
.所以你不需要通过
request.getParameter
设置新值。 Just save this instance in DB.只需将此实例保存在数据库中即可。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
There are no error logs when multiple parts are not resolved in Spring (this is very tricky).在 Spring 中没有解决多个部分时,没有错误日志(这很棘手)。
Spring cannot read multiple attachment parts in the POST request, and Spring does not update the model. Spring 无法读取 POST 请求中的多个附件部分,并且 Spring 不会更新模型。
Please make sure that you have set the multipart resolver in the dispatcher servlet XML file.请确保您已在调度程序 servlet XML 文件中设置多部分解析器。
dispatcher-servlet.xml:调度程序servlet.xml:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
And also add the below dependency to your pom.并将以下依赖项添加到您的 pom.xml 文件中。
pom.xml: pom.xml:
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.