使用@RequestMapping 注解时获取请求的值(URL)

Posted

技术标签:

【中文标题】使用@RequestMapping 注解时获取请求的值(URL)【英文标题】:Get requested value(URL) when using @RequestMapping annotations 【发布时间】:2011-11-27 10:06:06 【问题描述】:

当我将多个值映射到@RequestMapping(如Multiple Spring @RequestMapping annotations)时,我可以获得请求的值(URL)吗?

像这样:

@RequestMapping(value="/center", "/left", method=RequestMethod.GET)
public String getCenter(Model model) throws Exception      
    String requestedValue = getRequestedValue();  // I want this.

    // I want to do something like this with requested value.
    String result; 
    if (requestedValue.equals("center")
        result = "center";
    else if (requestedValue.equals("left")
        result = "left";
    return result;

【问题讨论】:

【参考方案1】:

您可以将请求 (HttpServletRequest) 本身作为处理程序方法的参数。因此,您可以检查请求 url 以获取“值”。

@RequestMapping(value="/center", "/left", method=RequestMethod.GET)
public String getCenter(Model model, HttpServletRequest request) throws Exception              
   String whatYouCallValue = request.getServletPath(); 
   ....

Javadoc:https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletRequest.html#getServletPath--

顺便说一句:如果我理解你的话,你想要不同的 url,而不是不同的值。

【讨论】:

谢谢它的工作。我称它为值是因为属性的名称是值,但现在我认为它可能会造成混淆。我会纠正一些。【参考方案2】:

从 Spring 3.1.0 开始,您可以使用ServletUriComponentsBuilder

@RequestMapping(value="/center", "/left", method=RequestMethod.GET)
    public String getCenter(Model model) throws Exception      
        UriComponentsBuilder builder = ServletUriComponentsBuilder.fromCurrentRequest();
        String requestedValue = builder.buildAndExpand().getPath();  // I want this.
        System.out.println(requestedValue);
        // I want to do something like this with requested value.
        String result="fail"; 
        if (requestedValue.equals("center"))
            result = "center";
        else if (requestedValue.equals("left"))
            result = "left";
        return result;
    

【讨论】:

这正是我想要的。我不想用内部的东西弄乱 API 映射定义。 ServletUriComponentsBuilder.fromRequest(HttpServletRequest request) 在拦截器中运行良好。【参考方案3】:

遵循正则表达式将使您的方法仅对 URL /center/left 执行。并且可以通过@PathVariable注解获取值。

@GetMapping("/path:^center$|^left$")
public ResponseEntity<?> whatIsThePath(@PathVariable String path)
    // path is either "center" or "left"

【讨论】:

【参考方案4】:

除了最佳答案@Hugh_Lee: 此方法适用于所有未映射的请求。如果您只想将此方法用于两种(或几种)情况,例如“/center”和“/left”,你可以做以下。将“center”重命名为“positionCenter”,将“left”重命名为“positionLeft”(或添加另一个常用词)。所以代码是这样的:

@RequestMapping(value="/path:position+[A-Za-z-]+", method=RequestMethod.GET)
public String getCenter(@PathVariable String path) throws Exception              
    // "path" is what I want

【讨论】:

【参考方案5】:

从 Spring 3.1.0 开始,您可以使用URI Template Patterns with Regular Expressions。

@RequestMapping(value="/path:[a-z-]+", method=RequestMethod.GET)
public String getCenter(@PathVariable String path) throws Exception              
    // "path" is what I want

【讨论】:

【参考方案6】:

使用 RequestParam 注释。您还可以将 HttpServletRequest 类型的参数添加到您的方法中,然后从中获取参数。

【讨论】:

似乎 Sangdol 表示不同的 url,而不是 http 值。 (所以他的“价值观”这个词有点混乱)

以上是关于使用@RequestMapping 注解时获取请求的值(URL)的主要内容,如果未能解决你的问题,请参考以下文章

[SSM]SpringMVC 详解 @RequestMapping 注解获取请求参数和域数据共享

spring boot 注解

接口请求的一些注解使用笔记

2. @RequestMapping注解

注解@RequestMapping 的使用

RequestMapping注解_修饰类