我用两种方法设置了一个控制器。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>
浏览器仅支持GET
和POST
作为http请求方法。解决方案是使用 POST
方法发送表单,并在名为 _method
的同一 html 表单中注入一个隐藏字段,并使用您想要的方法作为值,在您这里的情况下,它只是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>
请看一下这个答案,用于创建春豆,然后在 html 表单中应用spring:form
提到的表单属性。
表单中只允许 GET 和 POST。您需要使用 AJAX 指定请求的其他类型。嗨,您需要使用javascript和XMLHttpRequest来指定请求的类型。
这是我从互联网上随机抽取的一个例子:
// Delete a user
var url = "http://localhost:8080/api/v1/users";
var xhr = new XMLHttpRequest();
xhr.open("DELETE", url+'/12', true);
xhr.onload = function () {
var users = JSON.parse(xhr.responseText);
if (xhr.readyState == 4 && xhr.status == "200") {
console.table(users);
} else {
console.error(users);
}
}
xhr.send(null);