spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射,视图渲染,本地化,时区与主题渲染等,甚至还能支持文件上传。
(1)Http请求:客户端请求提交到DispatcherServlet。
(2)寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。
(3)调用处理器:DispatcherServlet将请求提交到Controller。
(4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView.
(6)(7)处理视图映射并返回模型:DispatcherServlet查询一个或多个ViewResolver视图解析器,找到ModelAndView指定的视图。
(8)Http响应:视图负责将结果显示到客户端。
主要注解:
@Controller:
1.用于标注控制层组件
2.@Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象
3.分发处理器将会扫描了使用该注解的类的方法,并检测该方法是否使用了@RequestMapping注解
4.可以把Request请求header部分的值绑定到方法的参数上
@RestController:
相当于@Controller和@responseBody的组合效果
@Component:
泛指组件,当组件不好归类的时候,可以使用这个注解进行标注
@Repository:
用于注解dao层,在daoImpl类上面注解
@Service:
用于标注业务层组件
@ResponseBody:
异步请求
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConvert转换为指定格式后,写入到Response对象的body数据区
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json,xml等)使用
@RequestMapping:
一个用来处理请求地址映射的注解,可以用于类或方法上,用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
@Autowired:
它可以对类成员变量,方法以及构造函数进行标注,完成自动装配的工作,通过@Autowired的使用来消除set,get方法
@PathVariable:
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数
在讲ContextLoaderListener之前,首先来了解一下web.xml的作用。
1.一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。web.xl文件是用来初始化配置信息:比如Welcome页面,Servlet,Servlet-mapping,filter,listener,启动加载级别等。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的Application。
2.当要启动某个web项目时,服务器软件或容器如(tomcat)会第一步加载项目中的web.xml文件,通过其中的各种配置来启动项目,只有其中配置的各项均无误时,项目才能正确启动。web.xml有多项标签,在其加载的过程中顺序依次为:context-param>>listener>>filter>>servlet。(同类多个节点以出现顺序依次加载)
web.xml加载过程:
1.启动web项目的时候,容器首先会去它的配置文件web.xml读取两个节点:<listener></listener>和<context-param></context-param>。
2.紧接着,容器创建一个ServletContext(application),这个web项目所有部分都将共享这个上下文。
3.容器以<context-param></context-param>的name作为键,value作为值,将其转化为键值对,存入ServletContext。
4.容器创建<listener></listener>中的类实例,根据配置的class类路径<listener-class>来创建监听,在监听中会有contextInitialized(ServletContexEvent args)初始化方法,启动web应用是,系统调用Listener的该方法,在这个方法中获得:
ServletContext application=ServletContextEvent.getServletContext();
context-param的值=application.getInitParameter("context-param的值");
得到context-param的值之后,你就可以做一些操作了
举例:
你可能在想在项目启动之前就打开数据库,那么这里就可以在<context-param>中设置数据库的连接方式(驱动,url,user,password),在监听类中初始化数据库的连接,这个监听是自己写的一个类,除了初始化方法,它还有销毁方法,用于关闭应用的释放资源,比如:数据库连接的关闭,此时调用contextDstroyed(ServletContextEvent args),关闭web应用时,系统调用Listener的改方法。
而springmvc启动过程大致分为两个过程:
1.ContextLoaderListener初始化,实例化IoC容器,并将此容器实例注册到ServletContext中。
2.DispatcherServlet初始化。
web.xml配置:
contextConfigLocation:指定spring IOC容器需要读取的XML文件路径,默认会去/WEB-INF/下加载applicationContext.xml
ContextLoaderListener:spring监听器,spring mvc在web容器中的启动类,读取applicationContext.xml,负责spring IOC容器在web上下文中的初始化
DispatcherServlet:前端处理器,接收的HTTP请求和转发请求的类
CharacterEncodingFilter:字符集过滤器
IntrospectorCleanupListener:防止spring内存溢出监听器
- ContextLoaderListener在web.xml中的配置
<!-- 配置contextConfigLocation初始化参数 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- 配置ContextLoaderListerner -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
springmvc框架,与其他很多web的mvc框架一样:请求驱动;所有设计都围绕一个中央Servlet;来展开,他负责把所有请求分发到控制器;同时提供其他web应用开发所需要的功能。不过Spring的中央处理器,DispatcherServlet,能做的比这更多。
下图展示了Spring Web MVC的DispatcherServlet处理请求的工作流。熟悉设计模式的朋友会发现,DispatcherServlet应用其实就是一个“前端控制器”的设计模式(其他很多优秀的web框架也都使用了这个设计模式)。
- 在web.xml中的配置
<!-- servlet定义 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
load-on-startup:表示启动容器时初始化该Servlet;
url-pattern:表示哪些请求交给Spring Web MVC处理,"/"是用来定义默认servlet映射的。也可以如"*.html"表示拦截所有以html为扩展名的请求。
在springMVC中,每个DispatcherServlet都持有一个自己的上下文对象WebApplicationContext,它又继承了根(root)WebApplicationContext对象中已经定义的所有bean。这些继承的bean可以在具体的Servlet实例中被重载,在每个Servlet实例中你也可以定义其scope下的新bean。
WebApplicationContext继承自ApplicationContext,它提供了一些web应用经常需要用到的特性。它与普通的ApplicationContext不同的地方在于,它支持主题解析,并且知道它关联到的是哪个servlet(它持有一个改ServletContext的引用)