您的位置:首页 > 移动开发

Spring MVC系列(二)之@RequestMapping和URL映射

2016-03-31 09:40 866 查看
@RequestMapping是一个用来处理请求地址映射的注解,可以注解与类上,也可以注解与类中的方法上,注解与类上,表示该Controller的统一标识,通常表示一个模块的表示,注解在方法,则表示某请求又那个方法进行处理

@RequestMapping有几个属性

一:value属性

value表示URI的路径标识,例如



对应的路径就是IP:端口号/项目名/mapping/test,对应我们上节中的例子就是localhost:8080/mapping/test,这样的url就会映射到我们test的方法的处理

1)注意,这样的映射路径要唯一,例如如下

package org.study.lyncc.web.controller;

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

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {

@RequestMapping(value="/test")
public ModelAndView test(){
return new ModelAndView("test");
}

@RequestMapping(value="/test")
public ModelAndView test1(){
return new ModelAndView("test1");
}

}
如果是这样的代码,方法test和test1的映射路径的URI都是/mapping/test,spring mvc启动的时候就会报错



意思是/mapping/test已经被方法test映射到处理,但你的test1的URI依旧是/mapping/test,所以报错,其实很好理解,如果两个方法对应同一个URL那么真实请求过来后,到底是由谁去处理?

2)关于value的值可以有如下几种类型

   ①某一普通的具体值,例如/test

   ②某一统一变量,通常用{}符号标识,例如/{id}

   ③正则表达式,通常用{}符号标识,例如{method:\\w+}

   ④以上几种类型的集合

①的例子就不举例了,我们举个②的例子

package org.study.lyncc.web.controller;

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

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {

@RequestMapping(value="/{id}")
public ModelAndView test1(){
ModelAndView mav = new ModelAndView("test");
return mav;
}

}
当我们的URL如下都可以映射到

localhost:8080/spring-mvc/mapping/1

localhost:8080/spring-mvc/mapping/2

localhost:8080/spring-mvc/mapping/234

localhost:8080/spring-mvc/mapping/12dsfsa2

都能准确的被test1方法映射到,并处理

③正则表达的例子

package org.study.lyncc.web.controller;

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

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {

@RequestMapping(value="/{:\\d}")
public ModelAndView reg(){
ModelAndView mav = new ModelAndView("test");
return mav;
}

}
与之对应我们在WEB-INF/jsp文件夹下新建test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello</title>
</head>
<body>
  test requestMapping
</body>
</html>
当我们在浏览器中输入如下URL:
http://localhost:8080/spring-mvc/mapping/1 http://localhost:8080/spring-mvc/mapping/2 http://localhost:8080/spring-mvc/mapping/3 http://localhost:8080/spring-mvc/mapping/4
都能正确跳转到



但是如果你的URL是
http://localhost:8080/spring-mvc/mapping/d http://localhost:8080/spring-mvc/mapping/44
正则表达“\d”是匹配一个数字字符。等价于[0-9]。“d”,“44”则会无法匹配正则,所以该方法不进行该url的处理



④综合的例子

package org.study.lyncc.web.controller;

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

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {

@RequestMapping(value="/{:\\d}/user/{id}/detail")
public ModelAndView comprehensiveDemo(){
ModelAndView mav = new ModelAndView("test");
return mav;
}

}
那么URL可以输入:
http://localhost:8080/spring-mvc/mapping/4/user/abc/detail
这样依旧可以映射到



二:method属性

method的值是用来处理用户请求的属性的,是Get请求,还是post请求,还是PUT请求,等等,spring MVC都可以进行精细的管理,由于Mehtod的值是固定的,所以spring mvc用枚举进行管理

package org.springframework.web.bind.annotation;

public enum RequestMethod {

GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE

}


我们举个例子证明一下:

package org.study.lyncc.web.controller;

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

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {

@RequestMapping(value = "/detail",method = RequestMethod.GET)
public ModelAndView methodTestDemo(){
ModelAndView mav = new ModelAndView("test");
return mav;
}

}
浏览器url是http://localhost:8080/spring-mvc/mapping/detail,因为浏览器默认是GET请求



我们修改代码,将请求改成post

package org.study.lyncc.web.controller;

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

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {

@RequestMapping(value = "/detail",method = RequestMethod.POST)
public ModelAndView methodTestDemo(){
ModelAndView mav = new ModelAndView("test");
return mav;
}

}
,我们再次同一url请求



提示不支持GET请求

三:headers

headers指定request中必须包含某些指定的header值,才能让该方法处理请求,我们平时一般用不到该属性,我们还是做一个例子吧

package org.study.lyncc.web.controller;

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

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {

@RequestMapping(value = "/detail",headers="location=www.tuniu.com")
public ModelAndView HeadersDemo(){
ModelAndView mav = new ModelAndView("test");
return mav;
}

}
这边我们指定请求中headers需要有key/Value的键值对,key是location,value是www.tuniu.com

我们用普通的浏览器访问



说明spring不进行处理,我们选用一个第三方工具测试一下RESTClient



当我们加入请求headers时,发现能正常返回提示200,且能返回Body

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

我们还是举例说明吧

package org.study.lyncc.web.controller;

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

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {

@RequestMapping(value = "/detail",consumes="application/json")
public ModelAndView HeadersDemo(){
ModelAndView mav = new ModelAndView("test");
return mav;
}

}
表示我们请求体Content-Type:"application\json;charset=utf-8"才会响应,如果我们浏览器直接访问



报错了,415错误,415错误是指 对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝

好了,我们用工具去访问



请求成功

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

举例说明:

package org.study.lyncc.web.controller;

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

@Controller
@RequestMapping(value="/mapping")
public class RequestMappingController {

@RequestMapping(value = "/detail",produces="application/json")
public Object HeadersDemo(){
......
}

}
这样一般返回application\json的格式数据,这个以后会再做分析

好了,到此为止,关于@RequestMapping一些常用的URL映射关系已经讲解结束了~END~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RequestMapping