Java Spring MVC 学习笔记RequestMapping用法详解.docx

上传人:b****3 文档编号:4865955 上传时间:2022-12-11 格式:DOCX 页数:12 大小:52.89KB
下载 相关 举报
Java Spring MVC 学习笔记RequestMapping用法详解.docx_第1页
第1页 / 共12页
Java Spring MVC 学习笔记RequestMapping用法详解.docx_第2页
第2页 / 共12页
Java Spring MVC 学习笔记RequestMapping用法详解.docx_第3页
第3页 / 共12页
Java Spring MVC 学习笔记RequestMapping用法详解.docx_第4页
第4页 / 共12页
Java Spring MVC 学习笔记RequestMapping用法详解.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

Java Spring MVC 学习笔记RequestMapping用法详解.docx

《Java Spring MVC 学习笔记RequestMapping用法详解.docx》由会员分享,可在线阅读,更多相关《Java Spring MVC 学习笔记RequestMapping用法详解.docx(12页珍藏版)》请在冰豆网上搜索。

Java Spring MVC 学习笔记RequestMapping用法详解.docx

JavaSpringMVC学习笔记RequestMapping用法详解

JavaSpringMVC学习笔记:

@RequestMapping用法详解

摘要:

主要介绍有关注解@RequestMapping的用法及用的过程中可能出现的问题

一、@RequestMapping 简介

在SpringMVC中使用@RequestMapping来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置

    servletName

    ServletClass

    servletName

    url

的映射作用一致。

让我们先看一下RequestMapping注解类的源码:

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Mapping

public @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)新建一个的控制器类:

UserController

package cn.kolbe.spring.mvc.controller;

import org.springframework.stereotype.Controller;

@Controller

public class UserController {

public String login() {

return "success";

}

}

3)新建和配置web.xml以及spring-mvc.xml文件

略(具体参见前一章:

SpringMVC学习笔记

(一):

HelloWorld)

4)新建一个测试的JSP页面index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

DOCTYPE html>

Spring MVC

 User Login

5)新建一个成功跳转的页面JSP页面welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

DOCTYPE html>

Spring MVC

Welcome

三、测试@RequestMapping中的value和path属性(这两个属性作用相同,可以互换,如果仅有这一个属性,则可以省略,下面两个例子均采用省略的方式)

1)将@RequestMapping注解在login方法上,而UserController上不添加@RequestMapping注解,这时的请求URL是相对于Web根目录

@Controller

public class UserController {

@RequestMapping("/login")

public String login() {

return "success";

}

}

这时的方法login()能处理的URL请求路径是基于Web应用的,也就是http:

//localhost/SpringMVC/login,也就是 index.jsp页面中的UserLogin链接地址应该是:

User Login

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页面中的UserLogin链接地址应该是:

User Login

四、测试@RequestMapping的method属性

1)简介:

@RequestMapping中的method主要用来定义接收浏览器发来的何种请求。

在Spring中,使用枚举类

org.springframework.web.bind.annotation.RequestMethod来定义浏览器请求的方式。

Http规范定义了多种请求资源的方式,最基本的有四种,分别为:

GET(查)、POST(增)、PUT(改)、DELETE(删),而URL则用于定位网络上的资源相当于地址的作用,配合四种请求方式,可以实现对URL对应的资源的增删改查操作。

在实际应用中,很多人并没有按照这个规范做,因为使用GET/POST同样可以完成PUT和DELETE操作,甚至GET也可以完成POST操作,因为GET不需要用到表单,而POST却需要通过表单来发送。

2)通过@RequestMapping(value="/login",method=RequestMethod.GET)来指定login()方法 仅处理通过GET方式发来的请求

@Controller

@RequestMapping(path = "/user")

public class UserController {

@RequestMapping(path = "/login", method=RequestMethod.GET)

public String login() {

return "success";

}

}

这时,如果浏览器发来的请求不是GET的话,将收到浏览器返回的错误提示,也就是得通过链接的方式而不是表单的方式:

User Login

3)通过@RequestMapping(value="/login",method=RequestMethod.POST)来指定login()方法仅处理通过POST方式发来的请求

@Controller

@RequestMapping(path = "/user")

public class UserController {

@RequestMapping(path = "/login", method=RequestMethod.POST)

public String login() {

return "success";

}

}

这时,必须通过表单的方式发送请求,否则将收到浏览器返回的错误提示

    

4)由于在RequestMapping注解类中method()方法返回的是RequestMethod数组,所以可以给method同时指定多个请求方式,例如:

@Controller

@RequestMapping(path = "/user")

public class UserController {

        // 该方法将同时接收通过GET和POST方式发来的请求

@RequestMapping(path = "/login", method={RequestMethod.POST,RequestMethod.GET})

public String login() {

return "success";

}

}

五、测试@RequestMapping的params属性,该属性表示请求参数,也就是追加在URL上的键值对,多个请求参数以&隔开,例如:

http:

//localhost/SpringMVC/user/login?

username=kolbe&password=123456

则这个请求的参数为username=kolbe以及password=123456,@RequestMapping中可以使用params来限制请求参数,来实现进一步的过滤请求,举个例子:

@Controller

@RequestMapping(path = "/user")

public class UserController {

        

        // 该方法将接收 /user/login 发来的请求,且请求参数必须为 username=kolbe&password=123456

@RequestMapping(path = "/login", params={"username=kolbe","password=123456"})

public String login() {

return "success";

}

}

该例中则表示UserController中的login()方法仅处理/user/login发来的请求,且必须带有username=kolbe&password=123456的请求参数,否则浏览器将返回HTTP404的错误,对应index.jsp中的键接地址为:

username=kolbe&password=123456">User Login

六、测试@RequestMapping的headers属性,该属性表示请求头

用于HTTP协义交互的信息被称为HTTP报文,客户端发送的HTTP报文被称为请求报文,服务器发回给客户端的HTTP报文称为响应报文,报文由报文头部和报文体组成。

请求头部(RequestHeaders):

请求头包含许多有关客户端环境和请求正文的信息,例如浏览器支持的语言、请求的服务器地址、客户端的操作系统等。

响应头部(RsponseHeaders):

响应头也包含许多有用的信息,包括服务器类型、日期、响应内容的类型及编码,响应内容的长度等等。

如果你安装的是Chrome浏览器,可以通过在网页中 右击鼠标---->审查元素---->Network---->Name中点击网页---->右侧查看Headers即可,如果Name中没有出现网页,可以刷新一下即可,下边是我电脑中的一个请求头部示例:

Request Headers

    Accept:

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

    Accept-Encoding:

gzip, deflate, sdch

    Accept-Language:

zh-CN,zh;q=0.8

    Cache-Control:

max-age=0

    Connection:

keep-alive

    Cookie:

JSESSIONID=210075B5E521CWE3CDE938076295A57A

    Host:

localhost:

8080

    Upgrade-Insecure-Requests:

1

    User-Agent:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93

回规正题,通过@RequestMapping中的headers属性,可以限制客户端发来的请求

@Controller

@RequestMapping(path = "/user")

public class UserController {

        // 表示只接收本机发来的请求

@RequestMapping(path = "/login", headers="Host=localhost:

8080")

public String login() {

return "success";

}

}

七、带占位符的URL

(一)带占位符的URL是Spring3.0新增的功能,可以通过@PathVariable将URL中的占位符绑定到控制器的处理方法的参数中,占位符使用{}括起来

(二)使用方法:

1)带占位符的URL示例:

@Controller

@RequestMapping(path = "/user")

public class UserController {

        

@RequestMapping(value="/{id}", method=RequestMethod.GET)

public String show(@PathVariable("id") Integer id) {

return "success";

}

}

在这个控制器中show()方法将可以接收user/1、user/2、user/3等等的路径请求,请求的方法必须为GET,使用@PathVariable为应用实现REST规范提供了具大的便利条件。

八、采用REST风格的URL请求

1)简介:

REST(RepresentationalStateTransfer):

(资源)表现层状态转化,它是目前最流行的一种软件架构,其结构清晰、易于理解、扩展方便且符合标准,正在越来越多的被实践到应用中。

2)REST风格的URL请求

 请求路径        请求方法           作用

-/user/1        HTTP GET        得到id为1的user

-/user/1        HTTP DELETE     删除id为1的user

-/user/1        HTTP PUT        更新id为1的user

-/user          HTTP POST       新增user

3)由于浏览器表单只支持GET和POST请求,为了实现DELETE和PUT请求,Spring为我们提供了一个过滤器org.springframework.web.filter.HiddenHttpMethodFilter,可以为我们将GET和POST请求通过过滤器转化成DELETE和PUT请求。

4)在web.xml中配置过滤器

-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter 过滤器 -->

    hiddenHttpMethodFilter

    org.springframework.web.filter.HiddenHttpMethodFilter

    

    hiddenHttpMethodFilter

    

-- 拦截所有请求 -->

    /*

5)由于浏览器表单无法发送DELETE和PUT请求,所以为了让HiddenHttpMethodFilter识别请求的方法,需要在表单中添加一个隐藏域,名字为_method值为DELETE或POST或PUT,修改后index.jsp页面代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

DOCTYPE html>

Spring MVC

 

-- 得到id为1的user -->

Test Rest GET

-- 新建id为1的user -->

        

-- 删除id为1的user -->

-- 更新id为1的user -->

6)修改后的UserController代码

package cn.kolbe.spring.mvc.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

@Controller

@RequestMapping(path = "/user")

public class UserController {

@RequestMapping(value="/{id}", method=RequestMethod.GET)

public String show(@PathVariable("id") Integer id) {

System.out.println("查看id为:

" + id + "的user");

return "success";

}

@RequestMapping(value="/{id}", method=RequestMethod.PUT)

public String update(@PathVariable("id") Integer id) {

System.out.println("更新id为:

" + id + "的user");

return "success";

}

@RequestMapping(value="/{id}", method=RequestMethod.DELETE)

public String destroy(@PathVariable("id") Integer id) {

System.out.println("删除id为:

" + id + "的user");

return "success";

}

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

public String create() {

System.out.println("新建user");

return "success";

}

}

注:

如果你的web项目是运行在Tomcat8下,你会发现被过滤成DELETE和PUT请求,到达控制器后,返回时(forward)会报HTTP405的错误提示

HTTP Status 405 - Request method 'DELETE' not supported

HTTP Status 405 - JSPs only permit GET POST or HEAD

有三种解决方案:

(一)将Tomcat8改为Tomcat7,在Tomcat7下运行是正常的

(二)将请求转发(forward)改为请求重定向(redirect)

(三)自己手动写一个Filter来包装HttpRequest中的getMethod()方法

下面介绍一下第

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1