【SpringMVC】入门,这"一篇"文章就够了(一)

文章目录

  • 简介
    • 一、是什么
    • 二、优势
    • 三、对比Struts
  • 原理
    • 一、DispatcherServlet:前端控制器
    • 二、HandlerMapping:处理器映射器
    • 三、HandlAdapter:处理器适配器
    • 四、Handler:处理器
    • 五、View Resolver:视图解析器
    • 六、View:视图
    • 七、 注解
  • 应用
    • 流程
    • 常用注解
      • (1)RequestParam
      • (2)PathVariable
      • (3)RequestBody
      • (4)ModelAttribute
      • (5)RequestHeader
      • (6)CookieValue
      • (7)SessionAttribute

简介

一、是什么

 SpringMVC是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB模块,通过注解让一个简单的java类成为处理请求的控制器。它主要分为model(数据模型)、view(JSP、HTML请求)、Controller(接收用户请求)。那它在三层架构的位置是什么呢,一张图代表一下:
【SpringMVC】入门,这

二、优势

 SpringMVC的优点很多,这里不一一概述,介绍几个主要的:

  • 清晰的角色划分:
    • 前端控制器(DispatcherServlet)
    • 请求到处理器映射(HandlerMapping)
    • 处理器适配器(HandlerAdapter)
    • 视图解析器(ViewResolver)
    • 处理器或页面控制器(Controller)
    • 验证器( Validator)
    • 命令对象(Command 请求参数绑定到的对象就叫命令对象)
    • 表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。
  • RESTful风格的支持、简单的文件上传、约定大于配置的契约式编程支持
  • 和 Spring 其他框架无缝集成,是其它 Web 框架所不具备的
  • 强大的 JSP 标签库,使 JSP 编写更容易
  • 可定制性, HandlerMapping、 ViewResolver 等能够非常简单的定制。

三、对比Struts

 可能很多的开发人员没有用Struts2,但是在面试中问道了SpringMVC,然后一般与Struts2的对比也是无可难免的,所以这里大概介绍一下;

共同点

  • 它们都是表现层框架,都是基于 MVC 模型编写的;
  • 它们的底层都离不开原始 ServletAPI。
  • 它们处理请求的机制都是一个核心控制器。

不同点

  • Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
  • Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所以 Spring MVC 会稍微比 Struts2 快些
  • Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 Ajax 的请求更方便

原理

  在优势中我已经介绍了,SpringMVC角色划分清晰,然后对于前端请求页面,他们是如何工作的呢。下面一张图表示了

一、DispatcherServlet:前端控制器

 用户请求到达前端控制器,它就相当于 mvc 模式中的 c, dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求, dispatcherServlet 的存在降低了组件之间的耦合性。
【SpringMVC】入门,这

二、HandlerMapping:处理器映射器

 HandlerMapping 负责根据用户请求找到 Handler 即处理器, SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
【SpringMVC】入门,这

三、HandlAdapter:处理器适配器

 通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。在这里我们我们可以类比我们的插排;

四、Handler:处理器

 它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。

【SpringMVC】入门,这

五、View Resolver:视图解析器

 View Resolver 负责将处理结果生成 View 视图, View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
【SpringMVC】入门,这

六、View:视图

 视图模型进行渲染,将模型数据填充到视图中,最常用的是JSP,然后通过页面标签或页面摸板技术将模型数据通过页面展示给用户。

七、mvc:annotation-driven 注解

 在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使 用 mvc:annotation-driven 自 动 加 载 RequestMappingHandlerMapping ( 处 理 映 射 器 ) 和
RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用mvc:annotation-driven替代注解处理器和适配器的配置。
【SpringMVC】入门,这

应用

流程

 我们在tomcat中部署SpringMVC中的启动流程,如下图:
【SpringMVC】入门,这

  1. 服务器启动,应用被加载。 读取到 web.xml 中的配置创建 spring 容器并且初始化容器中的对象。
  2. 浏览器发送请求,被 DispatherServlet 捕获,该 Servlet 并不处理请求,而是把请求转发出去。转发的路径是根据请求 URL,匹配@RequestMapping 中的内容。
  3. 匹配到了后,执行对应方法。该方法有一个返回值。
  4. 根据方法的返回值,借助 InternalResourceViewResolver 找到对应的结果视图。
  5. 渲染结果视图,响应浏览器。

常用注解

(1)RequestParam

 它的作用就是把请求中指定名称的参数给控制器中的形参赋值。
jsp中url传参


requestParam 注解

Controller接收

/**
* requestParams 注解的使用
* @param username
* @return
*/
@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String username,
@RequestParam(value="age",required=false)Integer age){
System.out.println(username+","+age);
return "success";
}

(2)PathVariable

 作用主要是用于绑定 url 中的占位符。 例如:请求 url 中 /delete/{id}, 这个{id}就是 url 占位符。它也是restful的一种风格。可以跟RequestParam对比着学习,他们两个都是对于单独的参数的传值形式,但是url后面的格式不同。
jsp中url传参

	pathVariable 注解

Controller接收

@RequestMapping("/usePathVariable/{id}")
	public String usePathVariable(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}

(3)RequestBody

 它的作用用来获取请求体内容,直接使用得到的是key=value&key=value…结构的数据。而且需要注意:请求方式需要时post方式。

(4)ModelAttribute

 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
 出现在参数上,获取指定的数据给参数赋值。

场景
 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。

(5)RequestHeader

 获取到请求头,用的地方比较到,这里作为了解。

(6)CookieValue

 主要是用来把指定 cookie 名称的值传入控制器方法参数。

(7)SessionAttribute

 用于多次执行控制器方法间的参数共享。
【SpringMVC】入门,这

@Controller("sessionAttributeController")
@RequestMapping("/springmvc")
@SessionAttributes(value ={"username","password"},types={Integer.class})
public class SessionAttributeController {
/**
	* 把数据存入 SessionAttribute
	* @param model
	* @return
	* Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
	* 该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
*/
@RequestMapping("/testPut")
	public String testPut(Model model){
model.addAttribute("username", "泰斯特");
model.addAttribute("password","123456");
model.addAttribute("age", 31);
//跳转之前将数据保存到 username、 password 和 age 中,因为注解@SessionAttribute 中有
这几个参数
return "success";
}
@RequestMapping("/testGet")
public String testGet(ModelMap model){
System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("a
ge"));
return "success";
}
@RequestMapping("/testClean")
public String complete(SessionStatus sessionStatus){
sessionStatus.setComplete();
return "success";
}
}

你可能感兴趣的:(SpringMVC)