SpringMVC ——(1)

1.SpringMVC请求流程

1.1 SpringMVC请求处理流程分析

Spring MVC框架也是⼀个基于请求驱动的Web框架,并且使⽤了前端控制器模式(是⽤来提供⼀个集中的请求处理机制,所有的请求都将由⼀个单⼀的处理程序处理来进⾏设计,再根据请求映射规则分发给相应的⻚⾯控制器(动作/处理器)进⾏处理。⾸先让我们整体看⼀下Spring MVC处理请求的流程:

1.⾸先⽤户发送请求,请求被SpringMvc前端控制器(DispatherServlet)捕获;

2.前端控制器(DispatherServlet)对请求URL解析获取请求URI,根据URI, 调⽤HandlerMapping;

3.前端控制器(DispatherServlet)获得返回的HandlerExecutionChain(包括Handler对象以及Handler对象对应的拦截器);

4.DispatcherServlet 根据获得的HandlerExecutionChain,选择⼀个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter 后,此时将开始执⾏拦截器的preHandler(...)⽅法);

5.HandlerAdapter根据请求的Handler适配并执⾏对应的Handler;HandlerAdapter(提取Request中的模型数据,填充Handler⼊参,开 始执⾏Handler(Controller)。 在填充Handler的⼊参过程中,根据配置,Spring将做⼀些额外的工作:

HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成⼀个对象,将对象转换为指定的响应信息。

数据转换:对请求消息进⾏数据转换。如String转换成Integer、Double等数据格式化:

数据格式化。 如将字符串转换成格式化数字或格式化⽇期等

数据验证: 验证数据的有效性(⻓度、格式等),验证结果存储到BindingResult或Error中)

6.Handler执⾏完毕,返回⼀个ModelAndView(即模型和视图)给HandlerAdaptor

7.HandlerAdaptor适配器将执⾏结果ModelAndView返回给前端控制器。

8.前端控制器接收到ModelAndView后,请求对应的视图解析器。

9.视图解析器解析ModelAndView后返回对应View;

10.渲染视图并返回渲染后的视图给前端控制器。

11.最终前端控制器将渲染后的⻚⾯响应给⽤户或客户端

2.SpringMVC环境搭建

2.1开发环境

Idea + Maven + Jdk1.8 + Jetty

2.2. 新建 Maven webApp

Idea 下创建 springmvc01 ⼯程

2.3 pom.xml

  <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties>
​<dependencies><!-- spring web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.4.RELEASE</version></dependency><!-- spring mvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.4.RELEASE</version></dependency><!-- web servlet --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version></dependency></dependencies><build><finalName>SpringMVC1</finalName>
​<plugins><!-- 编译环境插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- jetty插件 --><plugin><groupId>org.eclipse.jetty</groupId><artifactId>jetty-maven-plugin</artifactId><version>9.4.27.v20200227</version><configuration><scanIntervalSeconds>10</scanIntervalSeconds><!-- 设置端⼝ --><httpConnector><port>8080</port></httpConnector><!-- 设置项⽬路径 --><webAppConfig><contextPath>/springmvc01</contextPath></webAppConfig></configuration></plugin></plugins></build>

2.4 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
​<!-- 编码过滤 utf-8 --><filter><description>char encoding filter</description><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- servlet请求分发器 --><servlet><servlet-name>springMvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:servlet-context.xml</param-value></init-param><!-- 表示启动容器时初始化该Servlet --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springMvc</servlet-name><!-- 这是拦截请求, "/"代表拦截所有请求,"*.do"拦截所有.do请求 --><!-- <url-pattern>/</url-pattern> --><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>
2.4.1 servlet-context.xml配置
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://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.xsd">
​<!-- 开启扫描器 --><context:component-scan base-package="org.example.springmvc.controller"/><!-- 使⽤默认的 Servlet 来响应静态⽂件 --><mvc:default-servlet-handler/><!-- 开启注解驱动--><mvc:annotation-driven/><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!-- 前缀:在WEB-INF⽬录下的jsp⽬录下 --><property name="prefix" value="/WEB-INF/jsp/"/><!-- 后缀:以.jsp结尾的资源 --><property name="suffix" value=".jsp"/></bean>
</beans>
2.4.2 页面控制器的编写
package org.example.springmvc.controller;
​
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
​
@Controller
public class HelloController {
​/*** 请求映射地址 /hello.do* @return*/@RequestMapping("/hello")public ModelAndView hello(){ModelAndView mv=new ModelAndView();mv.addObject("hello", "hello spring mvc");mv.setViewName("hello");return mv;}
}
2.4.3 添加视图页面

