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决定。
配置如下:<bean
class="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(此时不是视图,而就只是一个字符串而已)等。自动转换。