Spring5框架之SpringMVC

ops/2025/1/12 1:54:54/

目录

1.SpringMVC的入门案例

1.1 通过maven构建一个web项目

1.2 添加对应的依赖及Tomcat插件

1.3 创建SpringMVC的配置文件

1.4 在web.xml中注册DispatchServlet

1.5 创建自定义的Controller

1.6 在Springmvc配置文件中注册

原理分析:

2.SpringMVC基于注解的使用方式

2.1 SpringMVC配置文件修改

2.2 自定义控制器

2.3 测试

3.SpringMVC工作原理图解

4.SpringMVC中响应请求

4.1 响应返回字符串

4.2 不响应

4.3 直接返回一个ModelAndView对象

4.4 重定向跳转

4.5 视图解析器添加前后缀

4.6 通过HttpServletResponse响应

5.SpringMVC接收请求数据

5.1 基本数据类型

5.2 对象接收

5.3 通过数组接收

5.4 自定义转换器

6.响应数据

6.1 ModelAndView传递

6.2 通过Map对象传值

6.2 通过Model来接收

6.3 通过ModelMap响应数据

6.4 SpringMVC中的乱码问题

7.SpringMVC文件上传操作

7.1 依赖的引入

7.2 表单页面

7.3 控制处理

7.4 配置文件处理

8.SpringMVC中的文件下载

9.静态资源处理

10 SpringMVC服务端验证

分组验证

11.SpringMVC中的JSON数据处理

12.Restful风格

SpringMVC拦截器


1.SpringMVC的入门案例

1.1 通过maven构建一个web项目

1.2 添加对应的依赖及Tomcat插件

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.17.RELEASE</version></dependency></dependencies>
​<build><finalName>gp_springmvc_01_hello</finalName><plugins><!-- tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><!-- 端口号 --><port>8082</port><!-- /表示访问路径 省略项目名 --><path>/</path><!-- 设置编码方式 --><uriEncoding>utf-8</uriEncoding></configuration></plugin></plugins>

1.3 创建SpringMVC的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
​<!-- 处理器映射器 --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
​<!-- 处理器适配器 --><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
​
</beans>

1.4 在web.xml中注册DispatchServlet

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" >
​
<web-app><display-name>Archetype Created Web Application</display-name><!--  注册前端控制器--><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:spring-mvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

1.5 创建自定义的Controller

package com.gupaoedu;
​
​
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
​
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​public class UserController implements Controller {
​/*** 处理请求的方法* @param httpServletRequest* @param httpServletResponse* @return* @throws Exception*/@Overridepublic ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {System.out.println("controller 执行了....");ModelAndView view = new ModelAndView();view.setViewName("/index.jsp");return view;}
}

1.6 在Springmvc配置文件中注册

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
​<!-- 处理器映射器 --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
​<!-- 处理器适配器 --><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
​<!-- 注册自定义的Controller name必须加 / 前缀--><bean class="com.gupaoedu.UserController" name="/user"/>
</beans>

原理分析:

DispatchServlet

init:IoC容器的初始化操作

初始化SpringMVC的九大组件

protected void initStrategies(ApplicationContext context) {this.initMultipartResolver(context);this.initLocaleResolver(context);this.initThemeResolver(context);// 加载我们在配置文件中添加的处理器映射器this.initHandlerMappings(context);// 加载我们在配置文件中添加的处理器适配器this.initHandlerAdapters(context);this.initHandlerExceptionResolvers(context);this.initRequestToViewNameTranslator(context);this.initViewResolvers(context);this.initFlashMapManager(context);
}

2.SpringMVC基于注解的使用方式

2.1 SpringMVC配置文件修改

<?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.gupaoedu.controller" /><!-- 开启SpringMVC注解的使用 --><mvc:annotation-driven />
​
</beans>

2.2 自定义控制器