在 WEB-INF 下新建 jsp ⽂件夹 ,并在⽂件夹下新建 hello.jsp

<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%String path = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML>
<html>
<head><base href="<%=basePath %>"><title>My JSP 'hello.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page">
</head>
<body>
<!-- el表达式接收参数值 -->
${hello}
</body>
</html>
2.4.4 启动jetty服务器

2.4.5 页面结果

访问地址 http://localhost:8080/springmvc01/hello.do

3.URL地址映射配置

3.1 @RequestMapping

* URL地址映射配置
* @RequestMappping("路径")
* 注解可以声明在类级别或方法级别。如果注解设置在类级别,则表示将请求路径与控制器绑定;如果将注解设置在方法级别,则表示请求路径与方法绑定
* 1.类级别
* 2.方法级别
* 3.类级别+方法级别
*      注:如果在类上设置了@RequestMapping注解,则访问时需要将类路径当做方法路径的父路径。即 类路径/方法路径
3.1.1 映射单个URL

@RequestMapping("") 或 @RequestMapping(value="")

    /*** @RequestMapping 声明在⽅法上⾯,映射单个 URL* 访问地址:(如果有类路径需要写在⽅法路径前⾯)* http://ip:port/springmvc01/test01* @return*/@RequestMapping("/test01")
// @RequestMapping(value = "/test01")public ModelAndView test01(){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello","test01");modelAndView.setViewName("hello");return modelAndView;}/*** 路径开头是否加 斜杠"/" 均可* @RequestMapping("/请求路径") 与 @RequestMapping("请求路径")均可* 建议加上,如:@RequestMapping("/test02")* 访问地址:(如果有类路径需要写在⽅法路径前⾯)* http://ip:port/springmvc01/test02* @return*/@RequestMapping("test02")public ModelAndView test02(){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello","test02");modelAndView.setViewName("hello");return modelAndView;}
3.1.2 映射多个URL

@RequestMapping({"",""}) 或 @RequestMapping(value={"",""})

    /*** @RequestMapping 声明在⽅法上⾯,映射多个 URL* ⽀持⼀个⽅法绑定多个 url 的操作* 访问地址:(如果有类路径需要写在⽅法路径前⾯)* http://ip:port/springmvc01/test03_01* http://ip:port/springmvc01/test03_02* @return*/@RequestMapping({"/test03_01","/test03_02"})
