目录

@RequestMapping 注解其它使用方式

1.可以修饰方法和类

2.可指定 params 和 headers 支持简单表达式

3.支持 Ant 风格资源地址

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

总的注意事项和细节 

Postman(接口测试工具) 

1.Postman介绍与下载 

 2.Postman的基本使用

3.Postman 完成 上面Controller 层测试 

 如何发送JSON数据格式

Rest-优雅的 url 请求风格 

1. Rest的基本介绍

2.Rest的应用实例 

1.实现 GET和POST请求获取指定id的书和增加一本书

SpringMVC 映射请求数据

 1.获取参数值(请求的参数名和方法的形参名可以不一致)

2.获取 http 请求消息头

 3.获取 javabean 形式的数据

4.获取 servlet api

重点注意事项


@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 的请求参数,但其值不能为 value1
4. {"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。 

总的注意事项和细节 

1. 映射的 URL, 不能重复
@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/buy
2) 请求的方式 -Post
3) 确定请求的参数 / 数据 -
4) 确定 Headers 有没有特殊的指定 - http 协议有了解

请求(1) 

@RequestMapping(value = "/user")
@Controller //UserHandler 就是一个处理器/控制器,注入到容器
public class UserHandler {
@PostMapping(value = "/buy")
public String buy() {
System.out.println("购买商品~");
return "success";
}
}

 如何发送JSON数据格式

1. 在 Headers 选项页,增加 Content-Type appliction/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 GET
delete?id=1 GET
update POST
add POST
4. 说明: 传统的 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,Writer
3. 其中一些对象也可以通过 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";
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