Spring MVC系列(二)之@RequestMapping和URL映射

@RequestMapping是一个用来处理请求地址映射的注解,可以注解与类上,也可以注解与类中的方法上,注解与类上,表示该Controller的统一标识,通常表示一个模块的表示,注解在方法,则表示某请求又那个方法进行处理


@RequestMapping有几个属性


一:value属性

value表示URI的路径标识,例如

对应的路径就是IP:端口号/项目名/mapping/test,对应我们上节中的例子就是localhost:8080/mapping/test,这样的url就会映射到我们test的方法的处理


1)注意,这样的映射路径要唯一,例如如下

package org.study.lyncc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {
    
    @RequestMapping(value="/test")
    public ModelAndView test(){
        return new ModelAndView("test");
    }
    
    @RequestMapping(value="/test")
    public ModelAndView test1(){
        return new ModelAndView("test1");
    }
    
}
如果是这样的代码,方法test和test1的映射路径的URI都是/mapping/test,spring mvc启动的时候就会报错

意思是/mapping/test已经被方法test映射到处理,但你的test1的URI依旧是/mapping/test,所以报错,其实很好理解,如果两个方法对应同一个URL那么真实请求过来后,到底是由谁去处理?


2)关于value的值可以有如下几种类型

   ①某一普通的具体值,例如/test

   ②某一统一变量,通常用{}符号标识,例如/{id}

   ③正则表达式,通常用{}符号标识,例如{method:\\w+}

   ④以上几种类型的集合


①的例子就不举例了,我们举个②的例子

package org.study.lyncc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {
    
    @RequestMapping(value="/{id}")
    public ModelAndView test1(){
        ModelAndView mav = new ModelAndView("test");
        return mav;
    }
    
    
}
当我们的URL如下都可以映射到

localhost:8080/spring-mvc/mapping/1

localhost:8080/spring-mvc/mapping/2

localhost:8080/spring-mvc/mapping/234

localhost:8080/spring-mvc/mapping/12dsfsa2

都能准确的被test1方法映射到,并处理


③正则表达的例子

package org.study.lyncc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {
    
    @RequestMapping(value="/{:\\d}")
    public ModelAndView reg(){
        ModelAndView mav = new ModelAndView("test");
        return mav;
    }
    
    
}
与之对应我们在WEB-INF/jsp文件夹下新建test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello</title>
</head>
<body>
  test requestMapping
</body>
</html>
当我们在浏览器中输入如下URL:

http://localhost:8080/spring-mvc/mapping/1

http://localhost:8080/spring-mvc/mapping/2

http://localhost:8080/spring-mvc/mapping/3

http://localhost:8080/spring-mvc/mapping/4

都能正确跳转到

但是如果你的URL是

http://localhost:8080/spring-mvc/mapping/d

http://localhost:8080/spring-mvc/mapping/44


正则表达“\d”是匹配一个数字字符。等价于[0-9]。“d”,“44”则会无法匹配正则,所以该方法不进行该url的处理


④综合的例子

package org.study.lyncc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {
    
    @RequestMapping(value="/{:\\d}/user/{id}/detail")
    public ModelAndView comprehensiveDemo(){
        ModelAndView mav = new ModelAndView("test");
        return mav;
    }
    
    
}
那么URL可以输入:
http://localhost:8080/spring-mvc/mapping/4/user/abc/detail

这样依旧可以映射到


二:method属性

method的值是用来处理用户请求的属性的,是Get请求,还是post请求,还是PUT请求,等等,spring MVC都可以进行精细的管理,由于Mehtod的值是固定的,所以spring mvc用枚举进行管理

package org.springframework.web.bind.annotation;

public enum RequestMethod {

	GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE

}

我们举个例子证明一下:

package org.study.lyncc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {
    
    @RequestMapping(value = "/detail",method = RequestMethod.GET)
    public ModelAndView methodTestDemo(){
        ModelAndView mav = new ModelAndView("test");
        return mav;
    }
    
    
}
浏览器url是http://localhost:8080/spring-mvc/mapping/detail,因为浏览器默认是GET请求

我们修改代码,将请求改成post

package org.study.lyncc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {
    
    @RequestMapping(value = "/detail",method = RequestMethod.POST)
    public ModelAndView methodTestDemo(){
        ModelAndView mav = new ModelAndView("test");
        return mav;
    }
    
    
}
,我们再次同一url请求

提示不支持GET请求


三:headers

headers指定request中必须包含某些指定的header值,才能让该方法处理请求,我们平时一般用不到该属性,我们还是做一个例子吧

package org.study.lyncc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {
    
    @RequestMapping(value = "/detail",headers="location=www.tuniu.com")
    public ModelAndView HeadersDemo(){
        ModelAndView mav = new ModelAndView("test");
        return mav;
    }
    
    
}
这边我们指定请求中headers需要有key/Value的键值对,key是location,value是www.tuniu.com

我们用普通的浏览器访问


说明spring不进行处理,我们选用一个第三方工具测试一下RESTClient

当我们加入请求headers时,发现能正常返回提示200,且能返回Body


四:consumer 表示指定处理请求的提交内容类型(Content-Type),例如application/json, text/html等等

我们还是举例说明吧

package org.study.lyncc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {
    
    @RequestMapping(value = "/detail",consumes="application/json")
    public ModelAndView HeadersDemo(){
        ModelAndView mav = new ModelAndView("test");
        return mav;
    }
    
    
}
表示我们请求体Content-Type:"application\json;charset=utf-8"才会响应,如果我们浏览器直接访问



报错了,415错误,415错误是指 对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝


好了,我们用工具去访问

请求成功


五:produces指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

举例说明:

package org.study.lyncc.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {
    
    @RequestMapping(value = "/detail",produces="application/json")
    public Object HeadersDemo(){
        ......
    }
    
    
}
这样一般返回application\json的格式数据,这个以后会再做分析


好了,到此为止,关于@RequestMapping一些常用的URL映射关系已经讲解结束了~END~

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值