SpringMVC——RequestMapping

实践是知识的母亲,知识是生活的明灯。这篇文章主要讲述SpringMVC——RequestMapping相关的知识,希望能为你提供帮助。
一、@RequestMapping 映射请求  Spring MVC  通过@RequestMapping注解可以定义不同的处理器映射规则。

  • @RequestMapping放在类名上边,设置请求前缀
  • 方法名上边设置请求映射url
二、映射请求参数、请求方法或请求头@RequestMapping 除了可以使用请求 URL 映射请求外, 还可以使用请求方法、请求参数及请求头映射请求
1、@RequestMapping 的 value、method、params 及 heads 分别表示请求 URL、请求方法、请求参数及请求头的映射条件,他们之间是与的关系,联合使用多个条件可让请求映射 更加精确化。
/** * 常用: 使用 method 属性来指定请求方式 */ @RequestMapping(value = "https://www.songbingjia.com/testMethod", method = RequestMethod.POST) public String testMethod() { System.out.println("testMethod"); return SUCCESS; }

2、params 和 headers支持简单的表达式:
  • param1: 表示请求必须包含名为 param1 的请求参数
  • !param1: 表示请求不能包含名为 param1 的请求参数
  • param1 != value1: 表示请求包含名为 param1 的请求参数,但其值 不能为 value1
  • {“ param1=value1” , “ param2” }: 请求必须包含名为 param1 和param2 的两个请求参数,且 param1 参数的值必须为 value1
/** * 可以使用 params 和 headers 来更加精确的映射请求.
* 请求中必须包含username请求参数,age请求参数的值不能等于10
*/ @RequestMapping(value = "https://www.songbingjia.com/android/testParamsAndHeaders", params = { "username", "age!=10" }, headers = { "Accept-Language=en-US,zh; q=0.8" }) public String testParamsAndHeaders() { System.out.println("testParamsAndHeaders"); return SUCCESS; }

三、@PathVariable 映射 URL 绑定的占位符 
  • 带占位符的 URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义
  • 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过 @PathVariable("xxx") 绑定到操作方法的入参中。
/** * @PathVariable 可以来映射 URL 中的占位符到目标方法的参数中. * @param id * @return */ @RequestMapping("/testPathVariable/{id}") public String testPathVariable(@PathVariable("id") Integer id) { System.out.println(id); return SUCCESS; }

四、HiddenHttpMethodFilter:浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支 持,Spring3.0 添加了一个过滤器,可以将这些请求转换 为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。
如何发送 PUT 请求和 DELETE 请求呢 ?
1. 需要配置 HiddenHttpMethodFilter
< !-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter: 可以把 POST 请求转为 DELETE 或 POST 请求 --> < filter> < filter-name> HiddenHttpMethodFilter< /filter-name> < filter-class> org.springframework.web.filter.HiddenHttpMethodFilter< /filter-class> < /filter> < filter-mapping> < filter-name> HiddenHttpMethodFilter< /filter-name> < url-pattern> /*< /url-pattern> < /filter-mapping>

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //package org.springframework.web.filter; import java.io.IOException; import java.util.Locale; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; public class HiddenHttpMethodFilter extends OncePerRequestFilter { public static final String DEFAULT_METHOD_PARAM = "_method"; private String methodParam = "_method"; public HiddenHttpMethodFilter() { }public void setMethodParam(String methodParam) { Assert.hasText(methodParam, "\‘methodParam\‘ must not be empty"); this.methodParam = methodParam; }protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String paramValue = https://www.songbingjia.com/android/request.getParameter(this.methodParam); if("POST".equals(request.getMethod()) & & StringUtils.hasLength(paramValue)) { String method = paramValue.toUpperCase(Locale.ENGLISH); HiddenHttpMethodFilter.HttpMethodRequestWrapper wrapper = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method); filterChain.doFilter(wrapper, response); } else { filterChain.doFilter(request, response); }}private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper { private final String method; public HttpMethodRequestWrapper(HttpServletRequest request, String method) { super(request); this.method = method; }public String getMethod() { return this.method; } } }

2.需要在发送 POST 请求时携带一个 name="_method" 的隐藏域, 值为 DELETE 或 PUT
< form action="springmvc/testRest/1" method="post"> < input type="hidden" name="_method" value="https://www.songbingjia.com/android/PUT"/> < input type="submit" value="https://www.songbingjia.com/android/TestRest PUT"/> < /form> < form action="springmvc/testRest/1" method="post"> < input type="hidden" name="_method" value="https://www.songbingjia.com/android/DELETE"/> < input type="submit" value="https://www.songbingjia.com/android/TestRest DELETE"/> < /form> < form action="springmvc/testRest" method="post"> < input type="submit" value="https://www.songbingjia.com/android/TestRest POST"/> < /form> < a href="https://www.songbingjia.com/android/springmvc/testRest/1"> Test Rest Get< /a>

【SpringMVC——RequestMapping】[email  protected]添加method属性
@RequestMapping(value = "https://www.songbingjia.com/testRest/{id}", method = RequestMethod.PUT) public String testRestPut(@PathVariable Integer id) { System.out.println("testRest Put: " + id); return SUCCESS; }@RequestMapping(value = "https://www.songbingjia.com/testRest/{id}", method = RequestMethod.DELETE) public String testRestDelete(@PathVariable Integer id) { System.out.println("testRest Delete: " + id); return SUCCESS; }@RequestMapping(value = "https://www.songbingjia.com/testRest", method = RequestMethod.POST) public String testRest() { System.out.println("testRest POST"); return SUCCESS; }@RequestMapping(value = "https://www.songbingjia.com/testRest/{id}", method = RequestMethod.GET) public String testRest(@PathVariable Integer id) { System.out.println("testRest GET: " + id); return SUCCESS; }


    推荐阅读