• SpringMVC——进阶


    前言:请先观看SpringMVC——快速入门之后再看此篇文章,方便理解。SpringMVC——快速入门_热爱编程的申同学的博客-CSDN博客SpringMVC的概述及工作原理,开发快速入门https://blog.csdn.net/select_myname/article/details/127542903?spm=1001.2014.3001.5501

    目录

    1、数据绑定

    1.1、绑定servlet内置对象

    1.2、@PathVariable

    1.3、@RequestParam

    1.4、@CookieValue

    1.5、POJO对象绑定参数

    1.6、基本数据类型绑定

    1.7、解决乱码问题

    1.8、通用页面跳转

    1.9、数组类型

    1.10、绑定复杂类型

    1.11、jsp和jstl视图解析器

    2、SpringMVC的异步交互

    2.1、回顾ajax

    2.2、@ResponseBody

    2.3、@RequestBody

    3、处理静态资源

    3.1、测试前端代码

    3.2、web.xml配置方式(三种解决方式之一)

    3.3、springmvc-servlet.xml配置文件(三种解决方式之一)

    3.4、springmvc-servlet.xml配置文件简化方式(三种解决方式之一)

    4、SpringMVC拦截器

    4.1、拦截器概述

    4.2、拦截器的实现

    4.3、拦截器链

    5、过滤器和拦截器的区别

    5.1、Filter过滤器

    5.2、Interceptor拦截器

    6、RESTfull风格

    6.1、什么是RESTfull风格

    6.2、RESTfull与传统URL对比


    1、数据绑定

    1.1、绑定servlet内置对象

    可以在controller控制类方法中获取request和response对象,以及session对象

    1. @Controller
    2. @RequestMapping("user")
    3. //@RestController //相当于@Controller 和 @ResponseBody
    4. public class UserController {
    5. @RequestMapping("test1")
    6. @ResponseStatus(HttpStatus.OK)
    7. public void test1(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
    8. System.out.println(request);
    9. System.out.println(response);
    10. System.out.println(session);
    11. }
    12. }

    请求localhost:8080/user/test1.do路径 

    1.2、@PathVariable

    1. @Controller
    2. @RequestMapping("user")
    3. //@RestController //相当于@Controller 和 @ResponseBody
    4. public class UserController {
    5. @RequestMapping("test2/{id}/{name}")
    6. public String test2(@PathVariable int id, @PathVariable String name) {
    7. ModelAndView mv = new ModelAndView();
    8. mv.addObject("id", id);
    9. mv.addObject("name", name);
    10. return "user";
    11. }
    12. }

     将user页面存放在webapp包下,后缀为jsp文件

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. <h1>我是user页面h1>
    8. ${id}
    9. ${user}
    10. body>
    11. html>

    请求路径:localhost:8080/user/test2/12002/zhangsan.do 

    1.3、@RequestParam

    属性名属性值
    value参数名
    requiredtrue(默认) false
    defultValue默认值,如果不给参数值,就走默认值
    1. @Controller
    2. @RequestMapping("user")
    3. //@RestController //相当于@Controller 和 @ResponseBody
    4. public class UserController {
    5. @RequestMapping("test3")
    6. @ResponseStatus(HttpStatus.OK)
    7. public void test3(@RequestParam(value = "id", required = false, defaultValue = "222") int id, @RequestParam("name") String name) {
    8. System.out.println(id);
    9. System.out.println(name);
    10. }
    11. }

    请求路径localhost:8080/user/test3.do?name=itssl,因为id给定了默认值且为不必要参数,所以没有写id参数

    1.4、@CookieValue

    1. /**
    2. * 通过后台跳转到cookie视图
    3. *
    4. * @return
    5. */
    6. @RequestMapping("toCookie")
    7. public String toCookie() {
    8. return "cookie";
    9. }
    10. /**
    11. * 获取cookie的值
    12. *
    13. * @param
    14. */
    15. @RequestMapping("test5")
    16. @ResponseStatus(HttpStatus.OK)
    17. public void test5(@CookieValue(value = "name", required = false) String name) {
    18. System.out.println("cookie的值为:" + name);
    19. }

    cookie.jsp页面,首先先请求toCookie到此页面,然后通过页面点击a标签请求test5接口 

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. <a href="/user/test5.do">测试cookiea>
    8. body>
    9. <script>
    10. document.cookie = "name=jack";
    11. script>
    12. html>

     

    点击测试cookie ,idea控制台输出

    1.5、POJO对象绑定参数

    创建实体类,这里使用lombok依赖进行set/get。

    1. <dependency>
    2. <groupId>org.projectlombokgroupId>
    3. <artifactId>lombokartifactId>
    4. <version>1.16.18version>
    5. dependency>

    user实体类 

    1. @Data //set/get方法
    2. @AllArgsConstructor //有参构造
    3. @NoArgsConstructor //无参构造
    4. public class User {
    5. private int id;
    6. private String name;
    7. private int age;
    8. private String address;
    9. }

    书写一个控制类,填写user对象参数,以及request对象用来把user对象放到request域中,让jsp页面进行获取数据。

    1. @RequestMapping("test6")
    2. public String test6(User user, HttpServletRequest request) {
    3. request.setAttribute("user", user);
    4. return "user";
    5. }

    user.jsp页面 

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. <h1>我是user页面h1>
    8. ${user}
    9. body>
    10. html>

     注意:如果请求路径中没有填写相应的实体类属性,会以各个属性类型的默认值呈现。如:int类型为0,boolean类型为false...

    1.6、基本数据类型绑定

    1. //跳转到login页面
    2. @RequestMapping("toUser")
    3. public String toUser() {
    4. return "login";
    5. }
    6. @PostMapping("test8")
    7. @ResponseStatus(HttpStatus.OK)
    8. public void test8(@RequestParam("name") String name,
    9. @RequestParam("age") Integer age,
    10. @RequestParam("income") Integer income,
    11. @RequestParam("isMarried") Boolean isMarried,
    12. @RequestParam("interests") String interests) {
    13. System.out.println(name);
    14. System.out.println(age);
    15. System.out.println(income);
    16. System.out.println(isMarried);
    17. System.out.println(interests);
    18. }

    login.jsp页面 

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. <form action="/user/test8.do" method="post">
    8. <div>姓名:div>
    9. <div><input name="name" value="张三"/>div>
    10. <div class="clear">div>
    11. <div>年龄:div>
    12. <div><input name="age" value="20"/>div>
    13. <div class="clear">div>
    14. <div>收入:div>
    15. <div><input name="income" value="100000"/>div>
    16. <div class="clear">div>
    17. <div>结婚:div>
    18. <div>
    19. <input type="radio" name="isMarried" value="true" checked="checked"/>
    20. <input type="radio" name="isMarried" value="false"/>div>
    21. <div class="clear">div>
    22. <div>兴趣:div>
    23. <div>
    24. <input type="checkbox" name="interests" value="听歌" checked="checked"/>听歌
    25. <input type="checkbox" name="interests" value="书法" checked="checked"/>书法
    26. <input type="checkbox" name="interests" value="看电影" checked="checked"/>看电影
    27. div>
    28. <div class="clear">div>
    29. <div><input type="submit" value="提交表单"/>div>
    30. form>
    31. body>
    32. html>

     请求toUser接口跳转到login页面

    提交表单,ieda控制台输出

    1.7、解决乱码问题

    如果上面返回的数据存在乱码的话,那就是post请求乱码,在以往servlet学习中,直接对request对象进行设置utf-8就能解决,那么现在springMVC中如何解决这个问题呢?

    需要在web.xml中通过过滤器来进行解决

    1. <filter>
    2. <filter-name>encodingFilterfilter-name>
    3. <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    4. <init-param>
    5. <param-name>encodingparam-name>
    6. <param-value>utf-8param-value>
    7. init-param>
    8. filter>
    9. <filter-mapping>
    10. <filter-name>encodingFilterfilter-name>
    11. <url-pattern>/*url-pattern>
    12. filter-mapping>

    1.8、通用页面跳转

    我们发现上面我们写了很多次页面跳转的方法,其实我们可以抽取统一

    1. @Controller
    2. @RequestMapping("toPage")
    3. public class ToPage {
    4. @RequestMapping("{page}")
    5. public String toPage1(@PathVariable("page") String page){
    6. return page;
    7. }
    8. }

    1.9、数组类型

    1. @RequestMapping("test9")
    2. @ResponseStatus(HttpStatus.OK)
    3. public void test9(String[] addr) {
    4. for (String s : addr) {
    5. System.out.println(s);
    6. }
    7. }
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>数组title>
    5. head>
    6. <body>
    7. <form action="/user/test9.do" method="post">
    8. <input type="checkbox" name="addr" value="郑州"> 郑州 <br>
    9. <input type="checkbox" name="addr" value="上海"> 上海 <br>
    10. <input type="checkbox" name="addr" value="杭州"> 杭州 <br>
    11. <input type="checkbox" name="addr" value="北京"> 北京 <br>
    12. <input type="checkbox" name="addr" value="曹县"> 曹县 <br>
    13. <input type="submit" value="数组类型">
    14. form>
    15. body>
    16. html>

    先通过通用页面跳转接口跳转到address.jsp页面 

     

    选择上海和北京提交 

     

    1.10、绑定复杂类型

    实体类中拥有很多类型,数组、包装类、Map、List等这种复杂实体类如何接收呢?

    1. @Data
    2. public class UserVO {
    3. private String name;
    4. private Integer age;
    5. private User user;
    6. private List list;
    7. private Map map;
    8. private String[] addr;
    9. }

     控制类代码

    1. @RequestMapping("test10")
    2. @ResponseStatus(HttpStatus.OK)
    3. public void test10(UserVO userVO) {
    4. System.out.println(userVO);
    5. }

    list.jsp页面 

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Titletitle>
    5. head>
    6. <body>
    7. <form action="/user/test10.do" method="post">
    8. 姓名: <input type="text" name="name">
    9. 年龄: <input type="text" name="age"> <br/>
    10. user属性中的姓名:<input type="text" name="user.name"><br/>
    11. user属性中的年龄:<input type="text" name="user.age"> <br/>
    12. list中第一个user对象的年龄:<input type="text" name="list[0].age"> <br/>
    13. list中第一个user对象的姓名:<input type="text" name="list[0].name"> <br/>
    14. list中第二个user对象的年龄: <input type="text" name="list[1].age"> <br/>
    15. list中第二个user对象的姓名: <input type="text" name="list[1].name"> <br/>
    16. map中第一个键值对中值user对象的年龄: <input type="text" name="map['one'].age"> <br/>
    17. map中第一个键值对中值user对象的姓名: <input type="text" name="map['one'].name"> <br/>
    18. map中第二个键值对中值user对象的年龄: <input type="text" name="map['two'].age"> <br/>
    19. map中第二个键值对中值user对象的姓名: <input type="text" name="map['two'].name"><br/>
    20. 请选择喜欢的城市:
    21. <input type="checkbox" name="addr" value="郑州"> 郑州 <br>
    22. <input type="checkbox" name="addr" value="上海"> 上海 <br>
    23. <input type="checkbox" name="addr" value="杭州"> 杭州 <br>
    24. <input type="checkbox" name="addr" value="北京"> 北京 <br>
    25. <input type="checkbox" name="addr" value="曹县"> 曹县 <br>
    26. <input type="submit" value="复杂类型">
    27. form>
    28. body>
    29. html>

    1.11、jsp和jstl视图解析器

    使用jstl核心标签库需要导入依赖坐标

    1. <dependency>
    2. <groupId>javax.servletgroupId>
    3. <artifactId>jstlartifactId>
    4. <version>1.2version>
    5. dependency>
    1. @GetMapping("test11")
    2. public ModelAndView test11(ModelAndView mv) {
    3. List list=new ArrayList<>();
    4. User user = new User();
    5. user.setId(1);
    6. user.setName("张三");
    7. user.setAge(23);
    8. user.setAddress("郑州");
    9. User user1 = new User();
    10. user1.setId(2);
    11. user1.setName("李四");
    12. user1.setAge(22);
    13. user1.setAddress("上海");
    14. User user2=new User();
    15. user2.setId(3);
    16. user2.setName("王五");
    17. user2.setAge(24);
    18. user2.setAddress("杭州");
    19. list.add(user);
    20. list.add(user1);
    21. list.add(user2);
    22. mv.addObject("list",list);
    23. mv.setViewName("list2");
    24. return mv;
    25. }
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    3. <html>
    4. <head>
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <table border="1px" cellpadding="8px" cellspacing="0px" width="80%">
    9. <thead>
    10. <tr>
    11. <th>IDth>
    12. <th>Nameth>
    13. <th>Ageth>
    14. <th>Addressth>
    15. tr>
    16. thead>
    17. <tbody>
    18. <c:forEach items="${list}" var="user">
    19. <tr>
    20. <td>${user.id}td>
    21. <td>${user.name}td>
    22. <td>${user.age}td>
    23. <td>${user.address}td>
    24. tr>
    25. c:forEach>
    26. tbody>
    27. table>
    28. body>
    29. html>

    2、SpringMVC的异步交互

    在之前我们讲的请求响应都是同步的,但是在实际开发中我们都是使用异步请求,所以下面我们使用ajax发送异步请求!

    在异步请求中数据传输的格式我们都是使用josn来进行传输,速度快,小巧,使用方便!!

    在响应的同时,我们也是响应json字符串,在前端解析json字符串即可!

    2.1、回顾ajax

    1、发送ajax请求:$.ajax() / $.get() / $.post() / $.load()

    2、响应json数据:new ObjectMapper().writeValueAsString()

    我们学习完SpringMVC之后,就不用像之前那么麻烦了,还要创建ObjectMapper对象来转换成josn数据进行响应。

    SpringMVC已经帮我们做这些事情了。SpringMVC提供了两个注解@RequestBody和@ResponseBody实现josn数据的转换

    2.2、@ResponseBody

    用于将controller方法返回的对象通过转换器转换为指定的格式(通常为json)之后,写入到response对象的响应体中。

    把js文件放到webapp包下的js文件夹中,下面链接即为jquery-3.4.1的文件

    链接:https://pan.baidu.com/s/1IFfhWAQs023LK-_9eu0tPw 
    提取码:ppdf 

    创建一个html页面,发送ajax异步请求,请求控制类获取数据 

    1. <html>
    2. <head>
    3. <title>Titletitle>
    4. head>
    5. <body>
    6. <table border="1" id="table" cellspacing="0px" cellpadding="20px">
    7. <tr>
    8. <td>nametd>
    9. <td>agetd>
    10. tr>
    11. table>
    12. body>
    13. <script src="js/jquery-3.4.1.js">script>
    14. <script>
    15. $.ajax({
    16. url: 'user/ajaxResponse.do',
    17. type: 'post',
    18. dataType: 'json',
    19. success: function (data) {
    20. var str = '';
    21. $(data).each(function (i) {
    22. str += `
    23. ${data.name}
    24. ${data.age}
    25. `;
    26. });
    27. $("#table").append(str);
    28. }
    29. })
    30. script>
    31. html>

    控制类 

    1. @PostMapping("ajaxResponse")
    2. @ResponseBody
    3. public User ajaxTest(){
    4. User user = new User();
    5. user.setName("jack");
    6. user.setAge(99);
    7. return user;
    8. }

    2.3、@RequestBody

    用于接收前端请求体中的json数据,使用@RequestBody注解就可以自动的封装指定的对象中

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="js/jquery-3.4.1.js">script>
    7. head>
    8. <body>
    9. <script>
    10. $(function () {
    11. $.ajax({
    12. url: '/user/ajaxRequest.do',
    13. type: 'POST',
    14. data: '{"name":"jack","age":99}',
    15. contentType:'application/json;charset=utf-8',
    16. success: function (data) {
    17. }
    18. });
    19. });
    20. script>
    21. body>
    22. html>
    1. /**
    2. * 接受json串
    3. * @param user
    4. */
    5. @PostMapping("ajaxRequest")
    6. public void test(@RequestBody User user){
    7. //User(name=jack, age=99)
    8. System.out.println(user);
    9. }

    3、处理静态资源

    3.1、测试前端代码

    SpringMVC在默认情况下,所有的静态资源都会被拦截(js,css。html,图片、视频、音频),在web.xml文件中,我们配置的拦截路径是/ 这种形式除了jsp都会被拦截。

    1. <servlet-mapping>
    2. <servlet-name>springmvcservlet-name>
    3. <url-pattern>/url-pattern>
    4. servlet-mapping>

    把拦截路径设置为 / 时,会发现连html静态页面都无法访问  

    对于静态资源,需要手动配置静态资源过滤。有三种形式可以选择:

    3.2、web.xml配置方式(三种解决方式之一)

    1. <servlet-mapping>
    2. <servlet-name>springmvcservlet-name>
    3. <url-pattern>/url-pattern>
    4. servlet-mapping>
    5. <servlet-mapping>
    6. <servlet-name>defaultservlet-name>
    7. <url-pattern>*.jpgurl-pattern>
    8. servlet-mapping>
    9. <servlet-mapping>
    10. <servlet-name>defaultservlet-name>
    11. <url-pattern>*.jsurl-pattern>
    12. servlet-mapping>
    13. <servlet-mapping>
    14. <servlet-name>defaultservlet-name>
    15. <url-pattern>*.cssurl-pattern>
    16. servlet-mapping>
    17. <servlet-mapping>
    18. <servlet-name>defaultservlet-name>
    19. <url-pattern>*.htmlurl-pattern>
    20. servlet-mapping>

    3.3、springmvc-servlet.xml配置文件(三种解决方式之一)

    1. <mvc:resources mapping="/html/**" location="/html/"/>
    2. <mvc:resources mapping="/img/**" location="/img/" />
    3. <mvc:resources mapping="/js/**" location="/js/" />
    4. <mvc:resources mapping="/css/**" location="/css/"/>

    3.4、springmvc-servlet.xml配置文件简化方式(三种解决方式之一)

    1. <mvc:default-servlet-handler/>

    4、SpringMVC拦截器

    4.1、拦截器概述

    SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。

    preHandle执行目标方法之前进行拦截; true 放行 false 拦截不放行
    postHandle在目标方法执行之后,进行增强
    afterCompletion在视图渲染完毕后,进行资源释放

    4.2、拦截器的实现

    自定义拦截器:使用自定义拦截器,SpringMVC提供了 HandlerInterceptor 接口。我们重写 preHandlepostHandleafterCompletion 这三个方法!

    创建一个interceptor包,在包中创建一个类去实现拦截器接口HandlerInterceptor

    1. public class MyInterceptor implements HandlerInterceptor {
    2. //方法执行之前进行拦截
    3. @Override
    4. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    5. System.out.println("执行方法前进行拦截1111111111");
    6. //放行
    7. return true;
    8. }
    9. //方法执行之后,进行增强
    10. @Override
    11. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    12. System.out.println("目标方法执行之后,进行增强1111111111");
    13. }
    14. //视图渲染完毕后,进行资源释放
    15. @Override
    16. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    17. System.out.println("在视图渲染完毕后,进行资源释放11111111111");
    18. }
    19. }

    配置springmvc-config.xml文件 

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:mvc="http://www.springframework.org/schema/mvc"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    7. <context:component-scan base-package="cn.itssl.*"/>
    8. <mvc:annotation-driven/>
    9. <mvc:interceptors>
    10. <mvc:interceptor>
    11. <mvc:mapping path="/**"/>
    12. <bean class="cn.itssl.interceptor.MyInterceptor"/>
    13. mvc:interceptor>
    14. mvc:interceptors>
    15. <mvc:interceptors>
    16. <mvc:interceptor>
    17. <mvc:mapping path="/upload/show1.do"/>
    18. <bean class="cn.itssl.interceptor.MyInterceptor"/>
    19. mvc:interceptor>
    20. mvc:interceptors>
    21. <mvc:interceptors>
    22. <mvc:interceptor>
    23. <mvc:mapping path="/**"/>
    24. <bean class="cn.itssl.interceptor.MyInterceptor"/>
    25. mvc:interceptor>
    26. mvc:interceptors>
    27. beans>

    4.3、拦截器链

    多个拦截器,拦截同一个目标资源,形成一个链条,就是拦截器链!

    拦截方法的执行顺序:先进先出

    拦截器的执行顺序

    跟springmvc配置文件中的配置顺序有关系

    mvc:interceptor 谁先配置谁先执行!

    再创建一个类实现拦截器接口 

    1. public class MyInterceptor2 implements HandlerInterceptor {
    2. @Override
    3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    4. System.out.println("执行方法前进行拦截22222222222");
    5. return true;
    6. }
    7. @Override
    8. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    9. System.out.println("目标方法执行之后,进行增强22222222");
    10. }
    11. @Override
    12. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    13. System.out.println("在视图渲染完毕后,进行资源释放222222222");
    14. }
    15. }
    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <bean class="cn.itssl.interceptor.MyInterceptor1"/>
    5. mvc:interceptor>
    6. mvc:interceptors>
    7. <mvc:interceptors>
    8. <mvc:interceptor>
    9. <mvc:mapping path="/**"/>
    10. <bean class="cn.itssl.interceptor.MyInterceptor2"/>
    11. mvc:interceptor>
    12. mvc:interceptors>

    5、过滤器和拦截器的区别

    5.1、Filter过滤器

    1、实现Filter接口
    2、通过web.xml或注解方式完成配置
    3、重写的方法 init  doFilter   destroy
    4、过滤器过滤的是所有请求,不分controller和页面

    5.2、Interceptor拦截器

    1、实现HandlerInterceptor接口
    2、需要在springmvc核心配置文件中配置

    3、重写的方法
    preHandle  调用handler方法之前执行,true表示放行,false表示不放行
    postHandle  调用handler方法之后执行
    afterCompletion  视图渲染之后执行
    4、只拦截controller请求    

    6、RESTfull风格

    6.1、什么是RESTfull风格

    REST(英文:Representational State Transfer,简称REST,意思:表述性状态转换,描述了一个架构样式的网络系统,比如web应用)。

    Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    应用场景:前后端分离开发的架构中

    6.2、RESTfull与传统URL对比

    传统url

    请求路径处理名字 表明 是做什么操作

    请求路径时 也告 请求方式 (addUser + post) (deleteUserById + delete)

    前端后台描述
    http://localhost:8080/user/findAllUsers@RequestMapping(/user/findAllUsers) public List findAllUsers()查询所有用户
    http://localhost:8080/user/findUserById?id=1@RequestMapping(/user/findUserById) public User findUserById(int id)查询指定用户
    http://localhost:8080/user/addUser@RequestMapping(/user/addUser) public void addUser(User user)添加用户
    http://localhost:8080/user/updateUser@RequestMapping(/user/updateUser) public void updateUser(User user)修改用户
    http://localhost:8080/user/deleteUserById?id=1@RequestMapping(/user/deleteUserById) public User deleteUserById(int id)删除用户

    RESTfull风格

    Restful风格的请求是使用==“url+请求方式”(名饲+动词)==表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:

    请求方式描述
    GET用于获取资源
    POST用于新建资源
    PUT用于更新资源
    DELETE用于删除资源
    前端后台描述
    http://localhost:8080/user/@RequestMapping(/user,method=GET) public List findAllUsers()GET查询所有用户
    http://localhost:8080/user/1@RequestMapping(/user/{id},method=GET) public User findUserById(@PathVariable int id)GET查询id为1用户
    http://localhost:8080/user/@RequestMapping(/user,method=POST) public void addUser(User user)POST添加用户
    http://localhost:8080/user/1@RequestMapping(/user/{id},method=PUT) public void updateUser(@PathVariable int id)PUT修改id为1用户
    http://localhost:8080/user/1@RequestMapping(/user/{id},method=DELETE) public User deleteUserById(@PathVariable int id)DELETE删除id为1的用户

    上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。RequestMapping中/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。

    1. @RequestMapping("user")
    2. @RestController // @Controller + @ResponseBody
    3. public class RestFulController {
    4. /**
    5. * 查询所有 get
    6. */
    7. @GetMapping("users")
    8. public String findAll(){
    9. return "查询所有";
    10. }
    11. /**
    12. * 指定查询 get
    13. * @param id
    14. * @return
    15. */
    16. @GetMapping("users/{id}")
    17. public String findUserByid(@PathVariable Integer id){
    18. return "根据id进行查询,id为:"+id;
    19. }
    20. /**
    21. * 添加用户 post
    22. * @return
    23. */
    24. @PostMapping("users")
    25. public String addUser(){
    26. return "添加用户";
    27. }
    28. /**
    29. * 修改用户 put
    30. * @return
    31. */
    32. @PutMapping("users/{id}")
    33. public String updateUser(@PathVariable Integer id){
    34. return "修改用户,id为:"+id;
    35. }
    36. /**
    37. * 删除用户 delete
    38. */
    39. @DeleteMapping("users/{id}")
    40. public String deleteUserById(@PathVariable("id") Integer id){
    41. return "删除用户,id为:"+id;
    42. }
    43. }
  • 相关阅读:
    Jenkins 脚本命令行应用总结
    2022年金砖国家职业技能大赛(决赛)网络空间安全赛项 | 浙江赛区选拔赛 任务书
    LeetCode每日一题(1599. Maximum Profit of Operating a Centennial Wheel)
    解答嵌入式和单片机的关系
    鹅厂提速智能车,定位Tier C,把游戏技术也给用上了
    思考的技术- 读书笔记
    css 渐变下划线实现 移入移出 动画
    【亲测有效】3步实现 微信小程序内接入小程序客服,网页端客服工具与移动端小程序客服工具使用方法,使用入口,并设置当前客服状态
    探索DeFi元宇宙:NFT、Web3和DAPP的数藏Swap合约应用开发
    Qt5开发从入门到精通——第五篇五节( 文本编辑器 Easy Word 开发 V1.4详解 )
  • 原文地址:https://blog.csdn.net/select_myname/article/details/127567927