【SpringMVC -2】@RequestMapping+Postman(接口测试工具)+Rest的url请求风格+SpringMVC映射请求数据 (简单易懂!适合复习!)
目录
2.可指定 params 和 headers 支持简单表达式
4.@RequestMapping 可配合 @PathVariable 映射 URL 绑定的占位符
@RequestMapping 注解其它使用方式
1.可以修饰方法和类
说明 : @RequestMapping 注解可以修饰方法,还可以修饰类 当同时修饰类和方法时,请求的 url就是组合 / 类请求值 / 方法请求值 .
下图中::buy()方法请求的url: http://ip:port/工程路径/user/buy
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器,注入到容器
public class UserHandler {
@RequestMapping(value = "/buy",method = RequestMethod.GET)
public String buy() {
System.out.println("购买商品~");
return "success";
}
}

提示:
/**
* 1. method=RequestMethod.POST: 表示请求buy目标方法必须是 post
* 2. RequestMethod 四个常用选项 POST, GET, PUT, DELETE[后面我们会详解]
* 3. SpringMVC 控制器默认支持GET和POST两种方式
* 4. buy()方法请求的url: http://ip:port/工程路径/user/buy
* 5. @PostMapping(value = "/buy")等价 @RequestMapping(value = "/buy",method = RequestMethod.POST)
*/
2.可指定 params 和 headers 支持简单表达式

表示传进来的参数必须有bookId 且 值必须是100
@RequestMapping(value = "/find", params = "bookId=100", method = RequestMethod.GET)
public String search(String bookId) {
System.out.println("查询书籍 bookId= " + bookId);
return "success";
}
提示:
1. param1: 表示请求必须包含名为 param1 的请求参数2. !=param1: 表示请求不能包含名为 param1 的请求参数3. param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value14. {"param1=value1", "param2"}: 请求必须包含名为 param1 和 param2 的两个请求参数, 且 param1 参数的值必须为 value1
3.支持 Ant 风格资源地址
要求: 可以配置 /user/message/aa, /user/message/aa/bb/cc
@RequestMapping(value = "/message/**") /** 可以匹配多层路径

@RequestMapping(value = "/message/**")
public String im() {
System.out.println("发送消息");
return "success";
}
前端的发送消息1/发送消息2 的URL请求 web层的控制器都能接收并匹配
提示:
1. ? :匹配文件名中的一个字符2. * :匹配文件名中的任意字符3. **: 匹配多层路径4. Ant 风格的 url 地址举例/user/*/createUser: 匹配 /user/aaa/createUser 、 /user/bbb/createUser 等 URL/user/**/createUser: 匹配 /user/createUser 、 /user/aaa/bbb/createUser 等 URL/user/createUser??: 匹配 /user/createUseraa 、 /user/createUserbb 等 URL
4.@RequestMapping 可配合 @PathVariable 映射 URL 绑定的占位符
比如: 我们的前端页面是 这样的, kristina 和 300 是参数值
< hr >< h1 > 占位符的演示 </ h1 >< a href ="user/reg/kristina/300" > 占位符的演示 </ a >

在前端Jsp中的kristina--->下面的{username} 300--->下面的{userid}
@PathVariable("username") String name 指的是 将url的参数username进行接收,并用name变量名代替。
@RequestMapping(value = "/reg/{username}/{userid}")
public String register(@PathVariable("username") String name,
@PathVariable("userid") String id) {
System.out.println("接收到参数--" + "username= " + name + "--" + "usreid= " + id);
return "success";
}
提示:

如上图所示:
如果第一个RequestMapping在url中想要传入的参数,和我们第二个RequestMapping的url路径冲突,他会优先匹配第二个url路径的,而不是去匹配第一个RequestMapping。
总的注意事项和细节
@RequestMapping ( value = "/hi" ) 这样的value值在同一个@controller下只能有一个。服务端报错信息 : to { [/user/hi]}: There is already 'userHandler' bean method
2. 各种请求的简写形式
@RequestMapping (value = "/buy" ,method = RequestMethod . POST )等 价 @PostMapping (value = "/buy")简写方式一览 :@GetMapping @PostMapping @PutMapping @DeleteMapping
3. 如果我们确定表单或者超链接会提交某个字段数据比如(email), 要求提交的参数名和目
测试 输入 localhost:9998/user/hello3?email=tom@sohu.com,@GetMapping (value = "/hello3" )public String hello3 ( String email) {System . out .println( "hello3 " + email);return "success" ;}后台方法就可以接收到email对应的值,如果没有此email也不会报错,会显示为null。
Postman(接口测试工具)
1.Postman介绍与下载
1. Postman 是一款功能超级强大的用于发送 HTTP 请求的 测试工具2. 做 WEB 页面开发和测试的人员常用工具3. 创建和发送任何的 HTTP 请求 (Get/Post/Put/Delete...)官方网站 https://www.postman.com/ (下载超级简单啦 )

