@RequestMapping 6个基本用法
- 格式:doc
- 大小:43.50 KB
- 文档页数:3
RequestMapping原理分析和RequestMappingHandlerMapping源码版本spring-webmvc-4.3.7.RELEASE使⽤Spring MVC的同学⼀般都会以下⽅式定义请求地址:@Controller@RequestMapping("/test")public class TestController {@RequestMapping(value = {"/show"})public String testTest() {return "/jsp/index";}}@Controller注解⽤来把⼀个类定义为Controller。
@RequestMapping注解⽤来把web请求映射到相应的处理函数。
@Controller和@RequestMapping结合起来完成了Spring MVC请求的派发流程。
为什么两个简单的注解就能完成这么复杂的功能呢?⼜和<context:component-scan base-package="xx.xx.xx"/>的位置有什么关系呢?@RequestMapping流程分析@RequestMapping流程可以分为下⾯6步:1.注册RequestMappingHandlerMapping bean 。
2.实例化RequestMappingHandlerMapping bean。
3.获取RequestMappingHandlerMapping bean实例。
4.接收requst请求。
5.在RequestMappingHandlerMapping实例中查找对应的handler。
6.handler处理请求。
为什么是这6步,我们展开分析。
1 注册RequestMappingHandlerMapping bean第⼀步还是先找程序⼊⼝。
使⽤Spring MVC的同学都知道,要想使@RequestMapping注解⽣效,必须得在xml配置⽂件中配置< mvc:annotation-driven/>。
详解获取SpringMVC中所有RequestMapping以及对应⽅法和参数在Spring MVC中想要对每⼀个URL进⾏权限控制,不想⼿⼯整理这样会有遗漏,所以就动⼿写程序了。
代码如下:/*** @return* @author Elwin ZHANG* 创建时间:2017年3⽉8⽇上午11:48:22* 功能:返回系统中的所有控制器映射路径,以及对应的⽅法*/@RequestMapping(value = "/maps", produces = "application/json; charset=utf-8")@ResponseBodypublic Object getMapPaths(){String result="";RequestMappingHandlerMapping rmhp = springHelper.getObject(RequestMappingHandlerMapping.class);Map<RequestMappingInfo, HandlerMethod> map = rmhp.getHandlerMethods();for(RequestMappingInfo info : map.keySet()){result +=info.getPatternsCondition().toString().replace("[", "").replace("]", "")+ "\t" ;HandlerMethod hm=map.get(info);result +=hm.getBeanType().getName()+ "\t" ;result +=getMethodParams(hm.getBeanType().getName(),hm.getMethod().getName())+ "\t";result +=info.getProducesCondition().toString().replace("[", "").replace("]", "")+ "\t" ;result += "\r\n";}return result;}getMethodParams是专门⽤于获取⽅法中参数名称的函数,因为⽤Java⾃⾝的反射功能是获取不到的,浪费我不少时间,后来⽹上看到JBOSS的JAVAssist类可以。
SpringMVC-GetMapping-RequestMapping注解总结SpringMVC-GetMapping注解总结@GetMapping是⼀个组合注解,是@RequestMapping(method= RequestMethod.GET)的缩写。
该注解将HTTP Get 映射到特定的处理⽅法上。
所以此处个⼈的理解,@GetMapping可以算是@RequestMapping的⼦集,可能该说法不是很严谨,但是我个⼈暂时是这么理解的。
Spirng与Web集成 1.1 ApplicationContext应⽤上下⽂获取⽅式# 应⽤上下⽂对象是通过new ClasspathXmlApplicationContext(spring配置⽂件) ⽅式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置⽂件) ,这样的弊端是配置⽂件加载多次,应⽤上下⽂对象创建多次。
在Web项⽬中,可以使⽤ServletContextListener监听Web应⽤的启动,我们可以在Web应⽤启动时,就加载Spring的配置⽂件,创建应⽤上下⽂对象ApplicationContext,在将其存储到最⼤的域servletContext域中,这样就可以在任意位置从域中获得应⽤上下⽂ApplicationContext对象了。
1.2 Spring提供获取应⽤上下⽂的⼯具# 上⾯的分析不⽤⼿动实现,Spring提供了⼀个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置⽂件,创建应⽤上下⽂对象,并存储到ServletContext域中,提供了⼀个客户端⼯具WebApplicationContextUtils供使⽤者获得应⽤上下⽂对象。
所以我们需要做的只有两件事:在web.xml中配置ContextLoaderListener监听器(导⼊spring-web坐标)使⽤WebApplicationContextUtils获得应⽤上下⽂对象ApplicationContext1. 哪⼀些情况下,浏览器会发送get请求a. 直接在浏览器地址栏输⼊某个地址b. 点击链接c. 表单默认的提交⽅式2.特点:a. 请求参数会添加到请求资源路劲的后⾯,只能添加少量参数b. 请求参数会显⽰在浏览器地址栏,路由器会记录请求地址5:@PostMapping1. 哪⼀些情况下,浏览器会发送post请求a. 设置表单method = "post"2.特点:a. 请求参数添加到实体内容⾥⾯,可以添加⼤量的参数(也解释了为什么不能发送post请求,在地址栏⾥我们只能填写URL,并不能进⼊到Http包的实体当中)b. 相对安全,但是,post请求不会对请求参数进⾏加密处理(可以使⽤https协议来保证数据安全)。
Spring---@RequestMapping注解和它的属性RequestMapping注解@RequestMapping注解能将请求和处理请求的控制器⽅法关联起来,建⽴映射关系。
在SpringMvc接收到请求后就会来找对应的ReuestMapping注解对⽐,并处理请求。
注意:在使⽤时要确保RequesstMapping注解⾥⾯的值唯⼀。
RequestMapping注解加载在类和⽅法上的不同注解加载类上时,设置的映射路径请求的初始信息注解加在⽅法上时,设置的映射路径请求的具体信息就是说你如果想访问在⽅法⾥的具体信息,就先要具备类上⾯的初始信息在下⾯,如果想访问index,这时访问的路径应该是 /user/ ⽽不再是 / ,访问login就访问的路径就应该为 /user/login。
这样的结构可以⽤在划分权限上⾯,在类上⾯进⾏划分@Controller@RequestMapping("/user")public class HelloMvc {// 将请求和⽅法创建映射关系通过 value 属性设置当浏览器请求某⼀地址【value】时,由下⾯这个⽅法处理请求,并指向访问资源或别的@RequestMapping("/")public String helloIndex(){// 返回视图名称return "index";}@RequestMapping("/target")public String getTarget(){return "target";}@RequestMapping("/login")public String goToLogin(){return "login";}}属性设置的越多匹配的越精确但是不要出现为了精致为了精确⽽精确,要优雅RequestMapping注解的valuevalue属性的值是⼀个String数组,他能设置多个值,使得多个请求地址指向同⼀个资源如果出错,会报 404找不到资源@RequestMapping(value = {"/login","/testlogin"})public String goToLogin(){return "login";}RequestMapping注解的Method参数在@RequestMapping中设置调⽤属性设置参数时,属性之间要⽤ , 隔开method在不进⾏设置时,使⽤什么请求都能进⾏匹配执⾏。
requestparam用法RequestParam是Spring框架中的一个注解,用于从HTTP请求中获取参数的值,用法非常简单,只需要在Controller的方法参数上加上@RequestParam注解,就可以获取到对应的参数值。
1.在Controller的方法参数上加上@RequestParam注解2.指定@RequestParam的value属性,即指定参数的名称下面我们来看一个简单的例子:@RestControllerpublic class ExampleController {@GetMapping("/hello")public String hello(@RequestParam(value = "name") String name,@RequestParam(value = "age", defaultValue = "20") int age) {return "Hello, " + name + ", your age is " + age;}}在@RequestParam注解中,我们指定了参数的名称,name和age分别对应了请求中的name和age参数。
使用defaultValue属性,我们为age参数设置了默认值,当请求中没有传递age参数时,使用默认值20。
@RequestMapping还有其他一些属性,下面我们来逐一介绍。
1.required属性如果我们希望请求中必须传递某个参数,就可以使用@RequestParam注解中的required属性,将其设置为true。
如果请求中没有传递该参数,Spring框架会抛出MissingServletRequestParameterException异常。
2.defaultValue属性如果我们希望为某个参数设置默认值,在@RequestParam注解中,可以使用defaultValue属性。
restful风格-@RequestParam和@PathVariable的⽤法与区别SpringBoot——@PathVariableURL变量定义URL变量规则可以在@RequestMapping注解中⽤{ }来表明它的变量部分,例如:@RequestMapping(value="/user/{username}")这⾥的{username}就是我们定义的变量规则,username是变量的名字,那么这个URL路由可以匹配下列任意URL并进⾏处理:/user/Tom/user/Jerry/user/Jack2需要注意的是,在默认情况下,变量中不可以包含URL的分隔符/,例如路由不能匹配/user/Denny/Jon,即使你认为Denny/Jon是⼀个存在的⽤户名。
获取URL变量在路由中定义变量规则后,通常我们需要在处理⽅法(也就是@RequestMapping注解的⽅法)中获取这个URL的具体值,并根据这个值(例如⽤户名)做相应的操作,SpringMVC提供的@PathVariable可以帮助我们:@RequestMapping(value="/user/{username}")public String userProfile(@PathVariable(value="username") String username) {return "user"+username;}在上⾯的例⼦中,当@Controller处理HTTP请求时,userProfile的参数username会⾃动设置为URL中对应变量username(同名赋值)的值。
例如,当HTTP请求为/user/fpc,URL变量username的值fpc就会被赋值给函数参数username,函数的返回值是userfpc。
在默认情况下,Spring会对@PathVariable注解的变量进⾏⾃动赋值,也可以指定@PathVariable使⽤哪⼀个URL中的变量:@RequestMapping(value = "user/{username}")public String userProfile(@PathVariable(value="username") String username) {return "user"+username;}运⾏结果:定义多个URL变量可以定义URL路由,其中包含多个URL变量:@RequestMapping(value = "/user/{username}/blog/{blogId}")public String getUserBlog(@PathVariable String username, @PathVariable int blogId) {return "user:" + username + "blog->" + blogId;}这种情况下,Spring能够根据名字⾃动赋值对应的函数参数值,当然也可以在@PathVariable中显⽰地表明具体的URL变量值。
requestparam注解用法在Java的Spring框架中,`@RequestParam`是用于从请求中获取参数的注解。
它主要用于处理HTTP请求中的查询参数,表单数据等。
以下是`@RequestParam`的用法示例:```java@RestController@RequestMapping("/example")public class ExampleController {// 使用@RequestParam获取请求参数@GetMapping("/greet")public String greet(@RequestParam(name = "name", defaultValue = "Guest") String name) { return "Hello, " + name + "!";}// 多个请求参数@GetMapping("/add")public int add(@RequestParam int num1, @RequestParam int num2) {return num1 + num2;}// 使用required属性指定参数是否为必需,默认为true@GetMapping("/multiply")public int multiply(@RequestParam(required = false, defaultValue = "1") int num1,@RequestParam(required = false, defaultValue = "1") int num2) { return num1 * num2;}// 使用Map<String, String>接收所有请求参数@GetMapping("/params")public String getAllParams(@RequestParam Map<String, String> params) {return params.toString();}}```在上述示例中:- `@RequestParam(name = "name", defaultValue = "Guest") String name`:指定参数名为"name",如果请求中没有"name"参数,则使用默认值"Guest"。
@RequestMapping注解的六个属性以及作用
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性,下面分成三类进行说明。
value, method
value:指定请求的实际地址,指定的地址可以是具体地址、可以RestFul动态获取、也可以使用正则设置;
method:指定请求的method类型,分为GET、POST、PUT、DELETE等;
consumes,produces
consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params,headers
params:指定request中必须包含某些参数值是,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
Springcloud学习笔记09-常⽤注解01@PostMapping、@GetMapp。
.springframework.web.bind.annotation包下注解1.1 @PostMapping、@GetMapping、@RequestMapping、@RestController、@ResponseBody、@RequestParam、@RequestPart、@PutMapping(1)@RequestMapping@RequestMapping如果没有指定请求⽅式,将接收Get、Post、Head、Options等所有的请求⽅式.(2)@GetMapping@GetMapping是⼀个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
该注解将HTTP Get 映射到特定的处理⽅法上。
get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段⼀⼀对应,在URL中可以看到。
get是从服务器上获取数据。
若符合下列任⼀情况,则⽤GET⽅法:* 请求是为了查找资源,HTML表单数据仅⽤来帮助搜索。
* 请求结果⽆持续性的副作⽤。
* 收集的数据及HTML表单内的输⼊字段名称的总长不超过1024个字符。
(3)@PostMapping@PostMapping是⼀个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
get⽅式的安全性较Post⽅式要差些,包含机密信息的话,建议⽤Post数据提交⽅式;post是向服务器传送数据。
若符合下列任⼀情况,则⽤POST⽅法:* 请求的结果有持续性的副作⽤,例如,数据库内添加新的数据⾏。
* 若使⽤GET⽅法,则表单上收集的数据可能让URL过长。
* 要传送的数据不是采⽤7位的ASCII编码。
(4)@requestBody(后端⽅法接收请求体)@requestBody注解常⽤来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,⽐如说:application/json或者是application/xml等。
Java Spring MVC 学习笔记:@RequestMapping用法详解摘要: 主要介绍有关注解@RequestMapping的用法及用的过程中可能出现的问题一、@RequestMapping 简介在Spring MVC 中使用@RequestMapping来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置<servlet><servlet-name>servletName</servlet-name><servlet-class>ServletClass</servlet-class></servlet><servlet-mapping><servlet-name>servletName</servlet-name><url-pattern>url</url-pattern></servlet-mapping>的映射作用一致。
让我们先看一下RequestMapping注解类的源码:@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Mappingpublic @interface RequestMapping {String name() default "";String[] value() default {};String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};String[] consumes() default {};String[] produces() default {};}1)在@Target中有两个属性,分别为ElementType.METHOD 和ElementType.TYPE ,也就是说@RequestMapping可以在方法和类的声明中使用2)可以看到注解中的属性除了name() 返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如value() 和path() 都可以同时定义多个字符串值来接收多个URL请求二、准备工作:(注:后面的示例都将基于准备工作)1)新建一个Web 工程,取名为SpringMVC略2)新建一个的控制器类:UserControllerpackage cn.kolbe.spring.mvc.controller;import org.springframework.stereotype.Controller;@Controllerpublic class UserController {public String login() {return"success";}}3)新建和配置web.xml 以及spring-mvc.xml 文件略(具体参见前一章:Spring MVC 学习笔记(一):HelloWorld)4)新建一个测试的JSP 页面index.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncodin g="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Spring MVC</title></head><body><p><a href="#">User Login</a></body></html>5)新建一个成功跳转的页面JSP 页面welcome.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncodin g="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Spring MVC</title></head><body><h1>Welcome</h1></body></html>三、测试@RequestMapping中的value 和path 属性(这两个属性作用相同,可以互换,如果仅有这一个属性,则可以省略,下面两个例子均采用省略的方式)1)将@RequestMapping注解在login 方法上,而UserController上不添加@RequestMapping注解,这时的请求URL 是相对于Web 根目录@Controllerpublic class UserController {@RequestMapping("/login")public String login() {return"success";}}这时的方法login() 能处理的URL 请求路径是基于Web 应用的,也就是http://localhost/SpringMVC/login,也就是 index.jsp页面中的User Login 链接地址应该是:<a href="login">User Login</a>2)将@RequestMapping注解在UserController类上,这时类的注解是相对于Web 根目录,而方法上的是相对于类上的路径@Controller@RequestMapping("/user")public class UserController {@RequestMapping("/login")public String login() {return "success";}}这时的方法login()能处理的URL 请求路径则是http://localhost/SpringMVC/user/login,也就是index.jsp页面中的User Login 链接地址应该是:<a href="user/login">User Login</a>四、测试@RequestMapping的method 属性1)简介:@RequestMapping中的method 主要用来定义接收浏览器发来的何种请求。