简体   繁体   English

Spring MVC - 如何使用控制器方法更新模型对象的属性?

[英]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.只需将此实例保存在数据库中即可。


This may have to do with the form attribute : 这可能与表单属性有关:
<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.

相关问题 如何在Spring MVC中动态更新模型的属性? - How to dynamically update the attributes of a model in Spring MVC? Spring MVC:如何使用表单将模型对象传递给控制器​​方法 - Spring MVC : How to pass model object to controller method with out using form 如何使用Spring MVC 3在控制器中从模型中获取对象? - How can I get an object out of the model in the controller with Spring MVC 3? Spring MVC中控制器方法参数中的模型模型 - Model model in Controller's method parameters in Spring MVC 我如何使用Spring MVC无效控制器方法? - How do i use spring mvc void controller method? 如何在Spring MVC控制器中安排方法? - How do I schedule a method in a spring MVC controller? 我如何使用angular js将模型属性POJO对象发布到spring控制器 - How do i post model attribute POJO object to spring controller using angular js Spring MVC:如何从返回String的控制器方法单元测试Model的属性? - Spring MVC: How to unit test Model's attribute from a controller method that returns String? SPRING MVC:使用@RequestBody在post方法中接收具有空属性的对象 - SPRING MVC: recieving object with empty attributes in a post Method using @RequestBody Java:Spring MVC-如何在控制器操作中访问更新的模型? - Java: Spring MVC - How do I access the updated model in controller action?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM