Spring MVC
- @RequestMapping
- 属性
@RequestMapping
@RequestMapping, 是 Spring Web 应用程序中最常用的注解之一,主要用于映射 HTTP 请求 URL 与处理请求的处理器 Controller 方法上。使用 @RequestMapping 注解可以方便地定义处理器 Controller 的方法来处理不同的 HTTP 请求,从而实现 Web 应用程序的路由功能。
@RequestMapping 注解可用于方法级别和类级别
方法级别上使用 @RequestMapping 注解:将请求 URL 与特定的处理器 Controller 方法进行映射
类级别上使用 @RequestMapping 注解:将请求 URL 与整个处理器 Controller 类进行映射
简单示例:
在方法级别上使用 @RequestMapping 注解
//原来案例
package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexDemo {
@RequestMapping("/index")
public String index(){
return "index"; //返回对应页面文件名
}
}
结果如图:
在类级别上使用 @RequestMapping 注解
package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/index") //类级别使用该注解,相当于请求地址上增加一个父目录
@Controller
public class IndexDemo {
@RequestMapping("/index") //子目录
public String index(){
return "index"; //返回对应页面文件名
}
}
结果如图(区别在于请求 URL ):
属性
@RequestMapping 注解属性
一、value:指定请求地址
1.可以是相对路径或绝对路径
package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexDemo {
//1.可以指定为具体值
@RequestMapping("/index1")
public String index1(){
return "index"; //返回对应页面文件名
}
}
结果如图:
2.可以是 URL Template 模式
package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexDemo {
//2.可以指定为含有变量或正则表达式的一类值(URL Template)
@RequestMapping("/index2/{id}")
//@PathVariable 注解的 value 值需要与占位符中的变量保持一致
public String index2(@PathVariable(value = "id") int ids){
System.out.println(ids);
return "index";
}
}
结果如图:
二、method:指定请求方法
可以是 GET、POST、PUT、DELETE 等 HTTP 方法,默认自动匹配 GET 或 POST 请求
如图:指定请求方法为 GET
三、consumes:指定请求 consumes ,即指定请求所接受的媒体类型(Content-Type)
简单示例:
首先,创建一个 accessing.jsp
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2023/7/18
Time: 12:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>访问成功!</h2>
</body>
</html>
然后,在 index.jsp 中添加一个 form 表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World</h2>
<form action="${pageContext.request.contextPath}/consumes" method="post">
<input type="text" value="spring mvc">
<input type="submit" value="提交">
</form>
</body>
</html>
接着,属性 consumes 指定请求的内容类型为 text/html
package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class IndexDemo {
//1.可以指定为具体值
@RequestMapping("/index1")
public String index1(){
return "index"; //返回对应页面文件名
}
//consumes 限制内容类型为 text/html 才接受请求处理,其余的会报错:HTTP状态 415 - 不支持的媒体类型
@RequestMapping(value = "/consumes",method = RequestMethod.POST,consumes = "text/html")
public String consumes(){
System.out.println("访问成功!");
return "accessing";
}
}
最后,测试结果
1.打开 index.jsp
2.点击提交,跳转到 accessing.jsp
原因:consumes 属性指定接收内容类型为 text/html ,但如图请求头中真正的类型为 application/x-www-form-urlencoded ,与之不匹配,故报错HTTP状态 415 - 不支持的媒体类型
解决:将 consumes = “text/html” 改为 consumes = “application/x-www-form-urlencoded” 或者删除 consumes 属性即可
四、produces:指定请求 produces ,即指定响应的媒体类型(Content-Type)
接着上面的示例,将 consumes 属性改为 produces 属性
结果如图:
注:
- produces 属性指定的响应类型,当请求头的 Accept 的类型中包含即可成功响应
- Accept 中的 /;q=0.8 类型表示可以接收任何类型,权重系数0.8指若前几种类型不能正常接收,则根据响应的数据类型进行自动分析匹配处理
五、params:指定请求参数
可以是查询参数或表单参数,指定参数后必须包含这些参数才接收处理
简单示例:
首先,在 index.jsp 中再添加两个 input 标签,并添加 name 参数和参数值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World</h2>
<form action="${pageContext.request.contextPath}/consumes" method="post">
<%-- name值为对应的参数 --%>
<input type="text" name="data" value="" />
<input type="text" name="day" value="" />
<input type="submit" value="提交">
</form>
</body>
</html>
接着,成功访问跳转的 accessing.jsp 内容如下
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2023/7/18
Time: 12:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>访问成功!</h2>
</body>
</html>
然后,属性 params 指定表单参数或参数条件
package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class IndexDemo {
//1.可以指定为具体值
@RequestMapping("/index1")
public String index1(){
return "index"; //返回对应页面文件名
}
//params 指定参数必须有 "data","day" ,而且 "day=10" 才能访问成功(条件可以为 = 、 != )
@RequestMapping(value = "/consumes",method = RequestMethod.POST,params = {"data","day=10"})
public String consumes(){
System.out.println("访问成功");
return "accessing";
}
}
最后,测试结果
1.当 day=1 时,访问失败
2.当 day=10 时,访问成功
六、headers:指定请求头
可以是特定的请求头信息,指定请求头后必须包含这些请求头信息才接收处理
请求头信息( Request Headers )
接着上面的示例,将 params 属性改为 headers 属性,并指定请求头信息(以 Accept-Language: zh-CN,zh;q=0.9 的请求头信息为例)
注:headers 属性值以键值对形式表示,用等号而不是冒号
当信息 zh-CN 改为 en-US 时,访问失败。结果如图: