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