SpringMVC-@RequestMapping的参数和用法

SpringMVC-@RequestMapping的参数和用法RequestMapping里面的注解包含的参数如图:RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。@RequestMapping除了修饰方法,还可来修饰类:类定义处:提供初步的请求映射信息。相对于WEB应用的根目录;方法处:提供进一步的细分映射信息。相对于类定义处的URL。若类定义处未

大家好,又见面了,我是你们的朋友全栈君。

【1】概述

从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。

① @RequestMapping注解的位置

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

  • @RequestMapping标识一个类:设置映射请求的请求路径的初始信息

  • @RequestMapping标识一个方法:设置映射请求请求路径的具体信息

类定义处: 提供初步的请求映射信息。相对于 WEB 应用的根目录;方法处: 提供进一步的细分映射信息, 相对于类定义处的 URL。

若类定义处未标注 @RequestMapping,则方法处标记的 URL相对于 WEB 应用的根目录。如果类上没有映射,那么url直接就是方法的映射;否则url为类上+方法上映射路径组合。

② RequestMapping注解

@Target({ 
   ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping { 
   

	 //mapping名称
	String name() default "";

	 //方法匹配的URL
	@AliasFor("path")
	String[] value() default { 
   };

	@AliasFor("value")
	String[] path() default { 
   };

	 //方法接受的http method类型
	RequestMethod[] method() default { 
   };

	 //方法指导必须包含某些parameters
	String[] params() default { 
   };

	// 方法指定请求必须包含某些请求头
	String[] headers() default { 
   };

	 //方法接受的media type
	String[] consumes() default { 
   };

	 //方法返回的media type
	String[] produces() default { 
   };
}

【2】属性详解

RequestMapping注解有六个属性,下面我们把它分成三类进行说明。

① value, method

value

指定请求的实际地址,指定的地址可以是URI Template 模式;

  • @RequestMapping注解的value属性通过请求的请求地址匹配请求映射
  • @RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求
  • @RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射

method

要映射到的HTTP请求方法,缩小了主要映射范围:GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE

在类型级别和方法级别都受支持。在类型级别使用时,所有方法级别映射都继承此HTTP方法限制。

  • @RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射
  • @RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配
    多种请求方式的请求
  • 若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错405:Request method 'POST' not supported

② consumes,produces

consumes

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

按映射处理程序可以使用的媒体类型( media type)缩小主映射范围。由一个或多个媒体类型组成,其中一个媒体类型必须与请求 Content Type头匹配。实例如下:

consumes = "text/plain"
consumes = { 
   "text/plain", "application/*"}
consumes = MediaType.TEXT_PLAIN_VALUE

consumes 表达式可以使用!进行否定,如中所示!text/plain,它匹配所有Content-Type非“text/plain”的请求。在类型级别和方法级别都受支持。如果在两个级别上都指定,则方法级别使用条件将覆盖类型级别条件。

produces

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

按可由映射处理程序生成的媒体类型缩小主映射范围。由一种或多种媒体(media type)类型组成,其中一种媒体类型必须根据请求头Accept的媒体类型通过内容协商选择。通常,这些数据是从Accept头中提取出来的,但也可以从查询参数或其他参数中派生出来。

produces = "text/plain"
produces = { 
   "text/plain", "application/*"}
produces = MediaType.TEXT_PLAIN_VALUE
produces = "text/plain;charset=UTF-8"

如果声明的媒体类型包含一个参数(例如“charset=UTF-8”、“type=feed”、“type=entry”),并且请求中的兼容媒体类型也包含该参数,则参数值必须匹配。否则,如果请求中的媒体类型不包含对应参数,则假定客户端接受任何值。

表达式可以使用!进行否定,如中所示!text/plain,它匹配所有Accept非“text/plain”的请求。在类型级别和方法级别都受支持。如果在两个级别上都指定,则方法级别使用条件将覆盖类型级别条件。


③ params,headers

params

指定request中必须包含某些参数值时,才让该方法处理。映射请求的参数,缩小了主映射范围。任何环境的格式都相同:一系列“myParam=myValue”样式的表达式,只有在发现每个此类参数都具有给定值时才映射请求。

表达式可以使用“!=”进行否定运算符,如“myParam!=myValue“。还支持“myParam”样式的表达式,这些参数必须存在于请求中(允许有任何值)。最后,“!myParam”样式表达式表示指定的参数不应该出现在请求中。

在类型级别和方法级别都受支持。如果在两个级别上都指定,则方法级别使用条件将覆盖类型级别条件。

@RequestMapping注解的params属性通过请求的请求参数匹配请求映射。@RequestMapping注解params属性是一个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系:

  • param”:要求请求映射所匹配的请求必须携带param请求参数
  • !param”:要求请求映射所匹配的请求必须不能携带param请求参数
  • param=value”:要求请求映射所匹配的请求必须携带param请求参数且param=value
  • param!=value”:要求请求映射所匹配的请求必须携带param请求参数但是param!=value

headers

指定request中必须包含某些指定的header值,才能让该方法处理请求。映射请求头,缩小了主映射范围。任何环境的格式都相同:一系列“My-Header=myValue”样式的表达式,只有在发现每个这样的头都有给定的值时,才会映射请求。

表达式可以使用“!=”进行否定运算符,如“My-Header!=myValue“。还支持“My-Header”样式的表达式,这样的头必须出现在请求中(允许有任何值)。最后,“!My-Header”样式表达式表示指定的头不应出现在请求中。

还支持媒体类型通配符(*),用于Accept 和内容类型Content-Type等header。例如RequestMapping(value = "/something", headers = "content-type=text/*")将会 Content-Type匹配内容类型为"text/html", "text/plain"等等的请求。

在类型级别和方法级别都受支持。如果在两个级别上都指定,则方法级别使用条件将覆盖类型级别条件。

@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射。@RequestMapping注解的headers属性是一个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系:

  • header”:要求请求映射所匹配的请求必须携带header请求头信息
  • !header”:要求请求映射所匹配的请求必须不能携带header请求头信息
  • "header=value":要求请求映射所匹配的请求必须携带header请求头信息且header=value
  • header!=value”:要求请求映射所匹配的请求必须携带header请求头信息且header!=value

若当前请求满足@RequestMapping注解的value和method属性,但是不满足headers属性,此时页面
显示404错误,即资源未找到。


【3】测试示例

① value or path

JSP 页面

<a href="springmvc/testRequestMapping">Test RequestMapping</a>

controller

@RequestMapping(value="/testRequestMapping" )
public String testRequestMapping() { 
   
	System.out.println("testRequestMapping");
	return SUCCESS;
}

成功返回success.jsp 。若 href 属性值,不等于value值,则将提示404错误。

value的uri值为三类

SpringMVC支持ant风格的路径

  • :表示任意的单个字符
  • *:表示任意的0个或多个字符
  • **:表示任意的一层或多层目录

可以指定为普通的具体值

@RequestMapping("/testRequestMapping")

可以指定为含有某变量的一类值(URI Template Patterns with Path Variables)–restful风格

@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable Integer id2) { 
   
	System.out.println("testPathVariable: " + id2);
	return SUCCESS;
}

除了value还有path,二者效果等同,可以参考源码如下图:

这里写图片描述

其中关于@PathVariable 有如下说明

① 如果路径中的变量与方法中的变量名一致,可直接使用@PathVariable

② 如果二者不一致,则使用@PathVariable(Variable)显示指定要绑定的路径中的变量 。

@PathVariable只能绑定路径中的占位符参数,且路径中必须有参数。

@PathVariable用法参考路径参数绑定参考

@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id2) { 
   
	System.out.println("testPathVariable: " + id2);
	return SUCCESS;
}
//路径中的 id 与 方法中的 id2 绑定

