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决定。
配置如下:<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
HandlerAdaptor:处理器适配器。处理器适配器用来适配每一个要执行的Handler对象。
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
ViewResolver:视图解析器,Handler返回的是逻辑视图名,需要有一个解析器能够将逻辑视图名转换成实际的物理视图
Spring的可扩展性决定了视图可以由很多种,所以需要不同的视图解析器,解析不同的视图。
配置如下:<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 设置生成的视图的类型,比如jsp对应的视图类为 JstlView--><property name="viewClass"value="org.springframework.web.servlet.view.JstlView"></property><!-- 如果要返回的所有的视图都在同一个package下,比如都在/WEB-INF下,可以使用同一的前缀 --><property name="prefix" value="/WEB-INF/"></property><!-- 如果所有页面返回的均是.jsp页面,可以省略后缀 .--><property name="suffix" value=".jsp"></property></bean>
处理器适配器,处理器映射器,视图解析器等都的配置都可以省略,
在spring的jar中都拥有默认的配置的。默认配置在:org.springframework.web.servlet的DispatcherServlet.properties文件中处理器
在底层放入Spring IoC容器的核心对象中,实际上只有处理器是自己写的,其它都是在配置文件中写一个Bean标签即可。而对于这些对象的配置,则是在web.xml中配置。
处理器主要用于处理请求,调用Service层的方法查询数据,并封装到对象中;亦可以直接返回一个视图。它可以实现一个Controller接口重写handleRequest方法成为一个处理器,也可以使用基于注解的方式,让任意Bean类的方法通过添加@RequestMapping注解即可成为一个处理器。@Controller@RequestMapping("/user")public class UserController {@RequestMapping("/add")public String add() {return "success";}}
使用的注解
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”; }
<a name="jRRde"></a>### 注入参数方法可以注入一些类型的参数,方便使用。包括:- IO流对象- Request、Response、HttpSession- Model、Map、ModelMap:model是封装在Request域的对象,是map的一个实现类。modelMap也是map的一个实现类。这三个对象都是同一个。- WebRequest / NativeWebRequest参数可以通过请求参数、请求头的键值等注入值,这被称为数据绑定。可以绑定的类型包括基本类型及其包装类、集合、String、Date、pojo(根据属性名和参数key值绑定,需要set方法)等。例如:```java@GetMapping(value="/header")public String test(@RequestHeader("User-Agent")String userAgent,@RequestHeader(value="Accept")String[] accepts,@RequestHeader(value = "Token",required = false, // 非必须defaultValue = "qweqwzf.ter") // 默认值String token) {System.out.println("userAgent:" + userAgent);System.out.println("Token:" + token );Arrays.stream(accepts).forEach(System.out::println);return "success";}@GetMapping("/cookie")public String cookie(@CookieValue(value="JSESSIONID",defaultValue="1231313")String jessionid){System.out.println("jessionid:"+jessionid);return "success";}@RequestMapping("/param")public String param(@RequestParam(name="id",defaultValue="15")String id,@RequestParam(name="age",defaultValue="10")String age) {System.out.println("id:"+id);System.out.println("age:"+age);return "success";}@RequestMapping("/date")public String testParam2(@DateTimeFormat(pattern = "yyyy-MM-dd")Date birth) {System.out.println(id.isPresent());System.out.println("age:"+age);System.out.println("jsessionID : "+jessionID);System.out.println("birth:" + birth);return "index";}
返回类型
使用注解的处理器方法的返回类型对应不同的含义。
- String——逻辑视图名、forward:内部跳转到物理视图路径、redirect:重定向到物理视图的路径
- ModelAndView——模型视图对象
- void——可以通过注入respose参数响应
- json——需要使用Jackson jar包,在方法上添加@ResponseBody注解,将返回的数据封装为json字符串,返回的数据包括:pojo、数组、List、Set、Map、String(此时不是视图,而就只是一个字符串而已)等。自动转换。