package com.gupaoedu.controller;
​
​
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
​
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​@Controller // 将UserController对象交给IoC容器管理
@RequestMapping("/user") // 类头部的可以省略
public class UserController  {
​
​/*** 具体处理请求的方法  【头部的mapping+方法的mapping】* http://localhost:8082/user/query* @return*/@RequestMapping("/query")public String query(){System.out.println("query ..... ");return "/index.jsp";}
​@RequestMapping("/save")public String add(){System.out.println("save ..... ");return "/index.jsp";}
​@RequestMapping("/delete")public String delete(){System.out.println("delete ..... ");return "/index.jsp";}
​@RequestMapping("/update")public String update(){System.out.println("update ..... ");return "/index.jsp";}
}
​

2.3 测试

3.SpringMVC工作原理图解

4.SpringMVC中响应请求

4.1 响应返回字符串

我们可以在处理方法的最后返回一个要跳转的页面地址”/“不要漏了

@RequestMapping("/query")
public String query(){System.out.println("query ..... ");return "/index.jsp";
}

4.2 不响应

如果用户提交了请求后服务端不需要给客户端一个响应,那么我们可以指定返回类型为void同时在方法头部添加@ResponseBody注解即可

@RequestMapping("/save")
@ResponseBody
public void add(){System.out.println("save ..... ");
}

4.3 直接返回一个ModelAndView对象

我们也可以直接返回一个ModelAndView对象

@RequestMapping("/delete")
public ModelAndView delete(){System.out.println("delete ..... ");ModelAndView mm = new ModelAndView();mm.setViewName("/index.jsp");return mm;
}

4.4 重定向跳转

有些情况下重定向跳转也是我们开发中必须使用的形式

@RequestMapping("/update")
public String update(){System.out.println("update ..... ");return "redirect:/user/query";
}

4.5 视图解析器添加前后缀

<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" ><property name="suffix" value=".jsp"/><property name="prefix" value="/" />
</bean>

那这样的话响应的页面就会自动添加对应的前后缀信息

@RequestMapping("/query")
public String query(){System.out.println("query ..... ");return "index";
}

4.6 通过HttpServletResponse响应

仅仅只需要在方法的形参中声明这两个变量即可~

@RequestMapping("/fun1")
public void fun1(HttpServletRequest request,HttpServletResponse response) throws Exception {// response.sendRedirect("/index.jsp");System.out.println("fun1 ...");request.getRequestDispatcher("/index.jsp").forward(request,response);
}

5.SpringMVC接收请求数据

5.1 基本数据类型

直接在形参中声明要接收的数据,默认情况下形参必须和传过来的数据参数名一致

@RequestMapping("/query")
public String query(@RequestParam(value = "ids",required = true,defaultValue = "123") Integer id, String name){System.out.println("query ..... " + id + ":" + name);return "/index.jsp";
}

5.2 对象接收

如果传递过来的数据比较多,那么我们可以通过一个自定义的对象来接收

@RequestMapping("/save")
public String add(User user){System.out.println("save ..... " + user);return "/index.jsp";
}

5.3 通过数组接收

如果有多个名称相同的数据提交,我们可以使用数组的方式来接收

@RequestMapping("/delete")
public String delete(String[] loves){System.out.println("delete ..... ");if(loves !=null){for(String l : loves){System.out.println(l);}}return "/index.jsp";
}

注意:在形参中我们不能够通过集合的方式来获取传递的参数

在自定义对象中可以使用集合获取数组的形式来接收请求的参数

5.4 自定义转换器

有时候客户端传递过来特殊类型的数据,SpringMVC中提供的默认的转换器不能支持该转换,此时我们就需要自定义转换器

package com.gupaoedu.convert;
​
import org.springframework.core.convert.converter.Converter;
​
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
​public class DateConvert implements Converter<String,Date> {@Overridepublic Date convert(String s) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {return sdf.parse(s);} catch (ParseException e) {e.printStackTrace();}return null;}
}
​

配置文件中注册

