@RequestMapping 注解

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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容