导图社区 SpringMVC
springMVC全面总结,你要的这都有.让你快速掌握SpringMVC
编辑于2019-08-16 09:21:07SpringMVC
DispatcherServlet
常用注解
@RequestMapping
修饰类
修饰方法
参数
value
指定url, 如果只设定这一个参数, value= 可以不写. url可以用{xxx}占位符 url支持Ant风格
params
请求参数
支持简单表达式
method
HiddenHttpMethodFilter
很多情况前端只支持get和post请求, 如表单只支持get和post请求, 那么如果要发送put和delete请求就要用到HiddenHttpMethodFilter
请求的REST方式
get
获取数据
post
添加数据
put
修改数据
delete
删除数据
handers
请求头参数设置
支持简单表达式
consumes
指定请求的内容类型(Content-type)
produces
指定返回的内容类型
仅当request请求头中的(Accept)类型中包含该指定类型才返回
修饰方法形参的注解
@PathVariable
修饰方法参数和@RequestMapping的占位url合用
value
required
@RequestParam
value
required
@RequestBody
@CookieValue
@RequestHeader
@ModelAttribute("xxx")
获取已经在ModelAndView中的对象(如用@ModelAttribute修饰过的方法)
POJO(非注解)
SpringMVC会按请求参数名和形参POJO属性名进行自动匹配(支持级联属性)
demo
容易混淆的注解
@RequestMapping中的parames
请求url或body中是否有对应parames, 主要作用是筛选url
@Pathvariable
url占位符入参
@RequestParam
请求参数(基本数据类型等)入参
@RequestBody
请求参数(json,xml等)到指定类型(与json,xml数据结构对应的类)入参
主要作用是入参
修饰在方法上的注解
@RequestMapping
@ResponseBody
可以将整个返回结果以某种格式返回,如json或xml格 方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中
demo
//注意这里不是返回到index页面, 而是把index这个字符串传到url结果集中. @RequestMapping("/{myname}/pathVariable2.do") @ResponseBody public String pathVariable2(@PathVariable(value = "myname") String name){ System.out.println("myname = "+name); return "index"; }
@ModelAttribute
修饰的方法会在执行请求方法之前执行,并将该方法的返回值放到ModelAndView中,也可修饰入参
默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。配合@ModelAttribute("user")使用的时候,会将对应的名称的model值存到session中,
修饰类的注解
@RequestMapping
@SessionAttribute
demo
@Controller @RequestMapping("/test") @SessionAttributes(value = {"user","test1"}) public class LoginController{ @ModelAttribute("user") public UserEntity getUser(){ UserEntity userEntityr = new UserEntity(); userEntityr.setUsername("asdf"); return userEntityr; } @RequestMapping("/modelTest.do") public String getUsers(@ModelAttribute("user") UserEntity user ,HttpSession session){ System.out.println(user.getUsername()); System.out.println(session.getAttribute("user")); return "/index"; } }
@RestController
@ResponseBody+@Controller的组合体, 返回return里面的内容
组合注解
@GetMapping
@RequestMapping(method = RequestMethod.GET)的缩写
@PutMapping
@PostMapping
@DeleteMapping
@PatchMapping
@RestController
以实例化的入参
Servlet api
HttpServletRequest
HttpServletResponse
HttpSession
ModelAndView
既包含视图信息(所要被映射的视图名), 又包含视图所需的模型数据(contrl处理结果返回的数据) Map数据结构 无论contrl方法返回什么, SpringMVC都会封装成ModelAndView, 最后通过视图解析器去解析ModelAndView. 默认情况下Spring MVC将模型中的数据存储到request域中
viewResolver视图解析器
视图对象View
请求转发和重定向
转发
返回的字符串带forward:
重定向
返回的字符串带redirect:
表单标签
数据绑定和数据转换
原理
SpringMvc的数据绑定流程 在SpringMvc中会将来自web页面的请求和响应数据与controller中对应的处理方法的入参进行绑定,即数据绑定。流程如下: -1.SpringMvc主框架将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象 -2.DataBinder对象调用装配在SpringMvc上下文中的ConversionService组件进行数据类型转换,数据格式化工作,将Servlet中的请求信息填充到入参对象中。 -3.调用Validator组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象 -4.SpringMvc抽取BindingResult中的入参对象和校验错误对象,将它们赋给处理方法的相应入参。 总结起来:大致流程是 绑定(bindingResult)--》数据转换(conversionService)--》校验(validators) 数据转换 SpringMvc上下文中内建了很多转换器,可以完成大多数Java类型转换工作。但是如果就要转换成我们自定义的类型时,那么我们就要自定义类型转换器,并将其加入到conversionService中去,conversionService中包含了很多SpringMvc内建的转换器。 ConversionService是SpringMvc类型转换体系的核心接口,可以利用ConversionServiceFactoryBean在Spring的IOC容器中定义一个ConversionService,Spring将自动识别出IOC容器中的ConversionService,并在bean属性配置及SpringMvc处理方法入参绑定等场合使用它进行数据转换。
springMVC内置的转换器
自定义转换器
public class Employee { private Integer id; private String name; private String email; private Integer gender; private Department department; private Date birth; private double salary; ...... } public class Department { private Integer id; private String departmentName; ........... } package com.seven.converts; import com.seven.domain.Department; import com.seven.domain.Employee; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; /** * Created by hu on 2016/4/3. */ @Component //该类的主要目的是将字符串转换为一个Employee对象 public class EmployeeConverts implements Converter<String,Employee> { @Override /* * source就是前台web页面传递过来的字符串 * 如:gg-gg@qq.com-0-105 姓名-邮件-性别-部门ID * */ public Employee convert(String source) { if(source!=null){ String[] vals=source.split("-"); //获得雇员的姓名 String name=vals[0]; //获得雇员的邮件 String email=vals[1]; //获得雇员的性别 Integer gender=Integer.parseInt(vals[2]); //获得雇员的部门 Department department=new Department(); department.setId(Integer.parseInt(vals[3])); Employee employee=new Employee(null,department,gender,email,name); return employee; } //如果字符串为空,就不生成雇员对象 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.seven"></context:component-scan> <!--配置视图解析器,将视图逻辑名解析为/WEB-INF/pages/<viewName>.jsp--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> <!--将自定义的转换器加入到框架中--> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.seven.converts.EmployeeConverts"/> </set> </property> </bean> <mvc:annotation-driven/> <mvc:default-servlet-handler/> </beans>
校验(JSR 303)