<?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.gupaoedu.controller" /><!-- 开启SpringMVC注解的使用 --><mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"/>
​<!-- 配置转换器 --><bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"id="formattingConversionServiceFactoryBean"><property name="converters"><set><bean class="com.gupaoedu.convert.DateConvert"/></set></property></bean>
</beans>

6.响应数据

6.1 ModelAndView传递

@RequestMapping("/query")
public ModelAndView query(){System.out.println("query ..... ");ModelAndView mm = new ModelAndView();mm.setViewName("/user.jsp");mm.addObject("msg","msg.....");return mm;
}

然后在jsp页面中通过EL表达式获取传递的信息

<%--Created by IntelliJ IDEA.User: adminDate: 2020/8/26Time: 16:29To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head><title>Title</title>
</head>
<body>hello<br>${msg}
</body>
</html>

6.2 通过Map对象传值

ModelAndView使用起来稍微有点复杂,我们可以通过Map来简化操作

@RequestMapping("/save")
public String add(Map<String,Object> map){System.out.println("save ..... ");map.put("msg","map ...msg");return "/index.jsp";
}

6.2 通过Model来接收

@RequestMapping("/delete")
public String delete(Model model){System.out.println("delete ..... ");model.addAttribute("msg","model ...msg");return "/index.jsp";
}

6.3 通过ModelMap响应数据

@RequestMapping("/update")
public String update(ModelMap mm){System.out.println("update ..... ");mm.put("msg","ModelMap ... msg");return "/index.jsp";
}

前面介绍的多种方式的数据都是会被保存在request作用域中,如果我们同时需要将数据保存在Session对象中,我们只需要在类的头部添加一个@SessionAttributes注解即可

