阅读 189

胖哥学SpringMVC:RequestMapping注解之其它属性

@RequestMapping

个人建议重新练习一遍搭建的过程,如果感觉麻烦你可以直接复制上一个工程,但是需要修改pom.xml中的一点信息

<groupId>com.hanpang.springmvc</groupId>
<artifactId>springmvc-demo02</artifactId>
<version>0.0.1-SNAPSHOT</version>
复制代码

这章的内容简单了解就好

1.请求参数与请求头的值

可以筛选请求参数的条件来缩小请求匹配范围,比如"myParam"、"!myParam"及"myParam=myValue"等。前两个条件用于筛选存在/不存在某些请求参数的请求,第三个条件筛选具有特定参数值的请求。下面的例子展示了如何使用请求参数值的筛选条件:

请求参数params

package com.hanpang.web;

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

@Controller//告知其是一个控制器
@RequestMapping("/book")
public class Demo04Controller {
	@RequestMapping(value="/xiyouji",params="!myParam" )
	public ModelAndView test01() {
		System.out.println("不允许出现参数名myParam的名称");
		return null;
	}

	@RequestMapping(value="/shuihu",params="myParam")
	public ModelAndView test02() {
		System.out.println("路径传递的参数必须有名字叫myParam");
		return null;
	}
	@RequestMapping(value="/sanguo",params="myParam=shxt")
	public ModelAndView test03() {
		System.out.println("路径传递的参数必须有名字叫myParam,并且传递的值必须为shxt");
		return null;
	}
	@RequestMapping(value="/honglou",params="myParam!=shxt")
	public ModelAndView test04() {
		System.out.println("路径传递的参数必须有名字叫myParam,并且传递的值不能是shxt");
		return null;
	}

}
复制代码

NOTE: 个人在实际开发中很少使用params属性,请看代码中的输出语句就是说明

请求头headers

package com.hanpang.web;

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

@Controller//告知其是一个控制器
@RequestMapping("/book")
public class Demo04Controller {
	@RequestMapping(value="/sanguo",headers="myParam=shxt")
	public ModelAndView test03() {
		System.out.println("headers中需要传递参数myParam,并且值必须为shxt");
		return null;
	}
	@RequestMapping(value="/honglou",headers="myParam!=shxt")
	public ModelAndView test04() {
		System.out.println("headers中需要传递参数myParam,并且传递的值不能是shxt");
		return null;
	}
}
复制代码

这里使用PostMan进行了简单测试

访问路径无错误,但是没有设置请求头,会报错误404

设置请求头能正常访问了,但是注意如果不是shxt的值,依旧会报错误404

2.消费的媒体类型

可以指定一组可消费的媒体类型,缩小映射的范围。这样只有当请求头中 Content-Type 的值与指定可消费的媒体类型中有相同的时候,请求才会被匹配。比如:(官网代码)

@Controller
@RequestMapping(path = "/pets", consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) {
    // ......
}
复制代码

在后面的课程我们再来介绍,客户端传递数据到服务器获取,一般用于客户端传递JSON数据使用

3.生产的媒体类型

可以指定一组生产的媒体类型,缩小映射的范围。这样只有当请求头中Accept的值与指定可生产的媒体类型中有相同的时候,请求才会被匹配。而且,使用produces条件可以确保用于生成响应的内容与指定的可生产的媒体类型是相同的。比如:(官网代码)

@Controller
@RequestMapping(path = "/pets/{petId}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {
    // ......
}
复制代码

在后面我们研究控制器返回类型,我们再来说明

需要注意的是通过condition条件指定的媒体类型也可以指定字符集。比如在上面的小段代码中,还是覆写了MappingJackson2HttpMessageConverter类中默认配置的媒体类型,同时还指定了使用UTF-8的字符集。

consumes条件类似,可生产的媒体类型表达式也可以使用否定。比如,可以使用!text/plain来匹配所有请求头Accept中不含text/plain的请求。同时,在MediaType类中还定义了一些常量,比如APPLICATION_JSON_VALUEAPPLICATION_JSON_UTF8_VALUE等,推荐更多地使用它们

produces属性提供的是方法级的类型支持。与其他属性不同,当在类型级使用时,方法级的消费类型将覆盖类型级的配置,而非继承关系。

关注下面的标签,发现更多相似文章
评论