首页 > 解决方案 > Spring MVC - 如何使用不同的映射注释调用相同的 URL

问题描述

我用两种方法设置了一个控制器。URL 映射完全相同,唯一的区别是映射注释方法。一个是@PostMapping,另一个是按该顺序编写的@DeleteMapping。但是,当我尝试调用@DeleteMapping 方法时,会调用@PostMapping 方法。

请注意,即使两种 URL 形式中的变量不同,它们的值也相同。它们只是来自不同的 HTML 页面。

问题是如何每次调用所需的方法。

@PostMapping 方法

@Secured({"ROLE_ADMIN", "ROLE_STUDENT"})
@PostMapping("students/{username}/internships/{id}")
public String addInternship(Model model, @PathVariable("username") String username, @PathVariable("id") int id) {

    /* DOES SOME STUFF
    Student student = userService.getUser(username).getStudent();
    Internship internship = userService.getInternship(id);

    StudentInternship studentInternship = new StudentInternship(internship, student, "Sent");

    internship.setNumberOfPositions(internship.getNumberOfPositions() - 1);
    userService.updateInternship(internship);

    student.setApplicationNumber(student.getApplicationNumber() + 1);
    userService.updateStudent(student);

    userService.addStudentInternship(studentInternship);
    */

    return "redirect:/internships";
}

@DeleteMapping 方法

@Secured({"ROLE_ADMIN", "ROLE_STUDENT"})
@DeleteMapping("students/{username}/internships/{id}")
public String removeInternship(Model model, @PathVariable("username") String username, @PathVariable("id") int id) {

    /* DOES SOME STUFF
    Student student = userService.getUser(username).getStudent();
    Internship internship = userService.getInternship(id);

    int studentInternshipID = userService.getStudentInternshipByParams(student, internship).getId();

    internship.setNumberOfPositions(internship.getNumberOfPositions() + 1);
    userService.updateInternship(internship);

    student.setApplicationNumber(student.getApplicationNumber() - 1);
    userService.updateStudent(student);

    userService.removeStudentInternship(studentInternshipID);
    */

    return "redirect:/students/" + username + "/internships";
}

HTML

<form:form action="${pageContext.request.contextPath}/students/${username}/internships/${tempInternship.id}" method="POST">
    <input type="submit" value="Request" ${disabled}/>
</form:form>

<form:form action="${pageContext.request.contextPath}/students/${tempStudentInternship.student.username}/internships/${tempStudentInternship.internship.id}" method="DELETE">
    <input type="submit" value="Dismiss" />
</form:form>

标签: javahtmlhibernatespring-mvcjakarta-ee

解决方案


浏览器只支持GETPOST作为http 请求方法。解决方案是使用该方法发送您的表单,并在使用所需方法POST调用的同一个 html 表单中注入一个隐藏字段_method作为值,在您的情况下,它只是DELETE. 对于 的情况POST,只需像往常一样编写您的表格。

例子 :

<form:form action="${pageContext.request.contextPath}/students/${tempStudentInternship.student.username}/internships/${tempStudentInternship.internship.id}" method="POST">
    <input type="hidden" name="_method" value="DELETE"/>
    <input type="submit" value="Dismiss" />
</form:form>

请查看此答案以创建 spring bean,然后在spring:formhtml 表单中应用提到的表单属性。


推荐阅读