MVC是Model View Controller设计模式的缩写,Model用于封装数据,View用于展示数据,而Controller用于控制M和V的关系,让V展示特定的M中的数据。Spring MVC是对MVC模式的一个实现,运行在Web层的框架,并将对象存储在Spring IoC容器中。

核心原理

  • DispatcherServlet:核心控制器,用来过滤客户端发送过来,想要进行逻辑处理的请求
  • Handler(Controller):处理器。开发人员自定义,用来处理用户请求的,并且处理完成之后返回给用户指定视图的对象。
  • HandlerMapping:处理器映射器。DispatcherServlet在根据URL转发请求给Handler时得有一个匹配规则,这个匹配规则由HandlerMapping决定。
    配置如下:

    1. <bean
    2. class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
  • HandlerAdaptor:处理器适配器。处理器适配器用来适配每一个要执行的Handler对象。

    1. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
  • ViewResolver:视图解析器,Handler返回的是逻辑视图名,需要有一个解析器能够将逻辑视图名转换成实际的物理视图
    Spring的可扩展性决定了视图可以由很多种,所以需要不同的视图解析器,解析不同的视图。
    配置如下:

    1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    2. <!-- 设置生成的视图的类型,比如jsp对应的视图类为 JstlView-->
    3. <property name="viewClass"
    4. value="org.springframework.web.servlet.view.JstlView">
    5. </property>
    6. <!-- 如果要返回的所有的视图都在同一个package下,比如都在/WEB-INF下,可以使用同一的前缀 -->
    7. <property name="prefix" value="/WEB-INF/"></property>
    8. <!-- 如果所有页面返回的均是.jsp页面,可以省略后缀 .-->
    9. <property name="suffix" value=".jsp"></property>
    10. </bean>

    处理器适配器,处理器映射器,视图解析器等都的配置都可以省略,
    在spring的jar中都拥有默认的配置的。默认配置在:org.springframework.web.servlet的DispatcherServlet.properties文件中

    处理器

    在底层放入Spring IoC容器的核心对象中,实际上只有处理器是自己写的,其它都是在配置文件中写一个Bean标签即可。而对于这些对象的配置,则是在web.xml中配置。
    处理器主要用于处理请求,调用Service层的方法查询数据,并封装到对象中;亦可以直接返回一个视图。它可以实现一个Controller接口重写handleRequest方法成为一个处理器,也可以使用基于注解的方式,让任意Bean类的方法通过添加@RequestMapping注解即可成为一个处理器。

    1. @Controller
    2. @RequestMapping("/user")
    3. public class UserController {
    4. @RequestMapping("/add")
    5. public String add() {
    6. return "success";
    7. }
    8. }

    使用的注解

  • RequestMapping:请求映射路径,例如localhost:8080/项目名/类上的映射路径/方法上的映射路径。路径可以使用Ant风格(?单个字符、多个字符、*多个目录),还可以使用模板URI映射。模板还可以使用正则表达式。

  • PathVariable:指定参数对应URI的哪个模板,当模板名和参数名一致则可以不写value参数。 ```java @RequestMapping(value = “/delete/{param}”) public String delete1(@PathVariable long param) { // 模板名和参数名一致 return “success”; }

@RequestMapping(value = “/delete/{param}”) public String delete2(@PathVariable(“param”) long id) { // 模板名和参数名不一致 return “success”; }

@RequestMapping(value = “/delete/{param:[0-9]+}”, // 使用正则表达式 method = RequestMethod.POST, // 指定访问方式为POST,注解可以替换为PostMapping params = {“username”}) // 指定包含参数username,否则500错误,也可以使用=、!=等 public String delete3(@PathVariable(“param”) long id) { return “success”; }

  1. <a name="jRRde"></a>
  2. ### 注入参数
  3. 方法可以注入一些类型的参数,方便使用。包括:
  4. - IO流对象
  5. - Request、Response、HttpSession
  6. - Model、Map、ModelMap:model是封装在Request域的对象,是map的一个实现类。modelMap也是map的一个实现类。这三个对象都是同一个。
  7. - WebRequest / NativeWebRequest
  8. 参数可以通过请求参数、请求头的键值等注入值,这被称为数据绑定。可以绑定的类型包括基本类型及其包装类、集合、String、Date、pojo(根据属性名和参数key值绑定,需要set方法)等。例如:
  9. ```java
  10. @GetMapping(value="/header")
  11. public String test(@RequestHeader("User-Agent")
  12. String userAgent,
  13. @RequestHeader(value="Accept")
  14. String[] accepts,
  15. @RequestHeader(value = "Token",
  16. required = false, // 非必须
  17. defaultValue = "qweqwzf.ter") // 默认值
  18. String token) {
  19. System.out.println("userAgent:" + userAgent);
  20. System.out.println("Token:" + token );
  21. Arrays.stream(accepts).forEach(System.out::println);
  22. return "success";
  23. }
  24. @GetMapping("/cookie")
  25. public String cookie(
  26. @CookieValue(value="JSESSIONID",defaultValue="1231313")
  27. String jessionid){
  28. System.out.println("jessionid:"+jessionid);
  29. return "success";
  30. }
  31. @RequestMapping("/param")
  32. public String param(
  33. @RequestParam(name="id",defaultValue="15")String id,
  34. @RequestParam(name="age",defaultValue="10")String age) {
  35. System.out.println("id:"+id);
  36. System.out.println("age:"+age);
  37. return "success";
  38. }
  39. @RequestMapping("/date")
  40. public String testParam2(
  41. @DateTimeFormat(pattern = "yyyy-MM-dd")Date birth) {
  42. System.out.println(id.isPresent());
  43. System.out.println("age:"+age);
  44. System.out.println("jsessionID : "+jessionID);
  45. System.out.println("birth:" + birth);
  46. return "index";
  47. }

返回类型

使用注解的处理器方法的返回类型对应不同的含义。

  • String——逻辑视图名、forward:内部跳转到物理视图路径、redirect:重定向到物理视图的路径
  • ModelAndView——模型视图对象
  • void——可以通过注入respose参数响应
  • json——需要使用Jackson jar包,在方法上添加@ResponseBody注解,将返回的数据封装为json字符串,返回的数据包括:pojo、数组、List、Set、Map、String(此时不是视图,而就只是一个字符串而已)等。自动转换。