zoukankan      html  css  js  c++  java
  • SpringMVC注解汇总(二)-请求映射规则

    接上一节SpringMVC注解汇总-定义 讲到Httpy请求信息

    URL路径映射

    1)普通URL路径映射

    @RequestMapping(value={"/test1", "/user/create"}):
    多个URL路径可以映射到同一个处理器的功能处理方法。

    2)URI模板模式映射
    @RequestMapping(value="/users/{userId}"):

    {×××}占位符, 请求的URL可以是 “/users/123456” 
      或

    “/users/abcd”,通过@PathVariable可以提取URI模板模式中的{×××}中的×××变量。

    @RequestMapping(value="/users/{userId}/create"):

    这样也是可以的,请求的URL可以是“/users/123/create”。

    @RequestMapping(value="/users/{userId}/topics/{topicId}"):

    这样也是可以的,请求的URL可以是“/users/123/topics/123”

    3)Ant风格的URL路径映射
    @RequestMapping(value="/users/**"):

    可以匹配“/users/abc/abc”,但“/users/123”将会被【URI模板模式映射中的“/users/{userId}”模式优先映射到】 

    @RequestMapping(value="/product?"):
    可匹配“/product1”或“/producta”,但不匹配“/product”或“/productaa”;

    @RequestMapping(value="/product*"):
    可匹配“/productabc”或“/product”,但不匹配“/productabc/abc”;

    @RequestMapping(value="/product/*"):
    可匹配“/product/abc”,但不匹配“/productabc”;

    @RequestMapping(value="/products/**/{productId}"):
    可匹配“/products/abc/abc/123”或“/products/123”,也就是Ant风格和URI模板变量风格可混用;

    4)正则表达式风格的URL路径映射
    从Spring3.0开始支持正则表达式风格的URL路径映射,格式为{变量名:正则表达式},通过@PathVariable提取模式中的{×××:正则表达式匹配的值}中的×××变量了。

     @RequestMapping(value="/products/{categoryCode:\d+}-{pageNumber:\d+}"):

    可以匹配“/products/123-1”,但不能匹配“/products/abc-1”,这样可以设计更加严格的规则。

    正则表达式风格的URL路径映射是一种特殊的URI模板模式映射:

    URI模板模式映射是{userId},不能指定模板变量的数据类型,如是数字还是字符串;

    正则表达式风格的URL路径映射,可以指定模板变量的数据类型,可以将规则写的相当复杂。

    5)组合使用是“或”的关系
    如 @RequestMapping(value={"/test1", "/user/create"}) 组合使用是或的关系,即“/test1”或“/user/create”请求URL路径都可以映射到@RequestMapping指定的功能处理方法。

    Spring Web MVC不仅仅提供URL路径映射,还提供了其他强大的映射规则。接下来我们看一下请求方法
    映射限定吧。

    请求方法映射限定

    熟悉的表单一般分为两步:第一步展示,第二步提交,如SimpleFormController那样,那如何通过@RequestMapping来实现呢?

    1)请求方法映射限定

    我们熟知的,展示表单一般为GET请求方法;提交表单一般为POST请求方法。但URL路径映射方式对任意请求方法是全盘接受的,因此我们需要某种方式来告诉相应的功能处理方法只处理如GET请求方法的请求或POST请求方法的请求。

    使用@RequestMapping来实现SimpleFormController的功能。

    实例:

    @Controller

    @RequestMapping("/customers/**"//①处理器的通用映射前缀

    public class RequestMethodController {

    //②类级别的@RequestMapping窄化  

    @RequestMapping(value="/create",method=RequestMethod.GET)

    public String showForm() {

    System.out.println("===============GET");

    return "customer/create";

    }

    //③ 类级别的@RequestMapping窄化 

    @RequestMapping(value="/create",method=RequestMethod.POST)

    public String submit(){

    System.out.println("==============POST");

    return "redirect:/success";

    }

    }

    说明:

    处理器的通用映射前缀(父路径):表示该处理器只处理匹配“/customers/**”的请求;

    对类级别的@RequestMapping进行窄化,表示showForm可处理匹配“/customers/**/create”且请求方法为“GET”的请求;

    对类级别的@RequestMapping进行窄化,表示submit可处理匹配“/customers/**/create”且请求方法为“POST”的请求。

    请求如下

    因为返回的customer/create 没有配置create.jsp页面,在服务器会打印日志!

    2)组合使用是“或”的关系

    @RequestMapping(value="/methodOr", method = {RequestMethod.POST, RequestMethod.GET}):

    即请求方法可以是 GET 或 POST。

     提示:

    1、一般浏览器只支持GET、POST请求方法,如想浏览器支持PUT、DELETE等请求方法只能模拟,稍候章节介绍。

    2、除了GET、POST,还有HEAD、OPTIONS、PUT、DELETE、TRACE。

    3、DispatcherServlet默认开启对 GET、POST、PUT、DELETE、HEAD的支持;

    4、如果需要支持OPTIONS、TRACE,请添加DispatcherServlet在web.xml的初始化参数:dispatchOptionsRequest 和 dispatchTraceRequest 为true。

     

    请求方法的详细使用请参考RESTful架构风格一章。

    3)请求参数数据映射限定

    实例:

    @Controller

    @RequestMapping("/parameter1")//①处理器的通用映射前缀 

    public class RequestParametController {

    //②进行类级别的@RequestMapping窄化  

    @RequestMapping(params="create",method=RequestMethod.GET)

    public String showForm() {

    System.out.println("=============showform");

    return "parameter/create";

    }

    //③进行类级别的@RequestMapping窄化 

    @RequestMapping(params="create",method=RequestMethod.POST)

    public String submit() {

    System.out.println("==========submit");

    return "redirect:/success";

    }

    }

    说明:

    @RequestMapping(params="create", method=RequestMethod.GET) :表示请求中有“create”的参数名且请求方法为“GET”即可匹配,如可匹配的请求URL“http://×××/parameter1?create”;

    @RequestMapping(params="create", method=RequestMethod.POST):表示请求中有“create”的参数名且请求方法为“POST”即可匹配;

    请求数据中没有指定参数名

    //请求参数不包含 create参数名  

    @RequestMapping(params="!create", method=RequestMethod.GET)

    //进行类级别的@RequestMapping窄化

    说明

     @RequestMapping(params="!create", method=RequestMethod.GET)表示请求中没有create”参数名且请求方法为“GET”即可匹配,如可匹配的请求URLhttp://×××/parameter1?abc”。

    请求数据中指定参数名=值





  • 相关阅读:
    特效优化
    Jsp
    JRebel 热部署
    mysql
    行为树
    Medium | LeetCode 139. 单词拆分 | 动态规划
    Medium | LeetCode 31. 下一个排列
    Easy | LeetCode 27. 移除元素 | 快慢指针
    Medium | LeetCode 437. 路径总和 III | 树 + 回溯 + 前缀和
    Medium | LeetCode 337. 打家劫舍 III | 树后序遍历 + 动态规划
  • 原文地址:https://www.cnblogs.com/ut2016-progam/p/6208759.html
Copyright © 2011-2022 走看看