6.4 SpringMVC中的乱码问题

  <filter><filter-name>encodeFiletr</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><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodeFiletr</filter-name><url-pattern>/*</url-pattern></filter-mapping>

7.SpringMVC文件上传操作

7.1 依赖的引入

 <!-- fileUpload 解析上传的文件用到的jar -->
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version>
</dependency>
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version>
</dependency>

7.2 表单页面

提交的方式必须是post 方式,提交的数据的类型必须是二进制文件

<html>
<body>
<h2>Hello World!</h2><form action="/user/save" method="post" enctype="multipart/form-data">姓名:<input type="text" name="username"><br>头像:<input type="file" name="headImg"><br><input type="submit" value="提交"></form>
</body>
</html>
​

7.3 控制处理

提交的文件我们可以通过 MultipartFile 类型来接收

@RequestMapping("/save")
public String add(MultipartFile headImg,String username) throws IOException {System.out.println(username);System.out.println("文件名称:" + headImg.getOriginalFilename());headImg.transferTo(new File("d:/" + headImg.getOriginalFilename()));return "/index.jsp";
}

7.4 配置文件处理

<?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.gupaoedu.controller" /><!-- 开启SpringMVC注解的使用 --><mvc:annotation-driven />
​<!--  文件上传的解析器--><bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"><property name="maxUploadSize"><value>5242880</value></property></bean>
​
</beans>

8.SpringMVC中的文件下载

    @RequestMapping("/download")public void download(HttpServletRequest request,HttpServletResponse response){File file = new File("d://1.png");// 设置响应的头和客户端保存文件名response.setCharacterEncoding("utf-8");response.setContentType("multipart/form-data");response.setHeader("Content-Disposition","attchement;filename=" + file.getName());
​try {// 打开本地文件流InputStream in = new FileInputStream(file);// 激活下载的流ServletOutputStream out = response.getOutputStream();byte[] b = new byte[1024];int num = 0;while ((num = in.read(b)) != -1){out.write(b,0,num);}out.close();in.close();}catch (Exception e){e.printStackTrace();}}
​

9.静态资源处理

默认的情况下在SpringMVC中只能访问jsp页面,其他的都会被DispatchServlet拦截,原因是DispatchServlet配置的时候用的/ 覆盖掉了defaultservlet所做的工作,所以我们只需要重新制定即可

  <filter-mapping><filter-name>encodeFiletr</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.png</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping>

第二种方式就是在SpringMVC中指定映射的规则

<mvc:resources mapping="/img/**" location="/img/"  />

10 SpringMVC服务端验证

最早的校验,就是服务端校验。早期的网站,用户输入一个邮箱地址,校验邮箱地址需要将地址发送到服务端,服务端进行校验,校验成功后,给前端一个响应。有了JavaScript,校验工作可以放在前端去执行。那么为什么还需要服务端校验呢? 因为前端传来的数据不可信。前端很容易获取都后端的数据接口,如果有人绕过页面,就会出现非法数据,所以服务端也要数据校验,总的来说: 1.前端校验要做,目的是为了提高用户体验 2.后端校验也要做,目的是为了数据安全

SpringMVC本身是没有提供校验框架的,我们需要使用Hibernate提供的校验框架

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.3.0.Alpha1</version>
</dependency>

在配置文件中注册对应的校验框架

<?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.gupaoedu.controller" /><!-- 开启SpringMVC注解的使用 --><mvc:annotation-driven validator="localValidatorFactoryBean" /><mvc:resources mapping="/img/**" location="/img/"  /><!--  文件上传的解析器--><bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"><property name="maxUploadSize"><value>5242880</value></property></bean>
​<!-- 配置验证框架 --><bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" id="localValidatorFactoryBean"><property name="providerClass" value="org.hibernate.validator.HibernateValidator"/><property name="validationMessageSource" ref="messageSource" /></bean>
​<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource"><property name="basename" value="classpath:volidata.properties"/><property name="fileEncodings" value="utf-8"/><property name="cacheSeconds" value="120"/></bean>
​
</beans>

验证规则

注解说明
@Null被注解的元素必须为 null
@NotNull被注解的元素必须不为 null
@AssertTrue被注解的元素必须为 true
@AssertFalse被注解的元素必须为 false
@Min(value)被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=)被注解的元素的大小必须在指定的范围内
@Digits (integer, fraction)被注解的元素必须是一个数字,其值必须在可接受的范围内
@Past被注解的元素必须是一个过去的日期
@Future被注解的元素必须是一个将来的日期
@Pattern(regex=,flag=)被注解的元素必须符合指定的正则表达式
@NotBlank(message =)验证字符串非null,且长度必须大于0
@Email被注解的元素必须是电子邮箱地址
@Length(min=,max=)被注解的字符串的大小必须在指定的范围内
@NotEmpty被注解的字符串的必须非空
@Range(min=,max=,message=)被注解的元素必须在合适的范围内

在自定义的对象中指定验证规则

package com.gupaoedu.pojo;
​
import org.hibernate.validator.constraints.Length;
​
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;public class User {
​
​private Integer id;
​@NotNull(message = "账号不能为空")@Length(message = "账号的长度必须在3~6位" ,max = 6,min = 3)private String userName;
​@Max(message = "age最大值是120",value = 120)@Min(message = "age必须大于0" ,value = 0)private Integer age;
​public Integer getId() {return id;}
​public void setId(Integer id) {this.id = id;}
​public String getUserName() {return userName;}
​public void setUserName(String userName) {this.userName = userName;}
​public Integer getAge() {return age;}
​public void setAge(Integer age) {this.age = age;}
}
​

在控制层中使用校验规则

@RequestMapping("/save")
public String add(@Validated User user, BindingResult br) throws IOException {System.out.println("save ....");List<ObjectError> allErrors = br.getAllErrors();for (ObjectError error:allErrors){System.out.println(error.getDefaultMessage());}return "/index.jsp";
}

分组验证

分组验证解决的是不同的同一个POJO对象在不同的场景用适用不同的验证规则

定义分组

验证规则和分组绑定

package com.gupaoedu.pojo;
​
import com.gupaoedu.group.GroupInterface1;
import com.gupaoedu.group.GroupInterface2;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
​
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
​public class User {
​
​@NotBlank(message = "ID不能为空" ,groups = {GroupInterface1.class})private Integer id;
​@NotBlank(message = "{user.username.empty}" ,groups = {GroupInterface1.class,GroupInterface2.class})@Length(message = "账号的长度必须在3~6位" ,max = 6,min = 3,groups = {GroupInterface1.class,GroupInterface2.class})private String userName;
​@Max(message = "age最大值是120",value = 120,groups = {GroupInterface1.class,GroupInterface2.class})@Min(message = "age必须大于0" ,value = 0,groups = {GroupInterface1.class,GroupInterface2.class})private Integer age;
​public Integer getId() {return id;}
​public void setId(Integer id) {this.id = id;}
​public String getUserName() {return userName;}
​public void setUserName(String userName) {this.userName = userName;}
​public Integer getAge() {return age;}
​public void setAge(Integer age) {this.age = age;}
}
​

应用

@RequestMapping("/save")
public String add(@Validated({GroupInterface2.class}) User user, BindingResult br, Model model) throws IOException {System.out.println("save ....");List<ObjectError> allErrors = br.getAllErrors();for (ObjectError error:allErrors){System.out.println(error.getDefaultMessage());}return "/index.jsp";
}
​
@RequestMapping("/update")
public String update(@Validated({GroupInterface1.class}) User user, BindingResult br, Model model) throws IOException {System.out.println("update ....");List<ObjectError> allErrors = br.getAllErrors();for (ObjectError error:allErrors){System.out.println(error.getDefaultMessage());}return "/index.jsp";
}

11.SpringMVC中的JSON数据处理

Jackson依赖

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.9</version>
</dependency>
​
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.9</version>
</dependency>

响应数据为JSON格式的信息

@RequestMapping("/query")
@ResponseBody
public List<User> query(){System.out.println("query ..... ");return Arrays.asList(new User(1,"zhangsan1",18),new User(2,"zhangsan2",19),new User(3,"zhangsan3",12));
}

接受数据为JSON数据,提交的类型必须是post方式提交

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script type="text/javascript" src="js/jquery.min.js"></script>
</head>
<body>
<input type="button" value="提交JSON数据" onclick="fun1();">
<script type="text/javascript">function fun1(){$.ajax({type: 'POST',url: "/user/save",contentType: "application/json",//如果想以json格式把数据提交到后台的话,这个必须有,否则只会当做表单提交data: JSON.stringify({"userName":"sam","age":"12"}),//JSON.stringify()必须有,否则只会当做表单的格式提交dataType: "json",//期待返回的数据类型success: function(data){alert("success:"+data);},error:function(data){alert("error"+data);}});}
</script>
</body>
</html>
​

12.Restful风格

Restful是一种设计风格,是一个规范,不是一个技术。

提交方式地址说明
GET(查)http://localhost:8080/book/1查询id为1的书
POST(增)http://localhost:8080/book/1添加一本书,书的id为1
DELETE(删)http://localhost:8080/book/1删除id为1的书
PUT(改)http://localhost:8080/book/1修改id为1的书

控制器处理

package com.gupaoedu.controller;
​
​
import com.gupaoedu.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
​
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
​/*@Controller // 将UserController对象交给IoC容器管理
//@RequestMapping("/user") // 类头部的可以省略
@ResponseBody*/
@RestController
public class UserController  {
​/*** 具体处理请求的方法  【头部的mapping+方法的mapping】* http://localhost:8082/user/query* @return*/@GetMapping("/user/{id}/{name}")public List<User> query(@PathVariable Integer id,@PathVariable String name){System.out.println("query ..... " + id + " " + name);return Arrays.asList(new User(1,"zhangsan1",18),new User(2,"zhangsan2",19),new User(3,"zhangsan3",12));}
​@PostMapping("/user")public String add(@RequestBody User user){System.out.println("save ..... " + user);return "/index.jsp";}
​@DeleteMapping("/user")public String delete(){System.out.println("delete ..... ");return "/index.jsp";}
​@PutMapping("/user")public String update(){System.out.println("update ..... ");return "/index.jsp";}
}
​

