详解Spring MVC之二:M-V-C在哪

Spring Web MVC实现了一个完整的基于MVC设计模式的web服务框架。这个框架包含的知识特别多,而且这些知识点之间存在密切的联系。因此我们有必要先从整体上介绍了一下这个框架,建立一个完整的印象,为后续的学习做一个铺垫。

我们先看一个示例代码:

@Controller
public class MyController {
	
	@AutoWired
	private PetRepository repository;

    @RequestMapping("/getPet")
    public ModelAndView getPet(HttpServletRequest request) {
        String petId = request.getParameter("petId");
    	 Pet pet = repository.getPet(petId);
        ModelAndView  mv = new ModelAndView(new PetView());
        mv.addObject("pet",pet);
        return mv;
    }
}

这段代码我们既有很熟悉的地方,也有感觉陌生的地方,我们试着分析一下。

控制器

@Controller注解将某个类声明为了一个控制器,即MVC的C部分。它本质上就是一个Spring Bean,只不过会被Spring MVC特殊对待。 @RequestMapping标注的方法,是处理器(handler)方法,它映射了一个url pattern,并包含对应的处理逻辑。

ModelAndView

一般情况下,handler方法并不直接将返回给客户端的数据直接写入HttpServletReponse(尽管在技术上是可行的)。而是返回一个ModelAndView对象,它包裹了视图和模型属性;Spring MVC拿到这个ModelAndView实例,下一步就可以执行View的渲染。

视图

为了将业务模型与视图解耦,Spring MVC定义了独立的视图层,视图的接口是org.springframework.web.servlet.View,实现该接口就可以创建新的视图类型(PetView)。
视图必须要和Model属性结合才有意义,否则视图就是静态的了。

模型

handler方法使用service bean来完成业务逻辑(从PetRepository获取数据)。从MVC设计模式来讲,PetRepository是model层的一部分;但对View来说,它只关注需要渲染的模型对象,也即Pet。

ModelAndView是Model对象和View实例的包装器,handler方法将需要渲染的模型对象,作为一个model属性加进去:mv.addObject("pet",pet)

Handler方法变体

上面的示例代码不太可能出现在实际的项目中,因为它非常啰嗦且不灵活,Spring MVC提供了大量的隐含约定和便利手段来协助开发者写出更简洁、更灵活的代码。但是从本质上讲,所有其他形式的handler方法都是该示例代码的一个变体。

下面列几种常见的变化形式:

  • @RequestParam注解可以提取Http请求的参数
@RequestMapping("/getPet")
public void getPet(@RequestParam("petId") String petId) {
}
  • 我们不需要返回View实例,可以返回一个View Name,交给ViewResolver来解析
@RequestMapping("/getPet")
public String getPet(@RequestParam("petId") String petId) {
	return "petView";
}
  • @ResponseBody告诉Spring MVC,handler方法直接返回http body对象,由HttpMessageConverter进行序列化,不走View渲染流程
@RequestMapping("/getPet")
@ResponseBody
public Pet getPet(@RequestParam("petId") String petId) {
	return repository.getPet(petId);
}

在前后端分离成为Web系统主流技术风格的今天,最后这种形式的handler方法反而最为常见,估计这是Sping MVC设计之初所始料未及的。

MVC Config

Spring允许我们对MVC框架进行配置,比如上面提到的HttpMessageConverter和ViewResolver,做此项工作最好的方式实现WebMvcConfigurer接口。

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
}

上面的WebConfig实现了WebMvcConfigurer,并声明为一个bean;@EnableWebMvc注解激活此项功能,让Sping MVC发现这个bean,并调用它来配置MVC。WebMvcConfigurer包含大量配置接口,我们不会集中讲解,而会分散到各个技术主题中介绍。

注:如果使用Spring Boot,已经自动添加了@EnableWebMvc注解,不需要我们再添加

总结

这一章,我们大体了解了MVC设计模式在Spring Web MVC这个框架里面是如何落地的,大体分三个环节:

  1. 控制器包含handler方法,handler方法处理具体的URL请求;
  2. handler方法返回处理结果相关的View和model;
  3. View基于model渲染返回结果给客户端。

在每个环节,Spring MVC有大量的技术细节来提供足够的功能和便利给开发者(我甚至认为有点太多了),这些技术大体可以分以下几类:

  1. 特定的java类型有特定的含义,比如ModelAndView,Model,View等等;
  2. 通过注解赋予参数或方法特定的含义,比如@RequestParam;
  3. 默认的约定,比如当handler方法没有返回View或View Name,通过URL自动生成一个View Name。

虽然后面的章节,会分主题来讲解各个技术点,但Spring MVC天然是一个整体,一个技术点存在的理由往往是为了和另一个技术点互相配合(这Spring MVC难学的主要原因之一);所以在学习过程中,我们时刻要在脑海里保留本章所介绍的Spring MVC总体工作机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值