@RequestMapping 注解(2)

  • 2020 年 3 月 18 日
  • 筆記

SpringMVC 使用@RequestMapping注解为控制器指定可以处理哪些URL请求,在控制器的类定义及方法定义处都可标注:

  • 类定义处:提供初步的请求映射信息。相当于WEB应用的根目录
@Controller  @RequestMapping("/springmvc")  public class HelloWorld {      @RequestMapping("/helloworld")      public String hello(){          System.out.println("hello world");          return "success";      }  }  // 请求的URL  <a href="springmvc/helloworld">Hello World!</a>
  • 方法处:提供进一步的细分映射信息。相对于类定义处的URL。若类定义处未标注,则方法处标记的URL相当于WEB应用的根目录
@Controller  public class HelloWorld {      @RequestMapping("/helloworld")      public String hello(){          System.out.println("hello world");          return "success";      }  }  // 请求的URL  <a href="helloworld">Hello World!</a>

@RequestMapping的value、method、params及heads分别表示请求URL、请求方法、请求参数及请求头的映射条件,联合使用多个条件可让请求映射更加精确化

params

@RequestMapping(value = "/helloworld01",params = "myParam=myValue") // 请求必须包含名为param1的请求参数,且值为myValue      public String hello01(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld02",params = "myParam") // 请求必须包含名为param1的请求参数      public String hello02(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld03",params = "!myParam!") // 请求不能包含名为param1的请求参数      public String hello03(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld04",params = "myParam!=myValue") // 请求必须包含名为param1的请求参数,但值不能为value1      public String hello04(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld05",params = {"param1=value1","param2"}) // 请求必须包含名为param1和param2的请求参数,且param1参数的值必须为value1      public String hello05(){          System.out.println("hello world");          return "success";      }

在index.jsp中验证params

<a href="springmvc/helloworld02?myParam">test param</a>  <a href="springmvc/helloworld03?myParammmmmm">test !param</a>  <a href="springmvc/helloworld04?myParam=myValueeeeeeee">test param1!=value1</a>  <a href="springmvc/helloworld05?param1=value1&param2=2222">test {"param1 = value1","param2"}</a>

Ant 风格资源地址支持3种匹配符:

    @RequestMapping(value = "/helloworld06/*/abc") //中间的*可以替代任意数量字符      public String hello06(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld07/**/abc") //中间的**可以匹配任意层级,或者/helloworld06/abc      public String hello07(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld08/abc??") //一个?匹配一个字符      public String hello08(){          System.out.println("hello world");          return "success";      }
<a href="springmvc/helloworld06/aaaaaabbb/abc">test ant*</a>  <br><br>  <a href="springmvc/helloworld07/aaaaaabbb/ggggggg/hhhhhhh/abc">test ant**</a>  <br><br>  <a href="springmvc/helloworld07/abc">test ant**hhhh</a>  <br><br>  <a href="springmvc/helloworld08/abc11">test ant??</a>

@PathVariable注解 映射URL绑定的占位符

URL中的{xxx}占位符可以通过@PathVariable("xxx")绑定到操作方法的入参中

@Controller  @RequestMapping("/springmvc")  public class HelloWorld {      @RequestMapping("/helloworld/{id}")      public String hello(@PathVariable("id") Integer id){          System.out.println("hello world" + id);          return "success";      }  }  // 请求的URL  <a href="/springmvc/helloworld/1">qqq</a>

HiddenHttpMethodFilter 过滤器

REST 简介

  • REST:(资源)表现层状态转化。是目前最流行的一种互联网软件架构
  • 资源:网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片等等,每种资源对应一个特定的URI。因此URI即为每一个资源的独一无二的标识符
  • 表现层:把资源具体呈现出来的形式。比如,文本可以用txt格式表现,也可以用HTML格式、XML格式等
  • 状态转化:每发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP协议,是一个无状态协议,即所有的状态都保存在服务器端,因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”,而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。具体说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、DELETE、PUT,它们分别对应四种基本操作:获取资源、新建资源、删除资源、更新资源
/order/1 HTTP GET : 得到 id = 1的order  /order/1 HTTP DELETE : 删除id = 1的order  /order/1 HTTP PUT : 更新id=1的order  /order HTTP POST:新增order

浏览器form表单只支持GET和POST请求,而DELETE、PUT等method并不支持,HiddenHttpMethodFilter可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求

web.xml增加HiddenHttpMethodFilter的配置

// web.xml  <!DOCTYPE web-app PUBLIC   "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"   "http://java.sun.com/dtd/web-app_2_3.dtd" >  <web-app>      <display-name>Archetype Created Web Application</display-name>      <context-param>          <param-name>contextConfigLocation</param-name>          <param-value>/WEB-INF/applicationContext.xml</param-value>      </context-param>      <!-- 配置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>        <listener>          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>      </listener>      <servlet>          <servlet-name>dispatcher</servlet-name>          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>          <load-on-startup>1</load-on-startup>      </servlet>      <servlet-mapping>          <servlet-name>dispatcher</servlet-name>          <url-pattern>/</url-pattern>      </servlet-mapping>  </web-app>
@Controller  @RequestMapping("/springmvc")  public class HelloWorld {       /**       * 如何发送PUT请求和DELETE请求呢?       * 1。 配置HiddenHttpMethodFilter       * 2。发送POST请求,并携带一个name="_method"的隐藏域,值为DELETE 或 PUT       * @param id       * @return       */      @RequestMapping(value = "/helloworld/{id}",method = RequestMethod.GET)      public String testRestGet(@PathVariable Integer id){          System.out.println("GET" + id);          return "success";      }        @RequestMapping(value = "/helloworld",method = RequestMethod.POST)      public String testRestPost(){          System.out.println("POST");          return "success";      }        @RequestMapping(value = "/helloworld/{id}",method = RequestMethod.DELETE)      public String testRestDelete(@PathVariable Integer id){          System.out.println("DELETE" + id);          return "success";      }        @RequestMapping(value = "/helloworld/{id}",method = RequestMethod.PUT)      public String testRestPut(@PathVariable Integer id){          System.out.println("PUT" + id);          return "success";      }  }
<%--GET请求--%>  <a href="/springmvc/helloworld/1">GET</a>    <%--POST请求--%>  <form action="springmvc/helloworld" method="post">      <input type="submit" value="POST">  </form>    <%--DELETE请求--%>  <form action="/springmvc/helloworld/1" method="post">      <input type="hidden" name="_method" value="DELETE">      <input type="submit" value="DELETE">  </form>    <%--PUT请求--%>  <form action="/springmvc/helloworld/1" method="post">      <input type="hidden" name="_method" value="PUT">      <input type="submit" value="PUT">  </form>