【学习】springmvc之@RequestMapping映射请求

来源:互联网 发布:mysql 按月份查询 编辑:程序博客网 时间:2024/05/18 17:23

1、使用简单的@RequestMapping映射请求

使用@RequestMapping注释来将URL映射/appointments到整个类或特定的处理程序方法。通常,类级注释将特定的请求路径(或路径模式)映射到表单控制器上,其他方法级注释缩小了特定HTTP方法请求方法(“GET”,“POST”等)的主映射,或HTTP请求参数条件。@RequestMapping一般都与@Controller配合使用

先看看下面的一个简单的控制器

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping(value="front")public class FrontController {@RequestMapping(value="index")public String index(){System.out.println("index.......");return "index";}@RequestMapping(value="welcom")public String welcom(){System.out.println("welcom..........");return "welcom";}}

上面的控制器有三处@RequestMapping,他们的value分别为front,index,welcom

首先看看value=front的@RequestMapping标签,其作用在类名上面,表明访问此控制的父级路径为front,相对而言访问其他的@RequestMapping是访问对应方法的路径

比如访问index()方法的路径为:/front/index

2、使用@RequestMapping处理POST、GET、PUT请求;

示例一、每一个请求都设置相应的请求方式

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;@Controller@RequestMapping(value="front")public class FrontController {@RequestMapping(value="get",method=RequestMethod.GET)public String get(){System.out.println("index.......");return "index";}@RequestMapping(value="post",method=RequestMethod.POST)public String post(){System.out.println("welcom..........");return "index";}@RequestMapping(value="put",method=RequestMethod.PUT)public String put(){System.out.println("put............");return "index";}}

示例二、一个请求对应多个请求方式

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;@Controller@RequestMapping(value="front")public class FrontController {@RequestMapping(method=RequestMethod.GET)public String get(){System.out.println("index.......");return "index";}@RequestMapping(method=RequestMethod.POST)public String post(){System.out.println("welcom..........");return "index";}@RequestMapping(method=RequestMethod.PUT)public String put(){System.out.println("put............");return "index";}}
或者这样

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;@Controller@RequestMapping(value="front")public class FrontController {@RequestMapping(value="index",method=RequestMethod.GET)public String get(){System.out.println("get.......");return "index";}@RequestMapping(value="index",method=RequestMethod.POST)public String post(){System.out.println("post..........");return "index";}}

3、同一个方法映射多个请求

示例一、@RequestMapping中value参数可以是一个固定的String类型数组

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping(value="front")public class FrontController {@RequestMapping(value={"/","post","get","put"})public String index(){System.out.println("Hello Word!");return "index";}}

4、带有@RequestParam的@RequestMapping

@RequestParam 注解配合 @RequestMapping 一起使用,可以将请求的参数同处理方法的参数绑定在一起。
@RequestParam 注解使用的时候可以有一个值,也可以没有值。这个值指定了需要被映射到处理方法参数的请求参数, 

示例一、

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;@Controller@RequestMapping(value="front")public class FrontController {@RequestMapping(value="index")public String index(@RequestParam(value="str") String message){System.out.println("str:"+message);return "index";}}

如果@RequestParam的value值与参数名称一致可以省略不写,如上面示例的代码只接受的请求中带有str参数的请求

如果想要不带参数的也访问那么就得使用参数required

示例二、

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;@Controller@RequestMapping(value="front")public class FrontController {@RequestMapping(value="index")public String index(@RequestParam(value="str",required=false) String message){System.out.println("str:"+message);return "index";}}
如果没带参数str或者参数str为空让其有默认值怎么办,使用@RequestParam的defaultValue属性给其加上默认值

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;@Controller@RequestMapping(value="front")public class FrontController {@RequestMapping(value="index")public String index(@RequestParam(value="str",required=false,defaultValue="Hi!") String message){System.out.println("str:"+message);return "index";}}

5、@RequestMapping元素之produces和consumes(很少用)

可以使用 @RequestMapping 注解的 produces 和 consumes 这两个元素来缩小请求映射类型的范围

为了能用请求的媒体类型来产生对象, 你要用到 @RequestMapping 的 produces 元素再结合着 @ResponseBody 注解。

你也可以利用 @RequestMapping 的 comsumes 元素再结合着 @RequestBody 注解用请求的媒体类型来消费对象。

示例一、

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping(value="frontIndex")public class FrontIndexController {@RequestMapping(value="index",produces={"application/JSON"})public String index(){return "index";}@RequestMapping(value="welcom",consumes={"application/JSON","application/XML"})public String welcom(){return "index";}}
在这段代码中, getProduces() 处理方法会产生一个 JSON 响应, getConsumes() 处理方法可以同时处理请求中的 JSON 和 XML 内容。

