SpringMvc基础知识

时间:2022-06-26
本文章向大家介绍SpringMvc基础知识,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

8.重定向(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();