// @RequestMapping(value = {"/test03_01","/test03_02"})public ModelAndView test03() {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello", "test03");modelAndView.setViewName("hello");return modelAndView;}
3.1.3 映射URL在控制器上
@Controller
@RequestMapping("/url")
public class UrlController {/*** @RequestMapping 声明在类上⾯,类中的的⽅法都是以该地址作为⽗路径* 声明级别:* 类级别 + ⽅法级别 (/类路径/⽅法路径)* 访问地址:* http://ip:port/springmvc01/url/test04* @return*/@RequestMapping("/test04")public ModelAndView test04(){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello","test04");modelAndView.setViewName("hello");return modelAndView;}
}
3.1.4 设置URL映射的请求方式
/*** 设置请求⽅式* 通过 method 属性设置⽅法⽀持的请求⽅式,默认 GET请求和 POST等请求都⽀持。* 设置了请求⽅式,则只能按照指定的请求⽅式请求。* 访问地址:(只能使⽤POST请求访问)* http://ip:port/springmvc01/url/test05* @return*/
@RequestMapping(value = "/test05",method = RequestMethod.POST)
public ModelAndView test05(){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello","test05");modelAndView.setViewName("hello");return modelAndView;
}
3.1.5 通过参数名称映射URL
/*** 通过参数名称访问* 通过参数的形式访问* 访问地址:* http://ip:port/springmvc01/url?test06* @return*/
@RequestMapping(params = "test06")
public ModelAndView test06(){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello","test06");modelAndView.setViewName("hello");return modelAndView;
}

4.参数绑定

4.1 基本数据类型

访问地址:http://localhost:8080/springmvc01/data01?age=18&money=500 (问号后面为参数)

/*** 基本类型数据绑定* 参数值必须存在。如果没有指定参数值,也没有设置参数默认值,则会报500异常。* @param age* @param money*/
@RequestMapping("data01")
public void data01(int age, double money){System.out.println("age:" + age + ", money:" + money);
}
/*** 基本类型数据绑定* 通过注解 @RequestParam 标记⼀个形参为请求参数。(注解声明在形参的前⾯)* 可以通过注解的属性设置相关内容* 设置参数的默认值 defaultValue* @param age* @param money*/
@RequestMapping("data02")
public void data02(@RequestParam(defaultValue = "18") int age,
@RequestParam(defaultValue = "10.0") double money){System.out.println("age:" + age + ", money:" + money);
}
​
/*** 基本类型数据绑定* 通过注解 @RequestParam 标记⼀个形参为请求参数。(注解声明在形参的前⾯)* 可以通过注解的属性设置相关内容* 设置参数的参数名(别名) name* @param age* @param money*/
@RequestMapping("data03")
public void data03(@RequestParam(defaultValue = "18", name = "userAge") int age,
@RequestParam(defaultValue = "10.0", name = "userMoney") double money){System.out.println("age:" + age + ", money:" + money);
}

4.2 包装类型

/*** 包装类型数据绑定 (如果数据是基本类型,建议使⽤包装类型)* 客户端请求参数名与⽅法形参名保持⼀致,默认参数值为null* 可以通过 @RequestParam 的name属性设置参数的别名,defaultValue属性设置参数默认值* @param age* @param money*/
@RequestMapping("data05")
public void data05(Integer age, Double money){System.out.println("age:" + age + ", money:" + money);
}

4.3 字符串类型

/*** 字符串数据绑定* 客户端请求参数名与⽅法形参名保持⼀致,默认参数值为null* 可以通过 @RequestParam 的name属性设置参数的别名,defaultValue属性设置参数默认值* @param userName* @param userPwd*/
@RequestMapping("data04")
public void data04(String userName, String userPwd){System.out.println("userName:" + userName + ", userPwd:" + userPwd);
}

4.4 数组类型

/*** 数组类型数据绑定* 客户端传参形式:ids=1&ids=2&ids=3* @param ids*/
@RequestMapping("/data06")
public void data06(String[] ids){for(String id : ids){System.out.println(id + "---");}
}

4.5 JavaBean类型

/*** JavaBean 数据绑定* 客户端请求的参数名与JavaBean对象的属性字段名保持⼀致* @param user*/
@RequestMapping("/data07")
public void data07(User user) {System.out.println(user);
}

User.java

package com.xxxx.springmvc.po;
public class User {private int id;private String userName;private String userPwd;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPwd() {return userPwd;}public void setUserPwd(String userPwd) {this.userPwd = userPwd;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", userPwd=" + userPwd + "]";}
}

4.6 List类型

此时 User 实体需要定义对应 list 属性。(对于集合的参数绑定,⼀般需要使⽤ JavaBean 对象进⾏包装)

public class User {private int id;private String userName;private String userPwd;
​private List<Phone> phones = new ArrayList<Phone>();public List<Phone> getPhones() {return phones;}public void setPhones(List<Phone> phones) {this.phones = phones;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPwd() {return userPwd;}public void setUserPwd(String userPwd) {this.userPwd = userPwd;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", userPwd=" + userPwd + ", phones=" + phones + "]";}
}

Phone实体

public class Phone {private String num;public String getNum() {return num;}public void setNum(String num) {this.num = num;}@Overridepublic String toString() {return "Phone [num=" + num + "]";}}

Jsp ⻚⾯定义

<form action="data08" method="post"><input name="phones[0].num" value="123456" /><input name="phones[1].num" value="4576" /><button type="submit"> 提交</button>
</form>

Controller ⽅法

@RequestMapping("/data08")
public void data08(User user){System.out.println(user);
}

4.7 Set类型

Set 和 List 类似,也需要绑定在对象上,⽽不能直接写在 Controller ⽅法的参数中。但是,绑定Set数

据时,必须先在Set对象中add相应的数量的模型对象。

public class User {private int id;private String userName;private String userPwd;
​private Set<Phone> phones = new HashSet<Phone>();
​
​public User() {phones.add(new Phone());phones.add(new Phone());phones.add(new Phone());}/*public List<Phone> getPhones() {return phones;}public void setPhones(List<Phone> phones) {this.phones = phones;}*/public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPwd() {return userPwd;}public void setUserPwd(String userPwd) {this.userPwd = userPwd;}public Set<Phone> getPhones() {return phones;}public void setPhones(Set<Phone> phones) {this.phones = phones;}
}

Controller ⽅法

@RequestMapping("/data09")
public void data09(User user){System.out.println(user);
}

表单⻚⾯

<form action="data09" method="post"><input name="phones[0].num" value="123456" /><input name="phones[1].num" value="4576" /><input name="phones[2].num" value="4576" /><button type="submit"> 提交</button>
</form>

4.8 Map类型

Map最为灵活,它也需要绑定在对象上,⽽不能直接写在Controller⽅法的参数中。

public class User {private int id;private String userName;private String userPwd;
​private Set<Phone> phones=new HashSet<Phone>();
​private Map<String, Phone> map=new HashMap<String, Phone>();
​// private List<Phone> phones=new ArrayList<Phone>();
​
​public User() {phones.add(new Phone());phones.add(new Phone());phones.add(new Phone());}/*public List<Phone> getPhones() {return phones;}public void setPhones(List<Phone> phones) {this.phones = phones;}*/public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPwd() {return userPwd;}public void setUserPwd(String userPwd) {this.userPwd = userPwd;}public Set<Phone> getPhones() {return phones;}public void setPhones(Set<Phone> phones) {this.phones = phones;}public Map<String, Phone> getMap() {return map;}public void setMap(Map<String, Phone> map) {this.map = map;}
}

Controller ⽅法

@RequestMapping("/data10")
public void data10(User user){Set<Entry<String, Phone>> set = user.getMap().entrySet();for(Entry<String, Phone> entry:set){System.out.println(entry.getKey()+"--"+entry.getValue().getNum());} 
}

表单页面

<form action="data10" method="post"><input name="map['1'].num" value="123456" /><input name="map['2'].num" value="4576" /><input name="map['3'].num" value="4576" /><button type="submit"> 提交</button>
</form

5.请求转发与重定向

SpringMVC默认采⽤服务器内部转发的形式展示⻚⾯信息。同样也⽀持重定向⻚⾯。

5.1 重定向

重定向是发⼀个302的状态码给浏览器,浏览器⾃⼰去请求跳转的⽹⻚。地址栏会发⽣改变。

重定向以 redirect: 开头

/*** 重定向到JSP⻚⾯* @return*/
@RequestMapping(value="/view01")
public String view01(){return "redirect:view.jsp";
}
/*** 重定向到JSP⻚⾯* 传递参数* @return*/
@RequestMapping(value="/view02")
public String view02(){return "redirect:view.jsp?uname=zhangsan&upwd=123456";
}
/*** 重定向到JSP⻚⾯* 传递参数 (传递中⽂参数会出现乱码)* @return*/
@RequestMapping(value="/view03")
public String view03(){return "redirect:view.jsp?uname=张三&upwd=123456";
}
/*** 重定向到JSP⻚⾯* 传递参数 (通过 RedirectAttributes 对象设置重定向参数,避免中⽂乱码问题)* @param redirectAttributes* @return*/
@RequestMapping(value="/view04")
public String view04(RedirectAttributes redirectAttributes){redirectAttributes.addAttribute("uname","张三");redirectAttributes.addAttribute("upwd","123456");return "redirect:view.jsp";
}
/*** 重定向到JSP⻚⾯* 返回 ModelAndView 对象* @param modelAndView* @return*/
@RequestMapping(value="/view06")
public ModelAndView view06(ModelAndView modelAndView){modelAndView.addObject("uname","李四");modelAndView.addObject("upwd","123321");modelAndView.setViewName("redirect:view.jsp");return modelAndView;
}
/*** 重定向到Controller* 返回 ModelAndView 对象* @param modelAndView* @return*/
@RequestMapping(value="/view07")
public ModelAndView view07(ModelAndView modelAndView){modelAndView.addObject("uname","admin");modelAndView.setViewName("redirect:test01");return modelAndView;
}

⻚⾯中获取参数值

${param.参数名}

5.2 请求转发

请求转发,直接调⽤跳转的⻚⾯,让它返回。对于浏览器来说,它⽆法感觉服务器有没有forward。地址栏不发⽣改变。可以获取请求域中的数据。

请求转发以 forward: 开头

/*** 请求转发到JSP⻚⾯*/
@RequestMapping("/view08")
public String view08(){return "forward:view.jsp";
}
/*** 请求转发到JSP⻚⾯* 设置参数*/
@RequestMapping("/view09")
public String view09(){return "forward:view.jsp?uname=张三&upwd=123456";
}
​
/*** 请求转发到JSP⻚⾯* 设置请求域*/
@RequestMapping("/view10")
public String view10(Model model){model.addAttribute("uname","张三");return "forward:view.jsp";
}
/*** 请求转发到JSP⻚⾯ (默认)* 默认会去指定⽬录下找JSP⻚⾯ (配置⽂件中设置的)*/
@RequestMapping("/view11")
public String view11(){return "/../../view";
}
/*** 请求转发到 Controller* @return*/
@RequestMapping("/view12")
public ModelAndView view12(ModelAndView modelAndView){modelAndView.setViewName("forward:test01");return modelAndView;
}
/*** 请求转发到 Controller* 传递参数* @return*/
@RequestMapping("/view13")
public ModelAndView view13(ModelAndView modelAndView){modelAndView.setViewName("forward:test01?uname=admin");return modelAndView;
}

⻚⾯中获取数据

获取传递的参数:${param.参数名}
获取请求域的数据:${请求域中设置的名称}

6.JSON数据开发

6.1 基本概念

Json 在企业开发中已经作为通⽤的接⼝参数类型,在⻚⾯(客户端)解析很⽅便。SpringMVC 对于json 提供了良好的⽀持,这⾥需要修改相关配置,添加 json 数据⽀持功能。

6.1.1 @ResponseBody

该注解⽤于将 Controller 的⽅法返回的对象,通过适当的 HttpMessageConverter 转换为指定格式后,写⼊到 Response 对象的 body 数据区。

返回的数据不是 html 标签的⻚⾯,⽽是其他某种格式的数据时(如 json、xml 等)使⽤(通常⽤于ajax请求)。

6.1.2 @RequestBody

该注解⽤于读取 Request 请求的 body 部分数据,使⽤系统默认配置的 HttpMessageConverter 进⾏解析,然后把相应的数据绑定到要返回的对象上 ,再把 HttpMessageConverter 返回的对象数据绑定到controller 中⽅法的参数上。

6.2 使用配置

6.2.1 添加json相关坐标

pom.xml

<!-- 添加json 依赖jar包 -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.10.0</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.10.0</version>
</dependency> 
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.10.0</version>
</dependency>
6.2.2 修改配置⽂件

servlet-context.xml

<!-- mvc 请求映射 处理器与适配器配置 -->
<mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.StringHttpMessageConverter" /><bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /></mvc:message-converters>
</mvc:annotation-driven>
6.2.3 注解使用
6.2.3.1 @ResponseBody
@Controller
@RequestMapping("/user")
public class UserController {/*** @ResponseBody 返回的是JOSN格式的数据,返回JavaBean对象* 注解设置在⽅法体上* @return*/@RequestMapping("queryUser01")@ResponseBodypublic User queryUser01(){User user = new User();user.setId(1);user.setUserName("zhangsan");user.setUserPwd("123456");// 返回的是user对象return user;}/*** @ResponseBody 返回的是JOSN格式的数据,返回JavaBean对象* 注解设置在⽅法返回对象前,修饰符之后* @return*/@RequestMapping("queryUser02")public @ResponseBody User queryUser02(){User user = new User();user.setId(2);user.setUserName("lisi");user.setUserPwd("123321");// 返回的是user对象return user;}
​/*** @ResponseBody 返回的是JOSN格式的数据,返回集合* @return*/@RequestMapping("queryUser02")public @ResponseBody User queryUser02(){User user = new User();user.setId(2);user.setUserName("lisi");user.setUserPwd("123321");// 返回的是user对象return user;}
​/*** @ResponseBody 返回的是JOSN格式的数据,返回集合* @return*/@RequestMapping("/queryUser03")@ResponseBodypublic List<User> queryUser03(){List<User> list = new ArrayList<>();User user01 = new User();user01.setId(1);user01.setUserName("zhangsan");user01.setUserPwd("123456");User user02 = new User();user02.setId(2);user02.setUserName("lisi");user02.setUserPwd("123321");list.add(user01);list.add(user02);// 返回的是user集合return list;}
}
6.2.3.2 @RequestBody

@RequestBody 注解常⽤来处理 content-type 不是默认的 application/x-www-form-urlcoded 类型的内容,⽐如说:application/json 或者是application/xml 等。⼀般情况下来说常⽤其来处理 application/json类型。@RequestBody接受的是⼀个 json 格式的字符串,⼀定是⼀个字符串。

通过 @RequestBody 可以将请求体中的 JSON 字符串绑定到相应的 bean 上,当然,也可以将其分别绑定到对应的字符串上。

/*** @RequestBody 规定请求的参数是JOSN格式的字符串* 注解设置在形参前⾯* @param user* @return*/
@RequestMapping("/getUser")
@ResponseBody
public User getUser(@RequestBody User user){System.out.println(user);return user;
}

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

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

相关文章

#HarmonyOS篇: 学习资料

学习课堂 https://developer.huawei.com/consumer/cn/training/ https://developer.huawei.com/consumer/cn/doc/start/training-introduction-0000001181392655 华为开发者指导手册 https://developer.huawei.com/consumer/cn/doc/start/guidebook-0000001056335559 博客…

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…

python基于基于自然语言处理技术的话题文本分类

大家好我是君君学姐&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款《python基于基于自然语言处理技术的话题文本分类》毕业设计项目。项目源码以及部署相关请联系君君学姐&#xff0c;文末附上联系信息 。 &#x1f388;作者&#xff1a;君君学姐&#x1f388; …

iOS如何操作更新推送证书

最近收到一份邮件,应该如何操作呢,证书还是跟以前一样冲钥匙串直接申请吗 Hello, As we announced in October, the Certification Authority (CA) for Apple Push Notification service (APNs) is changing. APNs will update the server certificates in sandbox on January…

ShardingSphere-JDBC

1. 什么是分库分表&#xff1f; 分库分表是一种数据库扩展技术&#xff0c;通过将数据拆分到多个数据库&#xff08;分库&#xff09;或多个表&#xff08;分表&#xff09;中来解决单一数据库或表带来的性能瓶颈。分库分表可以有效提升系统的可扩展性、性能和高并发处理能力&…

Scala的正则表达式二

验证用户名是否合法 规则 1.长度在6-12之间 2.不能数字开头 3.只能包含数字&#xff0c;大小写字母&#xff0c;下划线def main(args: Array[String]): Unit {val name1 "1admin"//不合法&#xff0c;是数字开头val name2 "admin123"//合法val name3 &quo…

谈谈web3

全面解析 Web3&#xff1a;未来互联网的革命性进程 引言&#xff1a;互联网进化的三部曲 互联网的发展经历了三个重要阶段&#xff0c;每一个阶段都深刻地改变了我们的生活方式&#xff1a; Web1&#xff08;1990-2005&#xff09;&#xff1a;静态互联网时代&#xff0c;人…

mysql高级篇 | 尚硅谷 | 第11章_数据库的设计规范

十一、数据库的设计规范 文章目录 十一、数据库的设计规范一、为什么需要数据库设计二、范式1、范式简介2、范式都包括哪些3、键和相关属性的概念4、第一范式(1st NF)5、第二范式(2nd NF)6、第三范式(3rd NF)7.小结 三、反范式化1、概述2、应用举例3、反范式的新问题4、反范式的…

【汽车】-- 发动机类型

汽车发动机根据不同的分类标准可以分为多种类型。以下是常见的发动机类型及其特点&#xff0c;并列举相应的品牌和车型举例&#xff1a; 1. 按燃料类型分类 (1) 汽油发动机 特点&#xff1a;使用汽油作为燃料&#xff0c;通过火花塞点火&#xff0c;转速高&#xff0c;运转平…

自然语言处理的未来愿景

自然语言处理的未来愿景 在这个信息爆炸的时代,计算机如何理解和生成我们日常使用的语言,已经成为一个引人注目的问题。你有没有想过,为什么智能助手能理解你的指令?又或者,为什么社交媒体上的推荐引擎能够精准地推荐你喜爱的内容?这背后,正是自然语言处理(NLP)在发挥…

【蓝桥杯每日一题】砍竹子

砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi​. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…

微信小程序开发简易教程

微信小程序文件结构详解 1. 项目配置文件 project.config.json 项目的配置文件包含项目名称、appid、编译选项等配置示例&#xff1a; {"description": "项目配置文件","packOptions": {"ignore": []},"setting": {&quo…

Unix/Linux 命令行重定向操作

2>/dev/null 是一个常见的 Unix/Linux 命令行重定向操作&#xff0c;用于将标准错误&#xff08;stderr&#xff09;输出重定向到 /dev/null&#xff0c;即丢弃错误信息而不显示。理解这个表达式需要了解几个概念&#xff1a;文件描述符、重定向和特殊文件 /dev/null。 ###…

图解LinkedList底层原理

图解LinkedList底层原理 本篇将讲解Java中的一个集合LinkedList的底层实现原理&#xff0c;会查看并分析底层源码&#xff0c;结合图解的方式&#xff0c;理解其添加数据的过程 数据结构 LinkedList 是基于双向链表实现的&#xff0c;节点结构如下&#xff1a; private stati…

react antd tabs router 基础管理后台模版

在构建 React 后台管理系统时&#xff0c;使用标签页的方式展示路由是一种高效且用户友好的设计模式。这种实现方式通常允许用户在多个页面之间快速切换&#xff0c;并保留页面的状态&#xff0c;类似于浏览器的多标签页功能。 需求分析 1.动态标签页&#xff1a;根据用户的导…

【OpenCV】图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…

初次使用uniapp编译到微信小程序编辑器页面空白,真机预览有内容

uniapp微信小程序页面结构 首页页面代码 微信小程序模拟器 模拟器页面为空白时查了下&#xff0c;有几个说是“Hbuilder编译的时候应该编译出来一个app.js文件 但是却编译出了App.js”&#xff0c;但是我的小程序结构没问题&#xff0c;并且真机预览没有问题 真机调试 根据defi…

【开源】一款基于SpringBoot 的全开源充电桩平台

一、下载项目文件 下载源码项目文件口令&#xff1a;动作璆璜量子屏多好/~d1b8356ox2~:/复制口令后&#xff0c;进入夸克网盘app即可保存&#xff08;如果复制到夸克app没有跳转资源&#xff0c;可以复制粘贴口令到夸克app的搜索框也可以打开&#xff08;不用点搜索按钮&#…

Ubuntu上使用system()函数运行不需要输入密码

使用system()运行一些终端命令的时候&#xff0c;需要sudo权限&#xff0c;也就是必须输入密码&#xff0c;那么在程序自启动的时候就无法成功启动。如果设置Ubuntu下所有操作都不需要密码&#xff0c;安全性太低&#xff0c;所以我们可以将需要用到的终端指令给予无需输入密码…

【人工智能】人工智能,深度学习与人工神经网络

人工智能 人工智能一、定义与核心要素二、主要方法与技术三、应用领域四、发展前景与挑战五、分类六、研究目标与价值 深度学习定义与核心思想网络结构工作原理关键技术与模型应用领域发展与挑战 人工神经网络一、定义与原理二、基本特性三、网络结构四、工作原理五、应用领域六…