SpringMVC——概述

一、概述
 SpringMVC 是 Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一。Web框架的作用就是解决浏览器和服务器之间的交互问题,本质就是Request和Response,简单地说,Web技术就是Http协议、Request和Response。
 SpringMVC的优点:
  1️⃣支持 REST 风格的 URL 请求
  2️⃣采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性
  3️⃣SpringMVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口

 SpringMvc中常用的组件有以下几个:
  ①DispatcherServlet:前端控制器,也称中央处理器,功能类似于struts2中的核心过滤器StrutsPrepareAndExecuteFilter。DispatcherServlet是整个流程控制的中心,代表着MVC模式中的C。用户请求到达前端控制器,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性
  ②HandlerMapping:请求映射处理器,主要工作是解决将请求映射给哪个Controller处理的问题,HandlerMapping会返回一个HandlerExecutionChain对象,该对象包含一个Handler处理器(即页面控制器Controller)对象和多个HandlerInterceptor拦截器对象,SpringMVC提供了不同的映射处理器的映射方式,如配置文件、实现接口或注解
  ③Handler(即Controller):处理器/页面控制器/后端控制器,用于对请求进行处理。Handler是继DispatcherServlet前端控制器之后的后端控制器,对具体的用户请求进行处理,由于Handler涉及到具体的用户业务请求,所以一般需要程序员根据业务需求开发Handler
  ④HandlerAdapter:通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
  ⑤ViewResolver:视图解析器,负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析物理视图名(即具体的页面地址),再生成View视图。 SpringMVC框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等,一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面
  ⑥LocalResolver:本地化、国际化
  ⑦MultipartResolver:文件上传解析器
  ⑧HandlerExceptionResolver:异常处理器

二、环境搭建
 1、导包
  commons-logging-1.1.3.jar
  spring-aop-4.0.0.RELEASE.jar
  spring-beans-4.0.0.RELEASE.jar
  spring-context-4.0.0.RELEASE.jar
  spring-core-4.0.0.RELEASE.jar
  spring-expression-4.0.0.RELEASE.jar
  spring-web-4.0.0.RELEASE.jar
  spring-webmvc-4.0.0.RELEASE.jar
 2、配置文件
  ①web.xml:

<!-- 配置解决中文乱码的Filter -->
<filter>
	<filter-name>characterEncodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>characterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
	
<!-- SpringMVC的中央处理器Servlet -->
<servlet>
	<servlet-name>springDispatcherServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<!-- SpringMVC配置文件的位置 -->
		<param-value>classpath:applicationContext-servlet.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>springDispatcherServlet</servlet-name>
	<!-- 拦截所有请求 -->
	<url-pattern>/</url-pattern>
</servlet-mapping>

  Tip
   1️⃣web.xml中主要是配置前端控制器(即DispatcherServlet),并配置由SpringMVC拦截的请求,/表示拦截所有请求,也可以写成*.html表示只拦截url中以html结尾的请求
   2️⃣在配置DispatcherServlet的同时需要配置DispatcherServlet的contextConfigLocation属性,在contextConfigLocation指定的配置文件中配置的是前端处理所需要的各种Bean,比如所有的Controller和视图解析器。这样在启动Web应用时,Tomcat(或其他Servlet容器)会为我们创建DispatcherServlet对象,创建DispatcherServlet对象时会去加载contextConfigLocation指定的配置文件,Spring就会根据该文件为配置的Bean创建对象并将其加入到SpringMVC的Bean容器中(注意并不是Spring的IOC容器)。在创建这些Controller对象的同时,由于Controller中的请求处理方法上都会使用@RequestMapping等注解标注该方法处理的请求地址,相当于此时DispatcherServlet就已经可以知道每个请求应该由哪个Controller的哪个方法处理了,只不过DispatcherServlet将请求映射的工作转移给了HandlerMapping。简单的说,contextConfigLocation配置的作用就是让DispatcherServlet知道请求可以转发给哪些类处理。但是一定要注意,使用\<init-param>的方式配置contextConfigLocation时,配置文件的位置不可以放在/WEB-INF/目录下,而需要放在src包下,因为Servlet是不能读取/WEB-INF/下的文件的
   3️⃣除了这种显示指定contextConfigLocation的方式之外还有一种方式——直接将SpringMVC的servlet配置文件放在/WEB-INF/下,但此时文件的命名是有要求的,必须是[servlet-name]-servlet.xml的格式,以上面的配置为例:我们配置DispatcherServlet时的命名是springDispatcherServlet(即\<servlet-name>的值),则放在/WEB-INF/下的SpringMVC的servlet配置文件的命名必须为springDispatcherServlet-servlet.xml,也就是说在我们没有显示配置contextConfigLocation时,会去/WEB-INF/下读取符合上述命名格式的配置文件作为SpringMVC的容器配置文件
  ②SpringMVC容器文件(即applicationContext-servlet.xml)的配置:添加自动扫描的包和视图解析器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

	<context:component-scan base-package="com.bdm.controllers" />
	<bean id="internalResourceViewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/pages/" />
		<property name="suffix" value=".jsp" />
	</bean>
</beans>

   Tip:prefix的值是返回页面的前缀、suffix是返回页面的后缀,比如处理方法的返回值为ok,则返回的页面对应的jsp的位置就是/WEB-INF/pages/ok.jsp

 3、编写处理器类:使用@Controller和@RequestMapping标注类和方法,请求映射——让一个请求精确的对应一个处理方法

@Controller
@RequestMapping(value = "/hello")
public class TestController {

	@RequestMapping(value = "/test")
	public String test() {
		System.out.println("Hello springmvc");
		return "success";
	}
}

  Tip
   1️⃣若在类级别和方法级别上都有请求映射注解@RequestMapping,那么方法处理的请求地址是这两个注解的value值的拼接
   2️⃣处理方法的定位并不是靠方法名,而是靠请求映射注解@RequestMapping的value值,这一点和struts2不同,struts2是将请求绑定给某个方法

四、SpringMVC的处理过程
 简易版的请求处理过程如下图所示:
在这里插入图片描述
 完整的请求流程如下:
在这里插入图片描述
 完整流程说明:
  0、Servlet容器启动,加载SpringMVC的容器配置文件(即applicationContext-servlet.xml),Spring会为每个单例的Controller(有些Controller不是单例的,使用@Scope设置)创建代理对象,同时会将每个Controller及其内部的方法处理的请求地址进行注册,这些都发生在Servlet启动时,用户发送请求之前
  1、 用户发送请求,由于在web.xml中配置了DispatcherServlet,并使其拦截所有请求,因此用户发送的请求会被DispatcherServlet拦截
  2、 DispatcherServlet收到请求后调用HandlerMapping处理器映射器,由于在0步(即容器启动)时每个Controller的方法处理的请求都进行了注册,因此HandlerMapping此时是知道用户的请求该由哪个Controller的哪个方法处理
  3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象(即Controller)及处理器拦截器(若有拦截器则生成)一并返回给DispatcherServlet
  4、 DispatcherServlet通过HandlerAdapter(处理器适配器)调用处理器(Controller),若处理器有拦截器则先调用拦截器进行预处理,调用完成会返回一个ModelAndView
  5、 HandlerAdapter再将Controller的执行结果ModelAndView返回给DispatcherServlet
  6、 DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)
  7、 ViewReslover解析后将解析的结果View再次返回给DispatcherServlet
  8、DispatcherServlet对View进行视图渲染(即将模型数据填充至视图中)
  9、DispatcherServlet将渲染后的视图(View)响应给用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值