可以指定为含正则表达式的一类值( URI Template Patterns with Regular Expressions)

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")  
public void handle(@PathVariable String version, @PathVariable String extension) { 
         
  // ... 
}  

② method

JSP 页面

<a href="springmvc/testMethod">Test Method</a>
//href 默认为get 请求。

controller–限制接收post 请求

@RequestMapping(value = "/testMethod", method = RequestMethod.POST)
public String testMethod() { 
   
	System.out.println("testMethod");
	return SUCCESS;
}

result as follows :HTTP Status 405 – Request method ‘GET’ not supported 。

这里写图片描述

状态码405表示:请求中指定的方法不被允许。将method 改为method = RequestMethod.GET正常跳转页面。


③ consumes

JSP 页面

仍以testMethod为例,提交表单。默认contentTypeContent-Type:application/x-www-form-urlencoded

<form action="springmvc/testMethod" method="POST">
	<input type="text" name="username" value=""/>
	<input type="submit" value="submit"/>
</form>

这里写图片描述


controller–限制接收post 请求以及consumes="application/json"

@RequestMapping(value = "/testMethod", method = RequestMethod.POST,consumes="application/json")
public String testMethod() { 
   
	System.out.println("testMethod");
	return SUCCESS;
}

result as follows :

这里写图片描述

