SpringMVC | SpringMVC中的 “JSON数据交互“ 和 “RESTful设计风格“

目录:

    • 一、JSON 数据交互
      • 1.1 JSON概述
      • 1.2 JSON的“数据结构”
        • 对象结构
        • 数组结构
      • 1.3 JSON的“数据转换”
        • 用 \<mvc:annotation-driven/>的方式 来“自动配置” MappingJackson2HttpMessageConverter转换器 (来完成JSON数据转换)
        • 用\<bean>标签方式的来“自行配置” JSON转换器配置MappingJackson2HttpMessageConverter转换器 (来完成JSON数据转换)
      • 1.4 配置静态资源访问的方式 (对静态资源放行) (有三种方式)
        • \<mvc:default-servlet-handler>标签 (对静态资源放行)
        • 使用激活Tomcat默认的Servlet (对静态资源放行)
    • 二、RESTful支持
      • 2.1 RESTful设计风格

在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


SpringMVC数据绑定 的过程中,需要对 传递数据格式类型 进行 转换 ,它 既可以转换String 类型数据,也能够 转换 JSON其他类型数据

一、JSON 数据交互

JSON 是近几年才流行的一种新的数据格式,它与 XML 非常相似,都是用于存储数据;但 JSON 相对于 XML来说解析速度更快占用空间更小。因此在实际开发中,使用JSON 格式的数据进行前后台的数据交互是很常见的。

1.1 JSON概述

  • JSON ( JavaScript Object NotationJS对象标记 ) 是一种 轻量级数据交换格式。它是 基于 JavaScript 的一个 子集 ( JSONJavaScript子集 ),使用了 CC++C#JavaJavaScriptPerlPython 等其他语言的约定,采用 完全独立编程语言文本格式存储和表示数据。这些特性使 JSON 成为理想的数据交互语言,它易于阅读和编写,同时也易于机器解析和生成

  • XML 一样,JSON 也是基于纯文本数据格式。可以使用 JSON 传输一个简单的StringNumberBoolean,也可以传输一个数组或者一个复杂的 Object 对象

1.2 JSON的“数据结构”

  • JSON 有如下 两种数据结构

    ①对象结构 ②数组结构

