首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring如何使用不同的映射注释调用同一个URL

Spring如何使用不同的映射注释调用同一个URL
EN

Stack Overflow用户
提问于 2019-02-02 09:31:34
回答 2查看 888关注 0票数 0

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

注意,尽管两个URL表单中的变量是不同的,但它们的值是相同的。它们只是来自不同的HTML页面。

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

@PostMapping方法

代码语言:javascript
复制
@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方法

代码语言:javascript
复制
@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

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-03 18:29:43

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

示例:

代码语言:javascript
复制
<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的this answer,然后在spring:form html表单中应用上面提到的表单属性。

票数 2
EN

Stack Overflow用户

发布于 2019-02-02 11:40:26

只有GET和POST才允许在表单中使用。您需要使用AJAX来指定请求的其他类型。嗨,您需要使用javascript和XMLHttpRequest来指定请求的类型。

下面是我从互联网上随机获取的一个例子:

代码语言:javascript
复制
// 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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54491723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档