Spring MVC Java 为什么在我的 url 中添加了额外的请求参数?

Spring MVC Java why are extra request params being added to my url?

提问人:sebbington 提问时间:9/11/2023 最后编辑:Roman Csebbington 更新时间:9/11/2023 访问量:41

问:

我有一个网站,叫做.我有一个表格,看起来像这样:website.com

<form:form method="get" id="profileForm" modelAttribute="profile" onsubmit="updateFormAction()">
                    <form:label path="username">Name</form:label>
                    <form:input path="username" id="usernameInput"/>
                    <input type="submit" value="Submit"/>
                </form:form>

                <script>
                    function updateFormAction() {
                        var username = document.getElementById("usernameInput").value;
                        var form = document.getElementById("profileForm");
                        form.action = "/profile/" + username;
                    }
                </script>


表单 url 应该如下所示:website.com/profile/username123

但是,它正在将其处理为website.com/profile/username123?username=username123

这是我的 Web 控制器映射方法:

@GetMapping ("/profile/{username}")
    public String profile(@PathVariable("username") String name, Model model, RestTemplate restTemplate) throws JsonProcessingException {

当我设置它时,它可以工作。但是,我不希望这种行为,因为我只能通过该表单发布该网址。我希望能够通过链接进行搜索。<form method="post"

我已经试过了,但是网址看起来像@ModelAttribute("username") String usernamewebsite.com/profile/?username=username123

我有什么想法可以解决这个问题吗?我不应该使用表单,而应该使用参数吗?button onsubmit

Java Spring Forms JSP 模型-视图-控制器

评论

0赞 M. Deinum 9/11/2023
您应该通过 JS 发送请求,而不是修改表单操作。因为 GET 将始终将参数添加到 URL。因此,与其以您应该用于发送请求的表单重写 URL(并从 JS 函数返回以防止发生默认值)。fetchfalse

答:

0赞 mamJavad 9/11/2023 #1

你为什么要添加? 我认为您可以删除属性和 for 添加并使您的 http 动词发布到 和 . 您可以创建一个名为 的对象,该对象具有一个名为 ; 在您的输入中添加usernamepath variableonSubmitaction/profileformcontrollerprofileusernamecontroller

@ModelAttribute("profile") Profile profile;

那么你可以像这样进入 STH:usernameprofile

@PostMapping ("/profile")
public String profile(@ModelAttribute("profile") Profile profile) {

评论

0赞 sebbington 9/11/2023
我已经尝试过了,但是对于 POST 请求,我只能从表单本身访问资源,而不能从链接访问资源。
0赞 M. Deinum 9/11/2023
对于帖子,无论它是请求参数还是表单参数,它都会以任何一种方式绑定。
0赞 Roman C 9/11/2023 #2

如果您没有在 url 中传递任何参数,则不应提交表单。只需从 onsubmit 函数返回即可。这将阻止表单提交或使用带有 onclick 事件处理程序的按钮。然后使用重定向直接到指定的 url。falsetype="button"

<script>
  function updateFormAction() {
     var username = document.getElementById("usernameInput").value;
     window.location.href = "/profile/" + username;
     return false;
  }
</script>

评论

0赞 Roman C 9/12/2023
如果这个答案对你有帮助,那么你应该把它标记为接受。我在答案左边的复选框。此外,值得投票支持帮助您的答案,以帮助其他人选择正确的答案。