个人技术分享


⬅️ 上一篇: SpringMVC系列一: 初识SpringMVC


🎉 欢迎来到 SpringMVC系列二: 请求方式介绍 🎉

在本篇文章中,我们将详细介绍 SpringMVC 中的各种请求方式。通过掌握这些请求方式,您可以更灵活地处理客户端请求,开发出更加健壮和高效的 Web 应用程序。


🔧 本篇需要用到的项目: JavaWeb项目 springmvc


在这里插入图片描述

基本使用

1.RequestMapping注解可以指定控制器/处理器的某个方法的请求的url, 基本用法前面我们学过了. RequestMapping: 请求映射

@RequestMapping(value = "/login")
public String login() {
    System.out.println("login ok...");
    return "login_ok";
}

@RequestMapping注解其它使用方式

@RequestMapping可以修饰类和方法

1.说明: @RequestMapping注解可以修饰方法, 还可以修饰类. 当同时修饰类和方法时, 请求的url 就是组合 /类请求值/方法请求值

2.应用实例
1)新建src/com/zzw/web/UserHandler.java

@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {
    /**
     * 1.method=RequestMethod.POST: 表示请求buy方法必须是 post
     * 2.RequestMethod 四个常用选项 POST, GET, PUT, DELETE[后面会详解]
     * 3.SpringMVC 控制器默认支持GET和POST两种方式
     *
     * buy方法请求的url: http://ip:port/工程路径/user/buy
     * @return
     */
    @RequestMapping(value = "/buy", method = RequestMethod.POST)
    public String buy() {
        System.out.println("购买.");
        return "success";
    }
}

2)新建web/request.jsp

<body>
<%--解读
1. action="user/buy" 对应 url http://localhost:8080/工程路径/user/buy
--%>
<form action="user/buy" method="post">
    购买人: <input type="text" name="username"/><br/>
    购买量: <input type="password" name="nums"/><br/>
    <input type="submit" value="购买">
</form>
</body>

3)新建web/WEB-INF/pages/success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>操作成功</title>
</head>
<body>
<h1>恭喜, 操作成功~</h1>
</body>
</html>

4)浏览器完成测试

5)Postman 完成测试

@RequestMapping可以指定请求方式(post,get,put,delete)

1.说明: @RequestMapping可以指定请求方式(post/get/put/delete..), 请求的方式要和指定的一样, 否则报错.

2.SpringMVC控制器默认支持GETPOST两种方式, 也就是你不指定method, 可以接收GETPOST请求

3.应用实例
1)修改web/request.jsp, 改成get请求

<form action="user/buy" method="get">
    购买人: <input type="text" name="username"/><br/>
    购买量: <input type="password" name="nums"/><br/>
    <input type="submit" value="购买">
</form>

2)当你明确指定了method, 则需要按指定方式请求, 否则会报错, 就像这里的get请求.

@RequestMapping可以指定params和headers, 支持简单表达式

可以指定params

1.@RequestMapping(value = "/", params = "bookId"): 表示请求必须包含名为bookId的请求参数.

2.@RequestMapping(value = "/", params = "!bookId"):表示请求不能包含名为bookId的请求参数.

3.@RequestMapping(value = "/", params = "bookId=100"):表示请求必须包含名为bookId的请求参数, 且其值必须为100.

4.@RequestMapping(value = "/", params = "bookId!=100"):表示请求包含名为bookId的请求参数, 但其值不能为100.

5.@RequestMapping(value = "/", params = {"bookId=100", "price"}):表示请求必须包含名为bookId, price的两个请求参数, 且bookId参数的值必须为100.

6.应用实例
1)修改request.jsp

<body>
<h1>演示params的使用</h1>
<a href="user/find?bookId=100">查询书籍</a>
</body>

2)修改UserHandler.java增加方法search

@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {
    /**
     * 解读
     * 1. params="bookId" 表示请求该目标方法时, 必须给一个bookId参数, 值没有限定
     * 2. search(String bookId) 表示请求目标方法时, 携带的bookId=100, 就会将请求携带的 bookId
     *    对应的值, 赋给 String bookId
     * @param bookId
     * @return
     */
    @RequestMapping(value = "/find", params = "bookId", method = RequestMethod.GET)
    public String search(String bookId) {
        System.out.println("查询书籍 bookId=" + bookId);
        return "success";
    }
}

3)浏览器访问 http://localhost:8081/springmvc/request.jsp, 完成测试

4)Postman 方式完成测试.

7.细节
1)需要有bookId参数, 并且值为100, 否则报错.

@RequestMapping(value = "/find", params = "bookId=100", method = RequestMethod.GET)

2)需要有bookId参数, 并且值不为100, 否则报错.

@RequestMapping(value = "/find", params = "bookId!=100", method = RequestMethod.GET)

3)getpost均支持.

4)只能识别URL中的查询参数或表单提交的参数,而不能直接解析JSON数据.

可以指定headers

1.@RequestMapping(value = "/", headers = "Content-Type"):
表示请求必须包含名为Content-Type的请求头。

2.@RequestMapping(value = "/", headers = "!Content-Type"):
表示请求不能包含名为Content-Type的请求头。

3.@RequestMapping(value = "/", headers = "Content-Type=application/json"):
表示请求必须包含名为Content-Type的请求头,且其值必须为application/json。

4.@RequestMapping(value = "/", headers = "Content-Type!=application/json"):
表示请求包含名为Content-Type的请求头,但其值不能为application/json。

5.@RequestMapping(value = "/", headers = {"Content-Type=application/json", "Accept"}):
表示请求必须包含名为Content-Type和Accept的两个请求头,且Content-Type请求头的值必须为application/json。

@RequestMapping支持Ant 风格资源地址

1.?: 匹配文件名中的一个字符
2.*: 匹配文件名中的任意字符
3.**: 匹配多层路径

4.Ant 风格的 url地址举例

/user/*/createUser:匹配/user/aaa/createUser, /user/bbb/createUserURL

/user/**/createUser:匹配/user/createUser, /user/aaa/bbb/createUserURL

/user/createUser??:匹配/user/createUseraa, /user/createUserbbURL

5.应用实例
1)修改UserHandler.java增加方法im

@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {

    /**
     * 要求: 可以匹配 /user/message/aa, /user/message/aa/bb/cc
     * @RequestMapping(value="/message/**") 表示可以匹配多层路径
     */
    @RequestMapping(value = "/message/**")
    public String im() {
        System.out.println("发送消息");
        return "success";
    }
}

2.)修改request.jsp

<body>
<hr><h1>演示Ant风格的请求资源方式</h1>
<a href="user/message/aa">发送消息1</a>
<a href="user/message/aa/bb/cc">发送消息2</a>
</body>

3)浏览器完成测试

4)Postman 完成测试

@RequestMapping可配合@PathVariable 映射 URL 绑定的占位符

1.@RequestMapping可以配合@PathVariable映射URL绑定的占位符.

2.这样就不需要在url地址上带参数名了, 更加的简洁明了.

3.应用实例
1)修改UserHandler.java增加方法register

@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {

    /**
     * 前端页面: <a href="user/reg/Kristina/300">占位符的演示</a>
     * (value="/reg/{username}/{userId}"): 表示Kristina=>{username} 300=>{userId}
     *
     * @return
     */
    @RequestMapping(value = "/reg/{username}/{userId}")
    public String register(@PathVariable("username") String name,
                           @PathVariable("userId") int id) {
        System.out.println("接收到参数--" + "username=" + name + "--" + "userId=" + id);
        return "success";
    }
}

2)修改request.jsp

<body>
<hr/><h1>占位符的演示</h1>
<a href="user/reg/Kristina/300">占位符的演示</a>
</body>

3)浏览器完成测试

4)Postman 完成测试

注意事项和使用细节

1.映射的URL, 不能重复

1)修改UserHandler.java增加方法

@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {

    @RequestMapping(value = "/hi")
    public String hi() {
        System.out.println("hi");
        return "success";
    }

    @RequestMapping(value = "/hi")
    public String hi2() {
        System.out.println("hi");
        return "success";
    }
}

服务端报错信息:to { [/user/hi]}: There is already ‘userHandler’ bean method

2.各种请求的简写形式

1)说明
@RequestMapping(value=“/buy”,method=RequestMethod.POST) 等价 @PostMapping(value=“/buy”)

简写方式一览: @GetMapping @PostMapping @PutMapping @DeleteMapping
在这里插入图片描述

2)应用实例

@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {

    /**
     * @PostMapping(value="/buy") 
     * 等价于 @Request(value="/buy", method=RequestMapping.POST)
     */
    @PostMapping(value = "/buy")
    public String buy() {
        System.out.println("购买.");
        return "success";
    }
}

3.如果我们确定表单或者超链接会提交某个字段数据比如email, 要求提交的参数名和目标方法的参数名保持一致.

应用实例
1)修改UserHandler.java增加方法hello

@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器, 会注入到容器
public class UserHandler {
    /**
     * hello(String email) 表示如果我们的请求参数有 email=xx, 就会将传递的值, 赋给String email
     * , 要求名称保持一致, 如果不一致, 那么接收不到数据, 而是null
     * @param email
     * @return
     */
    @RequestMapping(value = "/hello")
    public String hello(String email) {
        System.out.println("email=" + email);
        return "success";
    }
}

2)测试 浏览器地址栏 输入http://localhost:8080/springmvc/user/hello?email=978964140@qq.com, 一定要注意提交参数名和后台方法的形参名保持一致, 否则后端接收不到参数

3)Postman测试, 一定要注意提交参数名和后台方法的形参名保持一致, 否则后端接收不到参数
在这里插入图片描述
在这里插入图片描述

3)getpost均支持.

课后作业

1.熟悉SpringMVC的执行流程图

2.熟悉@RequestMapping注解的使用方式

3.编写一个表单, 以Post的方式提交Computer信息, 后端编写ComputerHandler, 可以接收到信息.

●代码实现

1)修改request.jsp

<body>
<h1>电脑信息</h1>
<form action="?" method="post">
    品牌:<input type="text" name="brand"/><br/>
    价格:<input type="text" name="price"/><br/>
    数量:<input type="text" name="nums"/><br/>
    <input type="submit" value="提交">
</form>
</body>

2)新建com.zzw.web.ComputerHandler

@RequestMapping(value = "/computer")
@Controller
public class ComputerHandler {
    //这里一定要注意, info方法的形参名需要和请求的参数名保持一致
    @PostMapping(value = "/info", params = {"brand", "price", "nums"})
    public String info(String brand, String price, String nums) {
        System.out.println("电脑信息--brand=" +  brand
                + "--price=" + price + "--nums" + nums);
        return "success";
    }
}

3)配置页面访问路径

<form action="computer/info" method="post">

4)页面测试…
在这里插入图片描述

5)Postman 测试.

在这里插入图片描述


🔜 下一篇预告: SpringMVC系列三: Postman(接口测试工具)


📚 目录导航 📚

  1. SpringMVC系列一: 初识SpringMVC
  2. SpringMVC系列二: 请求方式介绍
  3. SpringMVC系列三: Postman(接口测试工具)
  4. SpringMVC系列四: Rest-优雅的url请求风格
  5. SpringMVC系列五: SpringMVC映射请求数据
  6. SpringMVC系列六: 模型数据
  7. SpringMVC系列七: 视图和视图解析器
  8. SpringMVC系列八: 手动实现SpringMVC底层机制-第一阶段
  9. SpringMVC系列八: 手动实现SpringMVC底层机制-第二阶段
  10. SpringMVC系列八: 手动实现SpringMVC底层机制-第三阶段
  11. SpringMVC系列八: 手动实现SpringMVC底层机制-第四阶段
  12. SpringMVC系列九: 数据格式化与验证及国际化

💬 读者互动 💬
在学习 SpringMVC 请求方式的过程中,您有哪些新的发现或疑问?欢迎在评论区留言,让我们一起讨论吧!😊