6、带有消息头(header)的@RequestMapping请求

用@ReauestMapping只接收带有某种或某些header的请求,参数headers是一个String类型的数组

示例:

@RequestMapping(value="welcom",headers={"content-type=text/plain"})public String welcom(){System.out.println("welcom...............");return "index";}

7、@RequestMapping映射动态请求

什么是动态请求:举个例子,一个WEB网站保存用户的图片的路径是:img/id/upload,其中id是用户的唯一标识,那么就会产生以下数据:img/10001/upload、img/10002/upload、img/10003/upload...怎样用请求来映射这个路径、将id作为参数传过来组合使用的请路过。。

使用@RequestMapping可以动态的接收请求

示例一、

@RequestMapping(value="img/{id}/upload")public String go(){System.out.println("Hello Word!");return "index";}
使用上面方法可能还不能满足我们开发需求,比如:我们要知道是谁访问了这个路径该怎么办,那么我就必须要获取这个id的值了,springmvc给我们提供了@PathVariable注解

示例二、

@RequestMapping(value="img/{id}/upload")public String go(@PathVariable String id){System.out.println("id="+id);return "index";}

使用上面两个例子可能还不能解决我们的开发需求,比如:有一些VIP用户的id是UUID,普通用户是纯数字id,这个请求只能处理vip用户的该怎么,@RequestMapping注解

可以和正则表达式一起使用

示例三、

@RequestMapping(value="img/{id:[0-9a-z]{32}}/upload")public String go(@PathVariable String id){System.out.println("id="+id);return "index";}

UUID生成的方法:

/** * 封装JDK自带的UUID, 通过Random数字生成, 中间无-分割. */public static String uuid() {return UUID.randomUUID().toString().replaceAll("-", "");}

8、@RequestMapping默认处理方法

示例一、

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping(value="img")public class ImgController {/** * 默认处理方法 * */@RequestMapping()public String index(){System.out.println("默认处理方法");return "index";}/** * 进入用户首页 **/@RequestMapping(value = "userIndex")public String userIndex(){System.out.println("进入用户首页");return "index";}}

9、@RequestMapping与@ResponseBody搭配使用

使用@RequestMapping注解方法时,返回String类型,视图解析器(后面学习)会帮你找到相应的页面,但是有时候不需要返回到页面,只是返回String类型的数据到页面。如:用户在

修改密码的时候,提示其与原密码不符合;这个时候就需要@ResponseBody帮助我们,不让视图解析器解析这个String类型;

示例一、

@ResponseBody@RequestMapping(value="welcom")public String welcom(){System.out.println("welcom...............");return "[{flag:'success',message:'原密码不匹配'}]";}
Ajax提交数据一般都会与@ResponseBody一起使用,大多数返回类型都是json字符串,或者是对象

示例二、

@ResponseBody@RequestMapping(value="welcom")public JsonResult welcom(){JsonResult jr = new JsonResult();jr.setFlag("success");jr.setMessage("原密码不符合");return jr;}

JsonResult

package com.spring.mvc;public class JsonResult {private String flag;private String message;private Object data;public String getFlag() {return flag;}public void setFlag(String flag) {this.flag = flag;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}}

10、spring4.3以上的@RequestMaping的快捷方式

Spring 4.3 引入了方法级注解的变体,也被叫做 @RequestMapping 的组合注解。组合注解可以更好的表达被注解方法的语义。它们所扮演的角色就是针对 @RequestMapping 的封装,而且成了定义端点的标准方法。

例如,@GetMapping 是一个组合注解,它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。
方法级别的注解变体有如下几个:

  • @GetMapping

  • @PostMapping

  • @PutMapping

  • @DeleteMapping

  • @PatchMapping

如下代码展示了如何使用组合注解:

package com.spring.mvc;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.PutMapping;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping(value="index")public class IndexController {@PostMapping(value="index")public String post(){System.out.println("post");return "index";}@GetMapping(value="index")public String get(){System.out.println("get");return "index";}@PutMapping(value="index")public String put(){System.out.println("put");return "index";}}


总结(重要):此篇文章是我结合spring的官方API文档和开源中国微信公众号发布的一篇文章整理出来的,如有不对请指出。

微信文章地址:https://mp.weixin.qq.com/s/uZzwmJb5ewukkawi0UIzYw



















原创粉丝点击