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,一经查实,立即删除!

相关文章

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; …

Scala的正则表达式二

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

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;运转平…

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

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

【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;所以我们可以将需要用到的终端指令给予无需输入密码…

国产GPU中,VLLM0.5.0发布Qwen2.5-14B-Instruct-GPTQ-Int8模型,请求返回结果乱码

概述 国产GPU: DCU Z100 推理框架&#xff1a; vllm0.5.0 docker容器化部署 运行如下代码&#xff1a; python -m vllm.entrypoints.openai.api_server --model /app/models/Qwen2.5-14B-Instruct-GPTQ-Int8 --served-model-name qwen-gptq --trust-remote-code --enforce…

WireShark速成

1.WireShark安装 官网&#xff1a; Wireshark Go Deep Kali Linux系统自带WireShark工具。 2.WireShark介绍 WireShark是一个网络包分析工具&#xff0c;该工具主要用于捕获网络数据包&#xff0c;并自动解析数据包&#xff0c;为用户显示数据包的详情信息&#xff0c;供…

算法-字符串-72.编辑距离

一、题目 二、思路解析 1.思路&#xff1a; 最少操作数——动态数组 res[i][j]:长度为i的字符串转化为长度为j字符串的最少操作 2.常用方法&#xff1a; 无 3.核心逻辑&#xff1a; 1.情况一&#xff1a;当word1为空&#xff0c;word2不为空时 for(int i0;i<size2;i){res[0…

大模型在辅导场景的深度应用,猿辅导素养课推出启发性“AI作文通”

猿辅导集团旗下的飞象星球面向学校发布“飞象AI作文”&#xff0c;让教育大模型成为老师的AI批改助手、学生的写作助手。芥末堆注意到&#xff0c;猿辅导集团旗下的猿辅导素养课也推出了名为“AI作文通”的AI作文功能&#xff0c;已于7月正式大规模上线&#xff0c;在AI教育领域…

Node.js系统模块

【图书介绍】《Node.jsMongoDBVue.js全栈开发实战》-CSDN博客 《Node.jsMongoDBVue.js全栈开发实战&#xff08;Web前端技术丛书&#xff09;》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com) 2.2.1 什么是系统模块 由于Node.js运行环境提供的API都是以模块化的方式进行开…

路由封装,连接导航router-link

路由的封装抽离&#xff1a; 所有路由配置堆在main.js中不合适&#xff0c;需将路由模块抽离出来&#xff0c;以便维护 将与路由相关信息提取到src文件夹下的router文件夹下的index.js文件中 在main.js中就只需要导入当前路由&#xff0c;并且注入到当前实例中&#xff0c;其他…

工业4.0下的IT网络与OT网络

https://zhuanlan.zhihu.com/p/498984722 随着“中国制造2025”的深入推进&#xff0c;制药行业以手工为主的传统生产方式正在被以“工业4.0 ”为核心的自动化生产方式逐步替代。 为了实现生产自动化&#xff0c;很多制药企业都引入了由PLC&#xff08;可编程逻辑控制器 &am…

Ubuntu压缩打包解压

ubuntu压缩打包 上图&#xff0c;压缩当前目录svn 为svn.tar.gaz&#xff0c;解压后再当前解压目录生成svn文件 在Ubuntu中&#xff0c;你可以使用tar命令来创建一个压缩包&#xff0c;或者使用zip命令来创建一个.zip压缩文件。以下是两种常见的压缩方法&#xff1a; 下图&am…

Master EDI 项目需求分析

Master Electronics 通过其全球分销网络&#xff0c;支持多种采购需求&#xff0c;确保能够为客户提供可靠的元件供应链解决方案&#xff0c;同时为快速高效的与全球伙伴建立合作&#xff0c;Master 选择通过EDI来实现与交易伙伴间的数据传输。 EDI为交易伙伴之间建立了一个安…

人脸识别之Python的人工智能研究(附学习资源)

1. 引言&#xff1a;人脸识别的意义与挑战 人脸识别技术已经在多个领域得到了广泛应用&#xff0c;包括手机解锁、公共安全监控、社交媒体、人机交互等。这项技术的普及不仅提高了生活的便利性&#xff0c;也为社会安全提供了有效的支持。然而&#xff0c;随着人脸识别技术的不…