SpringMVC
框架概念与特点
什么是MVC?
模型-视图-控制器(MVC)是⼀个众所周知的以设计界⾯应⽤程序为基础的设计思想。
它主要通过分离模型、视图及控制器在应⽤程序中的⻆⾊将业务逻辑从界⾯中解耦。
常见的MVC框架运行性能的比较
Jsp+servlet > struts1 > spring mvc > struts2+freemarker > struts2,ognl,值栈
SpringMVC是什么?
它是⼀种基于Java的实现了Web MVC设计思想的请求驱动类型的轻量级Web框架,即使⽤了MVC架构模式的思想,将web层进⾏职责解耦,基于请求驱动指的就是使⽤请求-响应模型,框架的⽬的就是帮助我们简化开发,Spring MVC也是要简化我们⽇常Web开发的。
SpringMVC能帮我们做什么?
1. 让我们能⾮常简单的设计出⼲净的Web层;
2. 进⾏更简洁的Web层的开发;
3. 天⽣与Spring框架集成(如IOC容器、AOP等);
4. 提供强⼤的约定⼤于配置的契约式编程⽀持;
5. 能简单的进⾏Web层的单元测试;
6. ⽀持灵活的URL到⻚⾯控制器的映射;
7. ⾮常容易与其他视图技术集成,如jsp、Velocity、FreeMarker等等,因为模型数据不放在特定的API⾥,⽽是放在⼀个Model⾥(Map数据结构实现,因此很容易被其他框架使⽤);
8. ⾮常灵活的数据验证、格式化和数据绑定机制,能使⽤任何对象进⾏数据绑定,不必实现特定框架的API;
9. ⽀持灵活的本地化等解析;
10. 更加简单的异常处理;
11. 对静态资源的⽀持;
12. ⽀持Restful⻛格。
SpringMVC请求流程
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、最终前端控制器将渲染后的⻚⾯响应给⽤⼾或客⼾端
URL地址映射配置&参数绑定
URL地址映射配置之@RequesrMapping 映射单个URL
@RequestMapping(“ ”) @RequestMapping(value=“ ”)
映射多个 URL @RequestMapping({"",""}) @RequestMapping(value={"",""}) 映射 URL 在控制器上
⽤于类上,表⽰类中的所有响应请求的⽅法都是以该地址作为⽗路径。
设置 URL 映射的请求⽅式 可以通过 method属性设置⽀持的请求⽅式 method=RequestMethod.POST
通过参数名称映射 URL
通过参数的形式访问 @RequestMapping(params = “test06”)
参数绑定
基本数据类型
第一种
参数值必须存在
如果没有指定参数值,也没有设置参数默认值,则会报500异常
第二种
通过注解 @RequestParam 标记⼀个形参为请求参数
(注解声明在形参的前⾯)
可以通过注解的属性设置相关内容
* 设置参数的默认值 defaultValue
第三种
可以通过注解的属性设置相关内容
* 设置参数的参数名(别名) name
包装类型
如果数据是基本类型,建议使⽤包装类型
客户端请求参数名与⽅法形参名保持⼀致,默认参数值为null
可以通过 @RequestParam 的name属性设置参数的别名
defaultValue属性设置参数默认值
字符串类型
客户端请求参数名与⽅法形参名保持⼀致,默认参数值为null
可以通过 @RequestParam 的name属性设置参数的别名,defaultValue属性设置参数默认值
数组类型
客户端传参形式:ids=1&ids=2&ids=3
JavaBean 类型
客户端请求的参数名与JavaBean对象的属性字段名保持⼀致
List 类型
此时 User 实体需要定义对应 list 属性
Set 类型
也需要绑定在对象上,⽽不能直接写在 Controller ⽅法的参数中
Map 类型
Map最为灵活,它也需要绑定在对象上,⽽不能直接写在Controller⽅法的参数中
SpringMVC请求转发与重定向
重定向到JSP页面
重定向是发⼀个302的状态码给浏览器,浏览器⾃⼰去请求跳转的⽹⻚。地址栏会发⽣改变
重定向是以redirerct:开头的
传递参数
传递参数 (传递中⽂参数会出现乱码)
传递参数 (通过 RedirectAttributes 对象设置重定向参数,避免中⽂乱码问题)
返回 ModelAndView 对象
重定向到Controller返回 ModelAndView 对象
⻚⾯中获取参数值
${param.参数名}
请求转发
请求转发以 forward: 开头
地址栏不发生改变可以获取请求域中的地址
设置参数
设置请求域
默认会去指定⽬录下找JSP⻚⾯ (配置⽂件中设置的)
请求转发到 Controller
请求转发到 Controller
传递参数
⻚⾯中获取数据
获取传递的参数:${param.参数名}
获取请求域的数据:${请求域中设置的名称}
SpringMVC之JSON数据开发
注释使用
@ResponseBody
* @ResponseBody 返回的是JOSN格式的数据,返回JavaBean对象
注解设置在⽅法体上
注解设置在⽅法返回对象前,修饰符之后
@ResponseBody 返回的是JOSN格式的数据,返回集合
@RequestBody
⽤来处理 content-type 不是默认的 application/x-www-form-urlcoded 类型的内容
@RequestBody 规定请求的参数是JOSN格式的字符串
注解设置在形参前⾯
请求域对象设置api的五种方式
1.ModelAndView
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("hello","你好啊!");
modelAndView.setViewName("hello");
return modelAndView;
2.ModelMap
modelMap.addAttribute("hello","heoolwda02");
return "hello";
3.Model
model.addAttribute("hello","dsauhduqwewq123");
return "hello";
4.Map
map.put("hello","helloModel04321");
return "hello";
5.HttpServletRequest
request.setAttribute("hello","sdadsadsadasdsadwmnb");
return "hello";