如何为特定 URL 创建控制器 [重复]

Posted

技术标签:

【中文标题】如何为特定 URL 创建控制器 [重复]【英文标题】:How to create the controller for a specific URL [duplicate] 【发布时间】:2018-09-14 04:10:12 【问题描述】:

我需要从这个网址开始,http://localhost:8080/home/filter?projectId=1;fileId=1

我创建了这个控制器:

@GetMapping("/home/filter/projectId/fileId")
public String filter(@PathVariable("projectId") int projectId, @PathVariable("fileId") int fileId) 

    System.out.println("Project Id " + projectId);

    System.out.println("File Id " + fileId);

    return "redirect:/home";

当我测试时:http://localhost:8080/home/filter?projectId=1;fileId=1 我收到此错误:

 This application has no explicit mapping for /error, so you are seeing this as a fallback.
 Wed Apr 04 17:24:51 EEST 2018
 There was an unexpected error (type=Not Found, status=404).
 /home/filter

我不知道该怎么办..

【问题讨论】:

如果您使用的是 spring boot,那么您肯定正在执行其中之一,请在此处查看。***.com/questions/49375500/… 提示:/home/filter?projectId=1;fileId=1 格式不同于 /home/filter/projectId/fileId 必须是这样的:/home/filterprojectIdfileId ?? 【参考方案1】:

您需要了解 URL 中 query 参数和 path 参数之间的区别。

查询参数是?之后的参数,格式为name=value(如果有多个参数,则以&分隔), 比如http://localhost:8080/home/filter?projectId=1&fileId=1。 路径参数由/分隔(如果有,则在?之前), 比如http://localhost:8080/home/filter/1/1

对于 query 参数,您可以在控制器中使用 @RequestParam 注释。 示例:对于像 http://localhost:8080/home/filter?projectId=1&fileId=1 这样的 URL 您的控制器可能如下所示:

@GetMapping("/home/filter")
public String filter(@RequestParam("projectId") int projectId,  
                     @RequestParam("fileId") int fileId) 
    ...

对于 path 参数,您可以在控制器中使用 @PathVariable 注释。 示例:对于像 http://localhost:8080/home/filter/1/1 这样的 URL 控制器可能如下所示:

@GetMapping("/home/filter/projectId/fileId")
public String filter(@PathVariable("projectId") int projectId,  
                     @PathVariable("fileId") int fileId) 
    ...

【讨论】:

注意http://localhost:8080/home/filter?projectId=1;fileId=1http://localhost:8080/home/filter?projectId=1&fileId=1之间的区别 @larsgrefer 感谢您的指出。似乎我混淆了查询和矩阵参数。更新了我的答案。 我只是不确定 Spring 是否实现了这个建议:w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.2.2 @larsgrefer 我已经测试过 Spring 是否实现了这个建议。而且似乎 Spring 仅通过 & 分隔查询参数,而不是 ;【参考方案2】:

TL;DR:只需调用正确的 URL:http://localhost:8080/home/filter/1/1

注意路径参数和查询参数的区别。

您的控制器映射使用路径参数,而您调用的 URL 使用查询参数

【讨论】:

如果我这样尝试,它可以工作,但我不明白localhost:8080/home/filter/1/1 和localhost:8080/home/filter?projectId=1;fileId=1 之间有什么区别 第一个 URL 的路径为/home/filter/1/1,没有查询参数。第二个 URL 具有路径 /home/filter 和一个名为 projectId 的查询参数,其值为 1;fileId=1

以上是关于如何为特定 URL 创建控制器 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何为访问控制和跟踪创建数据库设计?

如何为控制多个散景图形添加一个图例?

如何为git启用多个用户名?即。具体项目可以有特定的用户名[重复]

如何为codeigniter设置cron作业url?

如何为拆分视图控制器创建启动页面

如何为 GridView 中的特定行指定 CSS 类?