@RequestMapping 是 Spring Web 使用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映照到 MVC 和 REST 把持器的处置办法上。
在这篇文章中,你将会看到 @RequestMapping 注解在被用来实行 Spring MVC 把持器办法的映照可以怎么发扬其多才多艺的功用的。
在 Spring MVC 使用程序中,RequestDispatcher (在 Front Controller 之下) 这个 servlet 担任将进入的 HTTP 请求路由到把持器的处置办法。
在对 Spring MVC 实行的配置的时分, 你需求指定请求与处置办法之间的映照关系。
要配置 Web 请求的映照,就需求你用上 @RequestMapping 注解。
@RequestMapping 注解可以在把持器类的级别和/或此中的办法的级别上运用。
在类的级别上的注解会将一个特定请求或者请求形式映照到一个把持器之上。以后你还可以别的添加办法级此外注解来进一步指定四处理办法的映照关系。
下面是一个同时在类和办法上使用了 @RequestMapping 注解的示例:
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping("/") String get() { //mapped to hostname:port/home/ return "Hello from get"; } @RequestMapping("/index") String index() { //mapped to hostname:port/home/index/ return "Hello from index"; } }
如上述代码所示,到 /home 的请求会由 get() 办法来处置,而到 /home/index 的请求会由 index() 来处置。
你可以将多个请求映照到一个办法上去,只需求添加一个带有请求途径值列表的 @RequestMapping 注解就好了。
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(value = { "", "/page", "page*", "view/*,**/msg" }) String indexMultipleMapping() { return "Hello from index multiple mapping."; } }
如你在这段代码中所看到的,@RequestMapping 支撑统配符和ANT风格的途径。后面这段代码中,以下的这些 URL 都会由 indexMultipleMapping() 来处置:
localhost:8080/home
localhost:8080/home/
localhost:8080/home/page
localhost:8080/home/pageabc
localhost:8080/home/view/
localhost:8080/home/view/view
@RequestParam 注解共同 @RequestMapping 一同运用,可以将请求的参数同处置办法的参数绑定在一同。
@RequestParam 注解运用的时分可以有一个值,也能够没有值。这个值指定了需求被映照四处理办法参数的请求参数, 代码以下所示:
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(value = "/id") String getIdByValue(@RequestParam("id") String personId) { System.out.println("ID is " + personId); return "Get ID from query string of URL with value element"; } @RequestMapping(value = "/personId") String getId(@RequestParam String personId) { System.out.println("ID is " + personId); return "Get ID from query string of URL without value element"; } }
在代码的第6行,id 这个请求参数被映照到了 thegetIdByValue() 这个处置办法的参数 personId 上。
假如请求参数和处置办法参数的称号一样的话,@RequestParam 注解的 value 这个参数便可免却了, 如代码的第11行所示。
@RequestParam 注解的 required 这个参数定义了参数值是不是是必需要传的。
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(value = "/name") String getName(@RequestParam(value = "person", required = false) String personName) { return "Required element of request param"; } }
在这段代码中,由于 required 被指定为 false,所以 getName() 处置办法关于以下两个 URL 都会实行处置:
/home/name?person=xyz
/home/name
@RequestParam 的 defaultValue 取值就是用来给取值为空的请求参数供给一个默许值的。
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(value = "/name") String getName(@RequestParam(value = "person", defaultValue = "John") String personName) { return "Required element of request param"; } }
在这段代码中,假如 person 这个请求参数为空,那末 getName() 处置办法就会接纳 John 这个默许值作为其参数。
Spring MVC 的 @RequestMapping 注解可以处置 HTTP 请求的办法, 比方 GET, PUT, POST, DELETE 和 PATCH。
一切的请求默许都会是 HTTP GET 类型的。
为了能降一个请求映照到一个特定的 HTTP 办法,你需求在 @RequestMapping 中运用 method 来声明 HTTP 请求所运用的办法类型,以下所示:
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(method = RequestMethod.GET) String get() { return "Hello from get"; } @RequestMapping(method = RequestMethod.DELETE) String delete() { return "Hello from delete"; } @RequestMapping(method = RequestMethod.POST) String post() { return "Hello from post"; } @RequestMapping(method = RequestMethod.PUT) String put() { return "Hello from put"; } @RequestMapping(method = RequestMethod.PATCH) String patch() { return "Hello from patch"; } }
在上述这段代码中, @RequestMapping 注解中的 method 元素声了然 HTTP 请求的 HTTP 办法的类型。
一切的处置处置办法会处置从这统一个 URL( /home)出去的请求, 但要看指定的 HTTP 办法是甚么来决议用哪一个办法来处置。
例如,一个 POST 类型的请求 /home 会交给 post() 办法来处置,而一个 DELETE 类型的请求 /home 则会由 delete() 办法来处置。
你会看到 Spring MVC 将运用如许类似的逻辑来映照其它的办法。
可使用 @RequestMapping 注解的 produces 和 consumes 这两个元从来减少请求映照类型的范畴。
为了能用请求的媒体类型来发生工具, 你要用到 @RequestMapping 的 produces 元素再联合着 @ResponseBody 注解。
你也能够应用 @RequestMapping 的 comsumes 元素再联合着 @RequestBody 注解用请求的媒体类型来花费工具。
下面这段代码就用到的 @RequestMapping 的生产和花费工具元素:
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(value = "/prod", produces = { "application/JSON" }) @ResponseBody String getProduces() { return "Produces attribute"; } @RequestMapping(value = "/cons", consumes = { "application/JSON", "application/XML" }) String getConsumes() { return "Consumes attribute"; } }
在这段代码中, getProduces() 处置办法会发生一个 JSON 呼应, getConsumes() 处置办法可以同时处置请求中的 JSON 和 XML 内容。
@RequestMapping 注解供给了一个 header 元从来依据请求中的消息头内容减少请求映照的范畴。
在可以指定 header 元素的值,用 myHeader = myValue 如许的格局:
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(value = "/head", headers = { "content-type=text/plain" }) String post() { return "Mapping applied along with headers"; } }
在上面这段代码中, @RequestMapping 注解的 headers 属性将映照范畴减少到了 post() 办法。有了这个,post() 办法就只会处置到 /home/head 而且 content-typeheader 被指定为 text/plain 这个值的请求。
你也能够像下面如许指定多个消息头:
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(value = "/head", headers = { "content-type=text/plain", "content-type=text/html" }) String post() { return "Mapping applied along with headers"; } }
如许, post() 办法就可以同时承受 text/plain 另有 text/html 的请求了。
@RequestMapping 直接的 params 元素可以进一步协助我们减少请求映照的定位范畴。运用 params 元素,你可让多个处置办法处置到统一个URL 的请求, 而这些请求的参数是纷歧样的。
你可以用 myParams = myValue 这类格局来定义参数,也能够运用通配符来指定特定的参数值在请求中是不受支撑的。
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(value = "/fetch", params = { "personId=10" }) String getParams(@RequestParam("personId") String id) { return "Fetched parameter using params attribute = " + id; } @RequestMapping(value = "/fetch", params = { "personId=20" }) String getParamsDifferent(@RequestParam("personId") String id) { return "Fetched parameter using params attribute = " + id; } }
在这段代码中,getParams() 和 getParamsDifferent() 两个办法都能处置类似的一个 URL (/home/fetch) ,可是会依据 params 元素的配置分歧而决议详细来履行哪个办法。
例如,当 URL 是 /home/fetch?id=10 的时分, getParams() 会履行,由于 id 的值是10,。关于 localhost:8080/home/fetch?personId=20 这个URL, getParamsDifferent() 处置办法会失掉履行,由于 id 值是 20。
@RequestMapping 注解可以同 @PathVaraible 注解一同运用,用来处置静态的 URI,URI 的值可以作为把持器中处置办法的参数。你也能够运用正则表达式来只处置可以适配到正则表达式的静态 URI。
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping(value = "/fetch/{id}", method = RequestMethod.GET) String getDynamicUriValue(@PathVariable String id) { System.out.println("ID is " + id); return "Dynamic URI parameter fetched"; } @RequestMapping(value = "/fetch/{id:[a-z]+}/{name}", method = RequestMethod.GET) String getDynamicUriValueRegex(@PathVariable("name") String name) { System.out.println("Name is " + name); return "Dynamic URI parameter fetched using regex"; } }
在这段代码中,办法 getDynamicUriValue() 会在倡议到 localhost:8080/home/fetch/10 的请求时履行。这里 getDynamicUriValue() 办法 id 参数也会静态地被填充为 10 这个值。
办法 getDynamicUriValueRegex() 会在倡议到 localhost:8080/home/fetch/category/shirt 的请求时履行。不外,假如倡议的请求是 /home/fetch/10/shirt 的话,会抛出异常,由于这个URI其实不能适配正则表达式。
@PathVariable 同 @RequestParam的运转方法分歧。你运用 @PathVariable 是为了从 URI 里取到查询参数值。换言之,你运用 @RequestParam 是为了从 URI 模板中获得参数值。
在把持器类中,你可以有一个默许的处置办法,它可以在有一个向默许 URI 倡议的请求时被履行。
下面是默许处置办法的示例:
@RestController @RequestMapping("/home") public class IndexController { @RequestMapping() String default () { return "This is a default method for the class"; } }
在这段代码中,向 /home 倡议的一个请求将会由 default() 来处置,由于注解并没有指定任何值。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),供给担保交易、源码交易、虚拟商品、在家创业、在线创业、Task交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接生意、网站交易、广告生意、站长培训、建站美工等服务