当出现如下界面的时候就已经安装成功了

2.Postman的基本使用
首先点击File,创建一个新的HTTP Request

创建一个你的请求的集合

请求百度的案例

3.Postman 完成 上面Controller 层测试
-- 使用 Postman 测试 Controller 的方法的步骤1) 确定请求的地址 url http://localhost:8080/springmvc/user/buy2) 请求的方式 -Post3) 确定请求的参数 / 数据 - 无4) 确定 Headers 有没有特殊的指定 - 对 http 协议有了解
请求(1)
@RequestMapping(value = "/user")
@Controller //UserHandler 就是一个处理器/控制器,注入到容器
public class UserHandler {
@PostMapping(value = "/buy")
public String buy() {
System.out.println("购买商品~");
return "success";
}
}


如何发送JSON数据格式
在Body中选择raw发送JSON数据

Rest-优雅的 url 请求风格
1. Rest的基本介绍
Restful风格就是把请求参数变成请求路径的一种风格
传统的URL风格:http://...//findUserById?id=1
而采用Restful风格:http://...//user/id/1
RESTful风格中的URL不使用动词形式的路径。看出来了和上面的不同了吧。
RESTful风格不是RESTful规范,可以不用去遵守,他的优势在于路径的书写比较简便,并且通过地址无法得知做的是何种操作。!
1. REST :即 Representational State Transfer 。 ( 资源 ) 表现层状态转化。是目前流行的请求方 式。它结构清晰 , 很多网站采用。2. HTTP 协议里面,四个表示操作方式的动词: GET 、 POST 、 PUT 、 DELETE 。它们分别对应 四种基本操作: GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。3. 实例传统的请求方法 :getBook?id=1 GETdelete?id=1 GETupdate POSTadd POST4. 说明: 传统的 url 是通过参数来说明 crud 的类型, rest 是通过 get/post/put/delete 来说明 crud 的类型
● REST 的核心过滤器1. 当前的浏览器只支持 post/get 请求,因此为了得到 put/delete 的请求方式需要使用 Spring 提供的 HiddenHttpMethodFilter 过滤器进行转换 .2. HiddenHttpMethodFilter :浏览器 form 表单只支持 GET 与 POST 请求,而 DELETE 、 PUT 等 method 并不支持, Spring 添加了一个过滤器,可以将这些请求转换为标准的 http 方 法,使得支持 GET 、 POST 、 PUT 与 DELETE 请求3. HiddenHttpMethodFilter 能对 post 请求方式进行转换,因此我们需要特别的注意这一点4. 这个过滤器需要在 web.xml 中配置
2.Rest的应用实例
1. 修改 web.xml 添加 HiddenHttpMethodFilter
<!--配置HiddenHttpMethodFilter
1. 作用是 把 以post方式提交的delete和put请求进行转换
2. 配置url-pattern 是 /* 表示请求都经过 hiddenHttpMethodFilter过滤
3. 后面通过debug源码,就看的很清楚
-->
<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>
2.在Spring-mvc.xml中添加设置
<!--加入两个常规配置-->
<!--支持SpringMVC的高级功能,比如JSR303校验, 映射动态请求-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--将springmvc不能处理的请求,交给tomcat处理,比如css, js-->
<mvc:default-servlet-handler/>
需求说明

1.实现 GET和POST请求获取指定id的书和增加一本书
<h3>rest风格的url 查询书籍[get]</h3>
<a href="user/book/200">点击查询书籍</a>
<br><hr>
<h3>rest风格的url 添加书籍[post]</h3>
<form action="user/book" method="post">
name:<input name="bookName" type="text"><br>
<input type="submit" value="添加书籍">
</form>
<br><hr>
在BookHandler下写入控制方法
//查询[GET]
@RequestMapping(value = "/book/{id}", method = RequestMethod.GET)
public String getBook(@PathVariable("id") String id) {
System.out.println("查询书籍 id=" + id);
return "success";
}
//添加[POST]
@PostMapping(value = "/book")
public String addBook(String bookName) {
System.out.println("添加书籍 bookName== " + bookName);
return "success";
}
浏览器默认是支持GET和POST请求的,对于PUT和DELETE请求不了,所以GET和Post请求与之前没什么区别。
现在来实现PUT和DELETE的请求(要用到JQUERY)
前端jsp界面
<%--
Created by IntelliJ IDEA.
Version: 1.0
Filename: rest
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>rest </title>
<%-- 引入jquery--%>
<script type="text/javascript" src="script/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
$(function () { //当页面加载完成后,就执行=> 如果你完全忘记,去回顾我们讲过的jquery
//给删除超链接绑定一个点击事件
$("#deleteBook").click(function (){
//alert("点击。。。。");
//我们自己定义给提交的行为
$("#hiddenForm").attr("action", this.href);
$(":hidden").val("DELETE");
$("#hiddenForm").submit();
return false; //改变点击超链接的行为, 不在提交
})
})
</script>
</head>
<body>
<h3>rest风格的url, 删除一本书</h3>
<a href="user/book/600" id="deleteBook">删除指定id的书</a>
<form action="" method="post" id="hiddenForm">
<input type="hidden" name="_method"/>
</form>
<br><hr>
<h3>rest风格的url 修改书籍[put]~</h3>
<form action="user/book/666" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="修改书籍~">
</form>
</body>
</html>
1. 默认情况下 <a href="user/book/600">删除指定id的书</a> 是get
2. 怎么样将 get 请求转成 springmvc 可以识别的 delete 就要考虑HiddenHttpMethodFilter机制
public static final String DEFAULT_METHOD_PARAM = "_method";
---------------------------------------------------
private static final List<String> ALLOWED_METHODS =
Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(),
HttpMethod.DELETE.name(), HttpMethod.PATCH.name()));
---------------------------------------------------
if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
String paramValue = request.getParameter(this.methodParam);
if (StringUtils.hasLength(paramValue)) {
String method = paramValue.toUpperCase(Locale.ENGLISH);
if (ALLOWED_METHODS.contains(method)) {
requestToUse = new HttpMethodRequestWrapper(request, method);
}
}
}
3. 上面代码可以看到 HiddenHttpMethodFilter 过滤器可以对以Post方式提交的delete,put,patch进行转换,成springmvc识别的 RequestMethod.DELETE / RequestMethod.PUT /...
4. 我们需要将 get <a href="user/book/600">删除指定id的书</a> 以post方式提交给后端handler, 这样过滤器还会生效
5. 我们可以同jquery来处理-引入jquery
后台代码!!
//删除[DELETE]
@RequestMapping(value = "/book/{id}", method = RequestMethod.DELETE)
public String delBook(@PathVariable("id") String id) {
System.out.println("删除书籍 id= " + id);
//return "success"; //[如果这样返回会报错 JSPs only permit GET POST or HEAD]
//老师解读
//1. redirect:/user/success重定向
//2. 会被解析成 /springmvc/user/success
return "redirect:/user/success";
}
//如果请求是 /user/success , 就转发到 success.jsp
//successGenecal对应的url http://ip:port/springmvc/user/success
@RequestMapping(value = "/success")
public String successGenecal() {
return "success"; //由该方法 转发到success.jsp页面
}
//修改[PUT]
@PutMapping(value = "/book/{id}")
public String updateBook(@PathVariable("id") String id) {
System.out.println("修改书籍 id=" + id);
return "redirect:/user/success";
}
SpringMVC 映射请求数据
1.获取参数值(请求的参数名和方法的形参名可以不一致)
如何获取到 http://xxx/url?参数名=参数值&参数名=参数值
之前我们拿到url的参数是传进来的参数名,要和我后台使用的参数名保持一致。
这里讲述的就是如何解决使用的参数名不一致的情况,也能拿到对应参数名的值。
前端JSP页面
<h2>获取到超链接参数值</h2>
<hr/>
<a href="vote/vote01?name=sn">获取超链接的参数</a>
后台控制器
解读: @RequestParam(value="name", required=false)
1. 获取到超链接传递的数据 请求 http://localhost:8080/springmvc/vote/vote01 name=xx
2. @RequestParam 表示会接收提交的参数
3. value="name" 表示提交的参数名是name
4. required=false 表示该参数可以没有, (默认是true,表示必须有这个参数)
5. 当我们使用了@RequestParam(value="name", required=false)后就请求的参数名和方法的形参名可以不一致。
@RequestMapping(value = "/vote01")
public String test01(@RequestParam(value = "name", required = false) String username) {
System.out.println("得到的username= " + username);
//返回到一个结果
return "success";
}
2.获取 http 请求消息头
获取请求头Accept-Encoding 和 请求头 HOST
要用到注解@RequestHeader
@RequestMapping(value = "/vote02")
public String test02(@RequestHeader("Accept-Encoding") String ae,
@RequestHeader("Host") String host) {
System.out.println("Accept-Encoding= " + ae);
System.out.println("Host= " + host);
//返回到一个结果
return "success";
}
3.获取 javabean 形式的数据
开发中,如何获取到 javaben 的数据,就是将获取到的信息封装成一个对象形式。
解释:
1. 方法的形参用对应的类型来指定即可, SpringMVC会自动的进行封装
2. 如果自动的完成封装, 要求提交的数据,参数名和对象的字段名保持一致
3. 如果属性是对象,这里就是仍然是通过 字段名.字段名 比如Master [pet]
即提交的数据 参数名 是 pet.id pet.name, 这就是级联操作
4. 如果提交的数据 的参数名和对象的字段名不匹配,则对象的属性值就是null
首先创建Master类
package com.ygd.web.requestparameter.entity;
/**
* @version 1.0
*/
public class Master {
private Integer id;
private String name;
private Pet pet;//对象的属性是另外一个对象[涉及级联]
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Pet getPet() {
return pet;
}
public void setPet(Pet pet) {
this.pet = pet;
}
@Override
public String toString() {
return "Master{" +
"id=" + id +
", name='" + name + '\'' +
", pet=" + pet +
'}';
}
}
创建Pet类
package com.ygd.web.requestparameter.entity;
/**
* @version 1.0
*/
public class Pet {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Pet{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
创建request_para.jsp
1. 这是一个表单,表单的数据对应Master对象.
2. 提交的数据参数名和对象的字段名一致即可.
<%--
Created by IntelliJ IDEA.
User: Administrator :ygd
Date: 2024/11/23
Time: 20:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>添加主人信息</h1>
<!--
1. 这是一个表单,表单的数据对应Master对象
2. 提交的数据参数名和对象的字段名一致即可
-->
<form action="vote/vote03" method="post">
主人号:<input type="text" name="id"><br>
主人名:<input type="text" name="name"><br>
宠物号:<input type="text" name="pet.id"><br>
宠物名:<input type="text" name="pet.name"><br>
<input type="submit" value="添加主人和宠物">
</form>
</body>
</html>
后台控制器
@RequestMapping(value = "/vote03")
public String test03(Master master) {
System.out.println("master=" + master);
//返回结果
return "success";
}

后台也会显示出这个master对象的信息
一定注意:表单的控件名称 name 需要和 javabean 对象字段对应, 否则就是 null
4.获取 servlet api
springmvc中支持原生的servlet的开发
首先应该引入servlet-api.jar

jsp界面
<h1>演示 servlet api的使用 </h1>
<form action="vote/vote04" method="post">
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="pwd"><br>
<input type="submit" value="添加用户">
</form>
后台控制
@RequestMapping(value = "/vote04")
public String test04(HttpServletRequest request, HttpServletResponse response) {
System.out.println("name= " + request.getParameter("username"));
System.out.println("pwd= " + request.getParameter("pwd"));
//返回结果
return "success";
}
结果展示

重点注意事项
1. 除了 HttpServletRequest, HttpServletResponse 还可以其它对象也可以这样的形式获取2. HttpSession 、 java.security.Principal,InputStream,OutputStream,Reader,Writer3. 其中一些对象也可以通过 HttpServletRequest / HttpServletResponse 对象获取, 比如Session 对象 , 既可以通过参数传入,也以通过 request.getSession() 获取,效果一样,推荐使用参数形式传入,更加简单明了。
以下是我写的关于cookie和session的博客Java Web Session技术详解(全网最详细) (原理分析 + 简易购物车相关案例)_javaweb session-CSDN客
Java Web中的Cookie技术 (小甜心) + 分析原理 + 概念回顾 + 保存上次登录时间(实时更新)_java浏览器记住登录信息-CSDN博客
下面通过HttpSession获取的session和request.getSession()获取的对象是同一个。
@RequestMapping(value = "/vote04")
public String test04(HttpServletRequest request,
HttpServletResponse response, HttpSession hs) {
System.out.println("name= " + request.getParameter("username"));
System.out.println("pwd= " + request.getParameter("pwd"));
//可以看到 hs 和 request.getSession() 是同一个对象
System.out.println("httpSession=" + httpSession);
System.out.println("httpSession2=" + request.getSession());
//返回结果
return "success";
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)