对象结构
  • 对象结构{ 开始,以 } 结束中间部分0个或多个英文逗号 “,” 分隔的 name/value对 构成,namevalue 之间以英文冒号 “:” 分隔。 (以 { }开始结束,中间由0个多个 name:value,name:value 对构成,name 和value之间用 : 分隔

    例子如
    {“id”:111,“name”:“张三”} ,这个就是 JSON的“数据结构中的对象结构。(name必须String类型,value不限制一定得String类型。)

  • JSON “对象结构” 的“存储形式下图所示 :
    在这里插入图片描述

  • JSON “对象结构”语法结构代码如下 :

    {key1:value1,key2:value2,...
    }
    ps : key必须为String类型,value不一定得是String类型
    

    其中关键字 (key )必须String 类型,值( value )可以是 StringNumberObjectArray等数据类型。例如,一个address 对象包含城市街道邮编等信息,使用JSON表示形式如下

    { "city":"beijing","street":"Xisanqi","postcode":10096}
    
数组结构
  • 数组结构“[ 开始,以 “]” 结束中间部分0个或多个英文逗号 “,” 分隔的列表组成。
    value 值
    之间用英文逗号 , 进行 分隔

  • JSON “数组结构” 的“存储形式下图所示 :
    在这里插入图片描述

  • JSON “数组结构”语法结构代码如下 :

    [value1,value2,...
    ]
    ps1 : value可以是Spring、Number、Boolean、null等数据类型
    ps2 : value之间用英文逗号, 进行分隔
    

    value 可以是SpringNumberBooleannull数据类型,例如 :

    ["abc",123,flase,null]
    
  • 上述 两种 数据结构 ( 对象结构数组结构 )也可以分别组合构成更为复杂的数据结构例如 : 一个
    person对象包含 namehobbyaddress 对象 ,其代码表现形式如下 :
    (要实现这个例子中的
    JSON数据表示
    ,要用到数据结构中的 对象结构” 和 “数组结构两种数据结构

    //“对象结构”中嵌套了“数组结构” 和 “对象结构”
    {"name":"张三","hobby":["唱","跳","rap"],"address":{"city":"Beijing,"street","Xisanqi","postcode":10096}
    }
    

    需要注意的是,如果使用 JSON存储单个数据 (如 “abc”),一定要使用 数组结构的形式,不要使用 对象结构,因为 对象结构 必须是“ 名称:值”的形式。

1.3 JSON的“数据转换”

  • 为了实现浏览器控制器类(Controller) 之间的数据交互Spring 提供了一个 HttpMessageConverter<T>接口完成此项工作接口主要用于将请求信息中的数据 “转换”为一个类型为 T 对象,并将类型为T对象绑定请求方法参数 中,或者将 对象 转换为 响应信息 传递给 浏览器显示

  • SpringHttpMessageConverter<T>接口提供了很多实现类,这些实现类可以对不同类型数据进行信息转换。其中 MappingJackson2HttpMessageConverter 是SpringMVC 默认处理JSON 格式请求响应实现类。该实现类利用 Jackson 开源包读写 JSON 数据,将Java对象转换为JSON对象XML 文档,同时也可以将JSON 对象XML文档转换为 Java对象

  • 要使用MappingJackson2HttpMessageConverter对数据进行转换
    (可通过 <mvc:annotation-driven/>自动配置 : MappingJackson2HttpMessageConverter转换器 )
    通过该转换器来将后端的对象类型的返回值
    转换JSON格式数据响应前端

JSON数据转换 要使用Jackson开源包 ( 需要JAR ) :
jackson-annotations.jar : JSON转换注解包
jackson-core.jar : JSON转换核心包
jackson-databind.jar : JSON 转换数据绑定包

JSON数据转换中的Jackson所需JAR (百度网盘)

也可通过 “http://mvnrepository.com/artifact/com.fasterxml.jackson.core” 地址自行下载JAR

  • 在使用 注解式开发时,需要用到两个重要的 JSON 格式转换注解,分别为@RequestBody@ResponseBody,两个与“JSON格式转换”有关的注解描述如下
注解说明
@RequestBody用于将 请求体 中的 数据绑定方法形参 中。该注解 用在方法形参 上。该注解用在 方法的形参上。

前端传来JSON类型参数转换User类型赋值入指定的形参
(该注解作用并不局限为JSON数据转换服务本质
将请求体中的数据绑定方法的形参中
,但简单类型参数绑定不一定用到该注解复杂参数绑定考虑用该注解
@ResponseBody用于 直接返回return 对象。该注解用在 方法 上。
方法的“返回值 自动转换指定的格式后响应给"前端"
ps :
① 如果方法返回值 是一个 字符串,那么这个字符串直接写入响应体中
② 如果 返回值 是一个 对象,SpringMVC会 默认使用MappingJackson2HttpMessageConverter(在Spring 4.x版本后)将 对象 转换为 JSON格式的字符串,然后写入响应体中(响应给前端)。
用 <mvc:annotation-driven/>的方式 来“自动配置” MappingJackson2HttpMessageConverter转换器 (来完成JSON数据转换)

<mvc:annotation-driven/>自动配置MappingJackson2HttpMessageConverter转换器 来完成 JSON数据转换 例子如 :前端传递JSON数据后端后端响应JSON格式数据给“前端) :

第一步导入依赖

JSON交互中的所需的各种JAR)

第二步编写JSON数据交互各种文件

JSON数据交互 的“项目结构” :
在这里插入图片描述

web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--  配置DispatcherServlet : 前端控制器,负责url的拦截和分发  --><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--    配置springmvc-config.xml 配置文件的位置 (上下文配置位置)   --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-config.xml</param-value></init-param><!--    配置服务器启动时加载此配置文件,加载此Servlet  --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><!--  拦截/接收所有请求  --><!--此处的/会将页面中引入的静态文件(如.js文件)也进行拦截,拦截后页面就找不到这些“静态资源”了,会导致报错。此时可在springmvc-config.xml中通过 <mvc:resources mapping="" location=""/> 标签来对“静态资源”放行--><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

springmvc-config.xml :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--  组件扫描,根包扫描 : 让注解生效  --><context:component-scan base-package="com.myh.controller"/><!--  配置视图解析器  --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><!--  注解驱动 :
作用1 : 用于启用"注解驱动"的"控制器方法",同时让注解生效。(一般而言,用到"控制器类"或"控制器方法" 就要配置"注解驱动")
作用2 : 会注册RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter这两个bean
作用3 : 对“读写XML”和“读写JSON”的支持 (所以此处的JSON数据交互要在springmvc-config.xml中用此注解)
作用4 : <mvc:annotation-driven/>注解会会自动配置一些常用的消息转换器(Message Converters),其中就包括处理JSON数据的`MappingJackson2HttpMessageConverter`(所以进行JSON数据交互时要导入该标签: 注解驱动)--><mvc:annotation-driven/><!--  放行静态资源,让前端能直接访问“静态资源”  --><mvc:resources mapping="/js/" location="/js/**"/></beans>

在上述springmvc-config.xml文件中,不仅配置了组件扫描器 (进行根包扫描)视图解析器,还配置了Spring MvC的注解驱动mvc:annotation-drivern/静态资源访问映射<mvc:resources …>,其中、<mvc:annotation-drivern/>配置会自动注册 RequestMappingHandlerMappingRequestMappingHandlerAdapter两个Bean,并提供 对读写XML读写JSON 等功能支持
(所以此处要配置该内容,因为此处为JSON的数据交互
<mvc:resources… />元素用于配置静态资源访问路径,由于在 web.xml 中配置的 “/”将页面中引入 ( 如.js )的静态文件也进行拦截,而拦截后页面中将找不到这些静态资源文件,这样就会引起页面报错。而增加了静态资源访问映射配置后,程序会自动地去配置路径下找静态的内容

<mvc:resources …> 中有两个重要属性locationmapping两个属性说明如下 :

属性说明
location用于 定位需要访问本地静态资源文件路径具体到某个文件夹
mapping匹配静态资源全路径,其中 “/**” 表示 文件夹其子文件夹某个具体文件

User.java :

package com.myh.po;public class User {private String username;
private String password;public String getUsername() {return username;
}public void setUsername(String username) {this.username = username;
}public String getPassword() {return password;
}public void setPassword(String password) {this.password = password;
}@Override
public String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';
}
}

userController.java

package com.myh.controller;import com.myh.po.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;@Controller //把该类标记为“处理器类”,用于链接DispatcherServlet,让该类中的方法能被前端访问
public class UserController {//  @ResponseBody() : 将User对象转换为JSON格式数据响应给“前端”//该注解本质意思是 : 将方法的“返回值”自动转换为“指定的格式”,后响应给"前端"。如:如果方法的返回值是一个"字符串",那么这个字符串会直接写入响应体中;// 如果返回值是一个“对象”,Spring MVC会默认使用 MappingJackson2HttpMessageConverter(在Spring 4.x版本后)将对象转换为JSON格式的字符串,然后写入响应体中(响应给前端)@ResponseBody@RequestMapping(value = "/testJson")//@RequestBody : 将前端传来的JSON类型的参数,转换为User类型,后赋值入该User对象参数中//该注解本质意思 : 将前端传来的数据绑定到方法中的“形参”中public User testJson(@RequestBody User user) {System.out.println(user);return user; //响应一个User对象给前端(通过@ResponseBody注解会转换为JSON格式数据,后进行响应)//此时返回值为一个对象,因为用了@ResponseBody注解,所以此时会将其转换为JSON格式的字符串,后响应给前端。}
}

userController.java 中,使用注解方式定义了一个控制器类,并编写了接收响应JSON格式数据
testJson( )方法,在方法中接收并打印了接收到的JSON格式用户数据,然后响应JSON格式用户对象
方法中的 @RequestBody注解 用于将前端请求体中的JSON格式数据绑定形参user上,
@ResponseBody注解于直接返回User对象( 当返回POJO对象时,会默认转换JSON格式数据进行响应)。

index.jsp :

<%--
Created by IntelliJ IDEA.
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>测试JSON数据交互</title><%-- ${pageContext.request.contextPath} : 获取当前应用的“上下文路径” ,获取当前应用的“根URL”   --%><%--  例如,如果你的 Web 应用部署在 <http://example.com/myapp/>,那么上下文路径就是 `/myapp`。  --%><%--  导入Jquery文件  --%><script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.7.1.js"></script><script type="text/javascript">function testJson() {//获取用户输入的“用户名”和“密码”var username = $("#username").val();var password = $("#password").val();//ajax操作$.ajax({url: "${pageContext.request.contextPath}/testJson",type:"POST",// {username:username, password: password} : 为JS字面量对象,可通过JSON.stringify()方法转换为JSON字符串data : JSON.stringify({username:username, password: password}),//表示: 后端响应的“数据类型”dataType:"json",//表示前端传递给后端的数据类型 或 后端响应给前端的“数据类型”contentType: "application/json;charset=UTF-8",//回调函数success : function (data) {if (data != null) {alert("你输入的用户名为: " + data.username + ",密码为: " + data.password);}}});}</script>
</head>
<body>
<form>用户名: <label for="username"></label><input type="text" name="username" id="username"><br/>密码: <label for="password"></label><input type="password" name="password" id="password"><br/><input type="button" value="测试JSON交互2" onclick=" testJson()">
</form>
</body>
</html>

index.jsp文件中,编写了一个测试JSON交互的表单,当单击“测试JSON交互”按钮时,会执行页面中的testJson( )函数。在函数中使用了jQueryAJAX方式JSON格式用户名和密码传递到以"/testjson" 结尾的请求中

需要注意的是,在AJAX中包含了3个特别重要属性,其说明如下 :

属性说明
data前端 请求时携带数据 / 参数。当使用JSON格式时,要注意编写规范
dataType表示 后端响应数据类型
ps :
后端响应数据JSON格式时,dataType属性 此时的 必须 json
(dataType : "json"也可以省略不写页面会自动识别响应数据格式)
contentType表示 前端请求数据类型 后端响应数据类型
ps :
请求数据JSON格式 时,contentType 必须为 application/json;charset=UTF-8

配置tomcat,且启动项目成功后自动跳转index.jsp页面,填写数据后,前端将JSON格式数据传递给后端

在这里插入图片描述

后端控制台输出效果
在这里插入图片描述


从上面的控制台输出结果可以看出,编写的代码已经正确 实现了JSON数据交互,可以将 JSON格式请求数据转换为方法中的 Java对象 ,也可以将 Java对象 转换为 JSON格式响应数据

(该例子中前端传输JSON格式参数给后端,后端用 @RequestBody注解JSON格式数据绑定方法的形参中,后端返回值User对象类型,但因为使用了 @ResponseBody注解,所以此处返回值的User对象会被SpringMVC默认使用MappingJackson2HttpMessageConverter转换器 来将对象转换为JSON格式字符串后响应给前端所以可以说 JSON格式–> Java对象 , Java对象 –>JSON格式 )

ps :

例子中用的Java对象转换为JSON格式转换器为 :MappingJackson2HttpMessageConverter例子 中用的的 自动配置转换器)。

用<bean>标签方式的来“自行配置” JSON转换器配置MappingJackson2HttpMessageConverter转换器 (来完成JSON数据转换)
  • 配置JSON转换器 : MappingJackson2HttpMessageConverter时,除了常用的 <mvc:annotation-drivern /> 方式 自动配置 外,还可以使用 <bean>标签 的方式进行 自行配置

    <bean>标签 自行配置 : 配置方式如下 :

        <!--  用bean标签的方式来“自行配置”转换器 : MappingJackson2HttpMessageConverter --><!--  "处理器映射器"和"处理器适配器"必须搭配使用,以下是配置 (注解方式的“处理器映射器”/"处理器适配器")  --><!--  配置“处理器映射器”  --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/><!--  配置“处理器适配器”  --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><!--  在“处理器适配器”中配置JSON转换器(来完成JSON数据的转换)  --><property name="messageConverters"><list><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/></list></property></bean>
    

    上述配置代码可以看出,使用 <bean>标签 配置方式 配置JSON转换器 时,需要同时配置 处理器映射器处理器适配器,并且 JSON转换器配置在适配器

1.4 配置静态资源访问的方式 (对静态资源放行) (有三种方式)

  • 除了使用 <mvc:resources mapping=" " location=" "/>元素 ( 这种方式最常用 )可以实现 对静态资源的访问
    ( 对静态资源放行不拦截静态资源,还有另外 两种可以实现 “静态资源访问” 的方式 :

    使用<mvc:default-servlet-handler>标签

    使用激活Tomcat默认Servlet处理静态文件访问

    第一种方式开发中最常用,即上面的例子中的“资源放行”的方式

    ps

    第一种 : 对 静态资源放行的方式 :<mvc:resources mapping=" " location=" "/>元素
    —该方式开发最常用

<mvc:default-servlet-handler>标签 (对静态资源放行)
  • 使用 <mvc:default-servlet-handler>标签 实现对“静态资源放行 , springmvc-config.xml配置方式 如下 :

    <!--  实现对“静态资源”的访问外  / 放行静态资源,让前端能直接访问“静态资源”  --><mvc:default-servlet-handler/> 
    

    springmve-config.xml中配置 <mvc:default-servlet-handler> 后,会在 Spring MVC 上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler (即默认Servlet请求处理器)。它会像一个检查员,对进入DispatcherServletURL进行筛查。如果发现是 静态资源请求,就将该请求转由Web服务器默认Servlet 处理默认Servlet就会对这些静态资源放行;如果不是静态资源请求,才由DispatcherServlet继续处理。


    注意点

    一般 Web服务器默认Servlet名称"default",因此DefaultServletHttpRequestHandler 可以找到它。如果使用的Web应用服务器默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定,具体方式如下 :

      <mvc:default-servlet-handler default-servlet-name="Servlet名称"/>
    

    Web服务器Servlet名称 是由使用的服务器确定的常用服务器其Servlet名称如下 :
    Tomcat
    JettyJBossand GlassFish 默认Servlet的名称 :default
    Google App Engine默认Servlet的名称: _ah_default
    Resin默认Servlet名称resin-file
    WebLogic默认Servlet的名称 : FileServlet
    WebSphere默认Servlet的名称 : SimpleFileServlet

使用激活Tomcat默认的Servlet (对静态资源放行)
  • 使用 激活Tomcat默认Servlet 来处理 静态文件访问 ,激活Tomcat默认Servlet时,需要在web.xml添加以下内容

        <!--  激活Tomcat默认的Servlet来处理静态文件访问 (来对静态资源放行)  --><!--  激活Tomcat的静态资源拦截,需要哪些“静态资源”,再往下追加  --><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.js</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.css</url-pattern></servlet-mapping>...
    

    上述代码中,配置了 <servlet-mapping>元素来激活Tomcat 默认Servlet 来处理静态文件,我们还可以根据需要继续追加<servlet-mapping>。此种配置方式上一种方式本质上是一样的,都是使用Web服务器默认Servlet处理静态资源文件访问。其中 Servelt名称 (即 <servlet-name>元素)也是 由使用的服务器确定 的,不同的服务器需要使用不同的名称

  • 以上3种静态资源访问的配置方式不同,并且各有优缺点具体如下 :
    第一种第三种配置方式 可以 选择性释放静态资源
    第二种 配置方式 配置相对简单只需要一行代码,就 可以释放所有静态资源
    第二第三种配置方式导致项目移植性较差,需要根据 具体的Web服务器更改Servlet名称
    第三种配置方式 运行 效率更高,因为服务器启动时已经加载了web.xml中的静态资源
  • 实际开发 中,更为 常用的配置 还是 第一种(即案例中的)配置方式这样就不需要考虑Web服务器的问题

二、RESTful支持

Spring MVC 除了支持JSON数据交互外还支持RESTful风格编程

2.1 RESTful设计风格

  • RESTful 也称之为REST ( Representational State Transfer : 表述性状态转移) ,可以将它理解为一种 软件架构风格设计风格,而 不是一个标准 ( RESTFUL是一种软件架构/设计风格 )。

★★★★★
简单来说,RESTful风格重要特征之一 :请求参数变成请求路径。( 意思就是说 : 当你的 URL中的参数 成为了请求路径一部分时,说明时候你使用的就是RESTful风格在进行编程 )。
★★★★★

例如,传统风格带参数URL请求 格式为:

//传统风格的带参数的URL请求以下格式,请求参数一般是“不作为”URL路径中的一部分的,但RESTful风格中的请求参数一般是“作为”URL路径中的一部分。
http://.../queryItems?id=1

而采用 RESTful风格后,其URL请求为 :
(传统风格请求参数不是请求路径的一部分,而用RESTful风格请求参数请求路径中的一部分)

//此风格为RESTful风格,请求参数1作为了URL路径中的一部分,后端通过{xxx} 和 @PathVariable()注解来获取该请求参数
http://.../items/1/*** 后端接收前端通过RESTful风格传递来的参数*/
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)//通过 {xxx} 和 @PathVariable()注解来获得URL路径上的参数public User selectUserByRestful(@PathVariable("id") String id) {.....}

上述两个请求中可以看出,RESTful风格 中的 URL将请求参数id=1变成了请求路径一部分,并且URL中的querytems也变成了items ( RESTful风格中的URL不存在动词形式路径,如queryltems表示查询订单,是一个动词,而 items表示订单,为名词)。

  • RESTful风格HTTP请求中,使用putdeletepostget方式分别对应添加删除修改查询的操作。不过目前国内开发(更多) 还是只使用postget方式来进行增删改查操作

  • 例子如 : (用户信息查询) :

本案例将采用 RESTful风格请求实现对用户信息查询,同时 返回JSON格式数据

restful.jsp :

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>RESTful测试</title><script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.7.1.js"></script><script type="text/javascript">function search() {//获取输入的查询编号var id = $("#number").val();$.ajax({//该url中传递的参数不直接接在url后面,后端则通过@PathVirable()注解来获得该参数url: "${pageContext.request.contextPath}/user/" + id,type:"GET",//定义回调响应的数据格式为JSON字符串dataType:"json", //后端响应的类型是 :josn//回调函数success : function (data) {if (data.username != null) {alert("你查询的用户是: " + data.username);} else {alert("没有找到id为:" + id + "的用户!");}}});}</script>
</head>
<body>
<form>编号: <input type="text" name="number" id="number"><input type="button" value="搜索" onclick="search()">
</form>
</body>
</html>

UserController.java :

package com.myh.controller;import com.myh.po.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller //把该类标记为“处理器类”,用于链接DispatcherServlet,让该类中的方法能被前端访问
public class UserController {/*** 前端通过RESTful风格来进行参数的传递* (接收RESTful风格的请求,其接收方式为GET)** RESTful风格 的体现之一: “请求参数”作为了URL中的“一部分”*/@ResponseBody //该注解的作用: 将“返回值”自动转换为“指定格式的数据”,响应给前端。(返回对象类型时,会将对象转换为JSON格式字符串来响应给前端)@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)//通过 {xxx} 和 @PathVariable()注解来获得URL路径上的参数public User selectUserByRestful(@PathVariable("id") String id) {System.out.println(id);User user = new User();//模拟根据id查询出用户对象数据if (id.equals("1234")) {user.setUsername("zhangsan");}//返回JSON格式的数据return user;}
}

上述代码中value = "/user/{id}"表示可以匹配 以/user/{id}结尾请求id请求中动态参数 (前端可用RESTful风格来设置该动态参数)。method=RequestMethod.GET表示只接收GET方式的请求。 方法中的 @PathVariable("id”)注解 则用于接收并绑定请求参数,它可以 将请求URL 中的 变量映射
方法的形参 上,如果请求路径为“user/{id}",即 请求参数中的 id方法形参名称id 一样,则
@PathVariable后面的“(“id”)” 可以省略


在这里插入图片描述


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软考】生成树

目录 1. 概念2. 图解3. 例题3.1 例题1 1. 概念 1.对于有n个顶点的连通图&#xff0c;至少有n-1条边&#xff0c;而生成树中恰好有n-1条边2.连通图的生成树是该图的极小连通子图3.若在图的生成树中任意加一条边&#xff0c;则必然形成回路4.图的生成树不是唯一的5.从不同的顶点…

如何在Linux系统部署Dupal CMS结合内网穿透实现无公网IP访问web界面

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&a…

【OpenCV C++Python】(五)图像平滑(模糊)

文章目录 图像平滑均值滤波高斯滤波中值滤波双边滤波(Bilateral Filtering ) PythonC 图像线性平滑空间滤波&#xff08;加权均值滤波器&#xff0c;几何均值滤波&#xff0c;谐波均值滤波&#xff0c;逆谐波均值滤波&#xff09;&#xff0c;非线性平滑空间滤波&#xff08;中…

Linux下QT界面小程序开发

背景&#xff1a;需要在linux不同环境下可以测试我们的读卡器设备 搭建本地linux开发环境&#xff08;本来想VS里开发然后通过SSH的方式在linux下编译&#xff0c;但是工具链一直没搞起来&#xff0c;所以我是在ubuntu里安装的QT Creator工具直接开发的&#xff09;&#xff1b…

ARMday6作业

1&#xff0c;串口字符串收发现象实现图 2.串口控制灯亮灭 main.c #include "uart4.h"//封装延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}} }int strcmp(char *a1,char *a2) {int i0;while(a1[i]a2[i]){if(a1[i]\0){break;} i;}…

C# 主窗体中显示子窗体(MDI)

1.示例代码&#xff0c;假如主窗体为MainForm,有三个子窗体分别是&#xff1a;Form1&#xff0c;Form2&#xff0c;Form3 public partial class MainForm : Form {public MainForm(){InitializeComponent();}Form1 form1 new Form1(); //子窗体1Form2 form2 new Form2(); //…

【地图】腾讯地图 - InfoWindow 自定义信息窗口内容时,内容 html 嵌套混乱问题

目录 需求描述问题问题代码页面展示 解决原因解决办法解决代码页面展示 代码汇总注 需求描述 腾讯地图上画点位&#xff0c;点击点位展示弹框信息 问题 问题代码 // 打开弹框 openInfoWindow(position, content) {this.infoWindow new TMap.InfoWindow({map: this.map,posit…

windowsVMware虚拟机中扩展linux磁盘空间

1.虚拟磁盘扩容 VM中&#xff0c;关闭linux虚拟机&#xff0c;直接编辑虚拟机-硬盘-扩展磁盘容量 2.通过Gparted工具进行LINUX系统磁盘分区 未分区挂载前可以看到/挂载点下空间为20G&#xff1a; 通过虚拟机-快照-拍摄快照&#xff0c;操作前可拍摄快照&#xff08;便于恢复之前…

FPGA高速接口的学习途径,全套课程

​FPGA高速接口有哪些学习途径&#xff0c;这里不得不提下我们宸极教育FPGA课程&#xff0c; FPGA课程5.0 版&#xff1a;Xilinx体系高速接口项目实操&#xff0c;全新升级&#xff0c;课程完全根据企业招聘要求&#xff0c;项目实操设置&#xff0c;适应目前市场的求职招聘要…

FastJson序列化隐藏特性

针对训练模型控制台的web后端维护&#xff0c;新增了一个int类型的maxTokenLimit字段&#xff0c;表示调用GPT模型请求允许的TokenSize上限值。后端添加好之后&#xff0c;数据库里面这个字段项没有填充数值&#xff0c;默认是空&#xff0c;所以理论上当maxTokenLimit字段为空…

半加器___

1.原理 2.代码 2.1 half_adder.v module half_adder (input wire in_1 ,input wire in_2 ,output wire sum ,output wire count );assign {count,sum}in_1in_2;endmodule 2.2 tb_half_adder.v timescale 1ns/1nsmodule tb_half_adder();reg in_1; reg in_2;wire su…

ThreaTrace复现记录

1. 环境配置 服务器环境 需要10.2的cuda版本 conda环境 包的版本&#xff1a; python 3.6.13 pytorch 1.9.1 torch-cluster 1.5.9 torch-scatter 2.0.9 torch-sparse 0.6.12 torch-spline-conv 1.2.1 torch-geometric 1.4.3 环境bug 这里环境搭建好以后&#xff0c;就可以正…

MySql实战--深入浅出索引(下)

在开始这篇文章之前&#xff0c;我们先来看一下这个问题&#xff1a; 在下面这个表T中&#xff0c;如果我执行 select * from T where k between 3 and 5&#xff0c;需要执行几次树的搜索操作&#xff0c;会扫描多少行&#xff1f; 下面是这个表的初始化语句。 图1 InnoDB的索…

【IEEE】Multimodal Machine Learning: A Survey and Taxonomy

不废话&#xff0c;先上思维导图&#xff0c;哈哈哈&#xff01; 论文题目Machine Learning: A Survey and Taxonomy作者Tadas Baltrusaitis , Chaitanya Ahuja , and Louis-Philippe Morency状态已读完会议或者期刊名称IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE IN…

【创建进程】fork函数与写时拷贝

文章目录 fork函数fork如何返回两个值&#xff08;fork的工作原理&#xff09;如何解释父子进程相互输出printf 写时拷贝 fork函数 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 fork函…

Linux - 应用层HTTPS、传输层TCP/IP模型中典型协议解析

目录 应用层&#xff1a;自定制协议实例 HTTP协议首行头部空行正文http服务器的搭建 HTTPS协议 传输层UDP协议TCP协议 应用层&#xff1a; 应用层负责应用程序之间的沟通—程序员自己定义数据的组织格式 应用层协议&#xff1a;如何将多个数据对象组织成为一个二进制数据串进行…

ES集群部署指引

文章目录 引言I 清除last_run_metadata_path数据。II 配置IP2.1 CentOS系统的IP参数2.2 shell脚本-静态网络配置III 公司工作电脑的IP多号段配置3.1 Mac电脑3.2 windows系统see alsomac Rootlees 内核保护措施引言 申请两台Linux机器,存储1年的航迹数据,需要4T的存储空间。 E…

【算法刷题 | 二叉树 03】3.22 二叉树的层序遍历02(5题:在每个树行中找最大值,填充每个节点的下一个右侧节点指针,二叉树的最大深度,最小深度)

文章目录 5.6 515_在每个树行中找最大值5.6.1问题5.6.2解法&#xff1a;层序遍历 5.7 116_填充每个节点的下一个右侧节点指针5.7.1问题5.7.2解法&#xff1a;层序遍历 5.8 116_填充每个节点的下一个右侧节点指针||5.8.1问题5.8.2解法&#xff1a;层序遍历 5.9 104_二叉树的最大…

Transformer的前世今生 day02(神经网络语言模型、词向量)

神经网络语言模型 使用神经网络的方法&#xff0c;去完成语言模型的两个问题&#xff0c;下图为两层感知机的神经网络语言模型&#xff1a; 假设词典V内有五个词&#xff1a;“判断”、“这个”、“词”、“的”、“词性”&#xff0c;且要输出P(w_next | “判断”、“这个”、…

揭秘最热门AI写作软件,看看有哪些值得推荐的AI写作神器

在快节奏的现代生活中&#xff0c;我们常常面临各种压力&#xff0c;例如工作、学习等。因此&#xff0c;一款能够提高写作效率的工具变得尤为重要。那么&#xff0c;有没有什么AI写作软件是比较好用的呢&#xff1f;下面小编给大家推荐几款热门的写作软件。 一.爱制作AI写作 …