Spring MVC介绍
JavaEE应用的分层模型:
1、Domain Object(领域对象,及数据模型)层
2、DAO(Data access Object,数据访问对象)层
3、Service(业务逻辑)层
4、Controller(控制)层
5、view(表现)层
JavaEE应用的组件:
1、表现层组件
2、控制层组件
3、业务逻辑层组件
4、DAO组件
5、领域对象组件(数据模型)
MVC思想将一个应用分成三个基本部分:Model(模型)、View(视图)、Controller(控制器)
Spring MVC与Struts相比,优势:
1、拥有强大的灵活性,非侵入性和可配置性
2、提供了一个前端控制器DispatcherDervlet,开发者无须额外开发控制器对象
3、分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射视图解析器
4、可以自动绑定用户输入,并正确的转换数据类型
5、使用一个名称/值的map对象实现更加灵活的模型数据传输
6、内置了常用的校验器
7、支持国际化
8、支持多种视图技术
9、提供了jsp标签库
Spring MVC的DespatherServlet
继承自Httpservlet基类,是处理请求的控制器,核心功能是分发请求,分发给对应处理的Java类,Spring中称Handler
开发Handle:
1、实现Controller接口,Controller接口必须实现handlerRequest方法,只能处理一个单一的请求动作
2、基于注解的控制器,可处理多个请求动作,需要在配置文件加扫描注解配置
DespathcerSelvlet装配每种组件的细节:
1、本地化解析器(只允许一个实例)
2、主题解析器(只允许一个实例)
3、处理器映射器(允许多个实例)
4、处理器适配器(允许多个实例)
5、处理器异常解析器(允许多个实例)
6、视图名称解析器(只允许一个实例)
7、视图解析器(允许多个实例)
8、文件上传解析器(只允许一个实例)
9、FlashMap映射管理器
Spring MVC执行流程
1、用户向服务器发送请求被Spring的前端控制器DispatcherSevlet截获
2、DispatcherServlet对请求URL进行解析,得到URI(请求资源标识符),然后根据该URI调用HandleMapping获得该Handler配置的所有相关的对象,包括Handle对象以及Handle对象对应的拦截器,这些对象会被封装到一个HandleExecutionHcain对象当中返回
3、DispatcherServlet根据获得的Handle,选择一个合适的HandlerAdapter
4、提取请求中的模型数据,开始执行Handler(Controller)
1)消息转换:将请求消息(如:Json、xml等数据)转换成一个对象,将对象转换为指定响应信息
2)数据转换:对请求对请求消息进行数据转换(类型转换)
3)数据格式化:对请求消息进行数据格式化,如将字符串转换成格式化数字或格式化日期
4)数据验证:验证数据的有效性(长度格式等)验证结果存储到BindingResult或Error中
5、Handler执行完成后,向DispatcherServlet返回一个ModelAndView
6、DispatcherServlet根据返回的ModelAndView对象,选择一个合适的ViewResolver(视图解析器)
7、ViewResolver结合ModelAndView来渲染视图
8、将视图渲染结果返回给客户端
SpringMVC常用注解
@Controller:提示该类为一个控制器,及Handle
@RequestMapping:提示Spring用哪一个类的方法来处理请求
1、value属性:将URL映射到方法上,为RequestMapping的唯一属性
2、method属性:指该方法处理哪些请求方式,默认所有方式
3、consumes属性:指定该方法处理何种类型的请求,如consumes="application/json"
4、produces属性:该属性指定返回的内容类型
5、params属性:该属性指定request中必须包含某些参数
6、headers属性:该属性指定request中必须包含某些指定的header值
Model与ModelMap使用
添加:model.addAttribute("key",value); modelMap.addAttribute("key",value);
取值:model.asMap().get("key"); modelMap.get("key");
ModelAndView
@RequestParam:用于指定将指定的请求参数赋值给方法中的形参,在形参前加
参数:value=“参数名称”,required=true/false,default=“默认值”
@PathVariable:可以获取请求URL中的动态参数,在形参前加
参数:value=“名称”,默认绑定同名参数
@RequestHeader:用于将请求的头信息区数据映射到功能处理方法的参数上
参数:name=“绑定的参数名称”,value=“别名”,required=true/false,default=“默认值”
@CookieValue:用于将请求的Cookie数据映射到功能处理的方法的参数上
参数:name="绑定的名称",value=“别名”,required=true/false,default=“默认值”
@SessionAttribute:允许我们有选择的指定Model中哪些属性需要转存到HttpSession
参数:name,value,types
注:只能声明在类上,不能声明在方法上
@ModelAttribute:将请求参数绑定到model对象
@RequestBody:
@ResponseBody
信息转换
HTTPMessageConverter<T>接口,将请求信息转换为一个对象,并将对象绑定到请求方法的参数中或输出为响应信息
转换Json数据,MappingJackson2HttpMessageConverter,利用Jackson开源类包处理JSON格式的请求或响应信息
转换XML数据,Jaxb2RootElementHTTPMessageConverter
@XmlElement,@XmlRootElement
SpringMVC的标签库
form标签,input标签,password标签,hidden标签,textarea标签,chechbox标签,checkboxes标签,radiobutton标签,radiobuttons标签,
select标签,option标签,options标签,errors标签
SpringMVC的国际化
SpringMVC的国际化是建立在Java国际化的基础之上的,也是通过提供不同国家/语言环境的消息资源,然后通过ResoutceBandle加载指定的locale对应的资源文件,再取得该资源文件中指定key对应的消息
实现步骤:1、给系统加载国际化资源文件
2、输出国际化:1)在视图页面上输出国际化消息,需要使用SpringMVC标签库
2)在Controller的处理方法中输出国际化消息,需要使用org.springframework.web.servelt.support.RequestContext的getMessage()方法
SpringMVC中选择语言区域,使用语言区域解析器
LocaleResolver接口,其实现类:1、AcceptHeadeLocaleResolver(默认解析器)
2、SessionLocaleResolver
3、CookieLocaleResolver
messages标签,需要导入Spring的标签库,<%taglib prefix="spring" uri="www.org/tages" %>
SpringMVC的数据转换、格式化和数据校验
SringMVC会根据请求方法签名不同,将请求消息中的信息以一定的方式转换并绑定到请求方法参数中
数据绑定流程
数据转换
java.beans包中提供了一个ProperyEditor接口
缺点:
1、只能用字符串和对象的转换,不适用于任意两个Java类型直接的转换
2、对源对象及目标对象所在的上下文信息不敏感,在类型转换时不能利用这些上下文信息实施高级转逻辑
ConverSionService:
1、boolean canConvert(Class<?> sourceType ,Class<?> tagetType) 判断是否可转型
2、boolean canConvert(TypeDescriptor sourceType,TypeDescriptor tagetType)
3、<T> Tconvert(Object source,Class<?> tagetType) 将源类型转换为目标类型
SpringMVC的文件上传和下载
SpringMVC会根据请求方法的签名不同,将请求消息中的信息以一定的方式转换并绑定到请求方法参数中
文件上传:必须将表单的method设置为POST(SpringMVC默认只支持POST的请求,重写方法可加入自己想要的请求),并将enctype设置为mulitpatrt/form-data
使用Apache Commons FileUpload技术实现了一个MulitpartResolver实现类
SpringMVC会将上传文件绑定到MulitpartFile对象中
MulitpartFile类中方法
1、byte[] getBytes() 获取文件数据
2、String getContentType() 获取文件MINE类型,如imge/jpeg
3、InputStream getInputSteam() 获取文件流
4、String getName() 获取文件名
5、String getDriginalFilename() 获取上传文件的原名
6、long getSize() 获取文件字节大小
7、blooean isEmpty() 判断文件是否为空
8、void transferTo(File file) 将上传文件复制带本地磁盘
文件下载
SpringMVC提供了一个ResponseEntity类型,其可以方便的定义返回的HttpHeaders和HttpStatus
拦截器:
HandleInterceptorr接口:
1、boolean preHandle(HttpsevrletRequest request,HttpServletResponse response, Object handle)
2、void postHandle(HttpsevrletRequest request,HttpServletResponse response)
3、void afterComplation(HttpsevrletRequest request,HttpServletResponse response, Object handle,Exception exception)