Spring5框架之SpringMVC
目录
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
*/
@Override
public 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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://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> {
@Override
public 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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://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: admin
Date: 2020/8/26
Time: 16:29
To 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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://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
配置的时候用的/
覆盖掉了default
servlet所做的工作,所以我们只需要重新制定即可
<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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://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 |
被注解的元素必须是电子邮箱地址 | |
@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 放过
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("preHandle....");
return true;
}
/**
* 自定义控制器执行后执行
* 在返回ModelAndView之前执行
* @param request
* @param response
* @param handler
* @param modelAndView
*/
@Override
public void postHandle(HttpServletRequest request
, HttpServletResponse response
, Object handler, ModelAndView modelAndView) {
System.out.println("postHandle ....");
}
/**
* 自定义控制器执行后执行
* 在返回ModelAndView之后执行
* @param request
* @param response
* @param handler
* @param ex
*/
@Override
public 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>