1.SpringMvc是什么
Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框 架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
Spring Web MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;
应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response)
方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
2.Spring Web MVC 能干什么
√让我们能非常简单的设计出干净的Web层和薄薄的Web层;
√进行更简洁的Web层的开发;
√天生与Spring框架集成(如IoC容器、AOP等);
√提供强大的约定大于配置的契约式编程支持;
√能简单的进行Web层的单元测试;
√支持灵活的URL到页面控制器的映射;
√非常容易与其他视图技术集成,如Velocity、Thymeleaf、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map
数据结构实现,因此很容易被其他框架使用);
√非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;
√提供一套强大的JSP标签库,简化JSP开发;
√支持灵活的本地化、主题等解析;
√更加简单的异常处理;
√对静态资源的支持;
√支持Restful风格。
3.Spring Web MVC 核心架构
核心架构的具体流程步骤如下:
1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、 DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个 HandlerInterceptor拦截器)对象,通过这种策略模式,很容 易添加新的映射策略;
3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
4.SpringBoot对SpringMvc简单使用
1.创建一个Springboot项目(省略)
2.添加maven库
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
3.在使用方法前加入@Controller 控制器注解
@Controller public class DemoApplication { }
4.使用@RequestMapping注解 映射Url访问地址
@RequestMapping("/") public String tohome(Model model, RedirectAttributes redirectAttributes){ model.addAttribute("test","带参数访问成功"); //redirectAttributes.addFlashAttribute("test","带参数跳转到控制器成功"); return "index"; }
5.映射多个请求地址
@RequestMapping(value={"index","index1"},method = RequestMethod.GET)
6.使用RESTful url风格
@RequestMapping("index/{id}") public String doIndex(@PathVariable("id") Integer id, Model model){ model.addAttribute("id",id); return "index"; }
7.解决rest返回@ResponseBody乱码
在使用SpringMvc的时候,需要使用 Rest ,最简单的方法是将 @Controller改为@RestController,还可以在 @RequestMapping下面添加@ResponseBody注解。不过有时候使用@ResponseBody时候会出现乱码问题。
解决方法:
在@RequestMapping 注解上添加 produces = MediaType.APPLICATION_JSON_VALUE+";charset=UTF-8" 属性值
或者将方法返回值改成Object
7.重定向(redirect)和转发(forward)
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.(携带参数)
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.(不携带参数,可以自己拼接url参数)
1:使用ModelAndView对象转发或者重定向
return new ModelAndView("redirect:/index");
2:直接返回String 转发或者重定向
return "forward:/index";
3:forward携带参数
model.addAttribute("test","带参数访问成功"); return "forward:/index";
@RequestMapping("/index") public String formHome(Model model,RedirectAttributes redirectAttributes){ //model.addAttribute("test","带参数访问成功");//从上面的方法转发过来 等于隐式的把test参数放在 Model里 return "index"; }
在index方法里想获取放在model里的test 使用 request.getAttribute("test");
4:redirect携带参数
@RequestMapping("/") public String tohome(RedirectAttributes redirectAttributes){ redirectAttributes.addFlashAttribute("test","带参数跳转到控制器成功"); return "redirect:/index"; }
@RequestMapping("/index") public String formHome(Model model,RedirectAttributes redirectAttributes){ //隐式的取session里的test参数放在Model里 return "index"; }
5.跳转到外部url
return “redirect:http://www.baidu.com”;
6.在没有RequestMapping的方法中使用获取request对象
HttpServletRequest request1 = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();