SpringMVC拦截器

定义自定义的拦截器

package com.gupaoedu.interceptor;
​
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
​
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {
​/*** 在自定义控制器执行之前执行* @param request* @param response* @param handler* @return*    false  拦截*    true 放过*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {System.out.println("preHandle....");return true;}
​/*** 自定义控制器执行后执行*      在返回ModelAndView之前执行* @param request* @param response* @param handler* @param modelAndView*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
​System.out.println("postHandle ....");}
​/*** 自定义控制器执行后执行*     在返回ModelAndView之后执行* @param request* @param response* @param handler* @param ex*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println("afterCompletion....");}
}
​

注册拦截器

<!-- 配置拦截器 -->
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.gupaoedu.interceptor.MyInterceptor"/></mvc:interceptor>
</mvc:interceptors>


http://www.ppmy.cn/ops/149313.html

相关文章

自动驾驶3D目标检测综述(七)

本章紧接上一章内容&#xff0c;讲述第九章的内容&#xff1a;在驾驶系统中的3D目标检测。 目录 一、自动驾驶端到端学习 &#xff08;一&#xff09;问题和挑战 &#xff08;二&#xff09;联合感知和预测 &#xff08;三&#xff09;联合感知、预测和规划 &#xff08;四…

机器人避障不再“智障”:HEIGHT——拥挤复杂环境下机器人导航的新架构

导读&#xff1a; 由于环境中静态障碍物和动态障碍物的约束&#xff0c;机器人在密集且交互复杂的人群中导航&#xff0c;往往面临碰撞与延迟等安全与效率问题。举个简单的例子&#xff0c;商城和车站中的送餐机器人往往在人流量较大时就会停在原地无法运作&#xff0c;因为它不…

uniapp 使用 pinia 状态持久化

1.创建文件 stores -index.js -global.js2.对应文件内容 index.js 安装插件 npm i pinia-plugin-persistedstate import { createPinia } from pinia; import persist from pinia-plugin-persistedstate; const pinia createPinia(); pinia.use(persist); export default pi…

Android原生开发同一局域网内利用socket通信进行数据传输

1、数据接收端代码如下&#xff0c;注意&#xff1a;socket 接收信息需要异步运行&#xff1a; // port 端口号自定义一个值&#xff0c;比如 8888&#xff0c;但需和发送端使用的端口号保持一致 ServerSocket serverSocket new ServerSocket(port); while (true) {//这里为了…

解密Navicat密码(Java)

最近从Navicat换到了DBeaver&#xff0c;导出配置文件发现配置文件里的密码都是加密的&#xff0c;看网上的都是给的PHP代码&#xff0c;因为环境问题&#xff0c;就算是在线上运行的PHP代码也会报错&#xff0c;所以就把这段代码改成Java了。 package com.unicdata.system.con…

uniapp 导入uview-plus,使用组件出现,页面出现<up-parse>元素不存在,请检查你的代码

错误截图&#xff1a; 原因&#xff1a; 未按照官网方式进行配置&#xff0c;需要进行以下配置。具体详情 // pages.json {"easycom": {"autoscan": true,// 注意一定要放在custom里&#xff0c;否则无效&#xff0c;https://ask.dcloud.net.cn/question…

机器学习实战——决策树:从原理到应用的深度解析

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​ ​​ 决策树&#xff08;Decision Tree&#xff09;是一种简单而直观的分类与回归模型&#xff0c;在机器学习中广泛应用。它的…

go中协程的生命周期

在 Go 中&#xff0c;协程&#xff08;goroutine&#xff09;的生命周期大致可以分为以下几个阶段&#xff1a; 1. 创建阶段 协程的创建通常是通过 go 关键字来启动的。例如&#xff1a; go func() {// 协程执行的代码 }()当执行 go func() 时&#xff0c;Go 会在后台启动一…