状态码415表示:由于媒介类型不被支持,服务器不会接受请求。去掉 consumes属性,页面正常跳转 !


④ produces

后台代码

@RequestMapping(value = "/testMethod", method = RequestMethod.POST,produces="application/json")
public void testMethod2(HttpServletRequest request,HttpServletResponse response,Model model) 
throws IOException { 
   
	request.getHeader("Accept");
	System.out.println(request.getHeader("Accept"));
	// response.setContentType("application/json");
	String username = request.getParameter("username");
	System.out.println("testMethod..."+username);
	model.addAttribute("user", username);
	Object jsonString =  "{'name': 'helloworlda'}";
	JSONObject jsonobj=JSONObject.fromObject(jsonString);
	PrintWriter out = response.getWriter();
	out.print(jsonobj);
}

浏览器请求头

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

其中最后一项 : */*;q=0.8。该项表明可以接收任何类型的,权重系数0.8表明如果前面几种类型不能正常接收。则使用该项进行自动分析。application/json 几种主流浏览器都可以自动解析。


⑤ params

JSP页面

form action="springmvc/testParamsAndHeaders" method="POST">
	<input type="text" name="username" value=""/>
	<input type="text" name="age" value=""/>
	<input type="submit" value="submit"/>
</form>

参数 username=tom;age = 10;

后台代码

设定必须包含username 和age两个参数,且age参数不为10 (可以有多个参数)。

@RequestMapping(value = "testParamsAndHeaders", params = { 
    "username","age!=10" })
public String testParamsAndHeaders() { 
   
	System.out.println("testParamsAndHeaders");
	return SUCCESS;
}

result as follows :

这里写图片描述

状态码400表示:服务器未能理解请求。 将age 改为其他值,正常跳转。

这里写图片描述


⑥ headers

浏览器请求头

这里写图片描述

后台测试代码

@RequestMapping(value = "testParamsAndHeaders", params = { 
    "username","age!=10" }, headers = { 
    "Accept-Language=US,zh;q=0.8" })
public String testParamsAndHeaders() { 
   
	System.out.println("testParamsAndHeaders");
	return SUCCESS;
}

设定请求头中第一语言必须为US。

result as follows :

这里写图片描述

状态码404表示:服务器无法找到被请求的页面。将后台代码改为zh-CN即可页面正常跳转。

这里写图片描述

① 服务器首先根据URL去找页面,如果找不到就返回404;

② 如果找到,但是不能正常处理,就会返回 5XX 类型错误。

其中在第一步过程中,会根据请求头进行一系列判断 !

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141187.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号