SpringMVC简介
1、特点(为什么要学)
它是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!第二它和tapestry一样是一个纯正的servlet系统,这也是它和tapestry相比 struts所具有的优势。而且框架本身有代码,看起来容易理解。
- 轻量级、简洁灵活,简单易学
- 高效,基于请求响应的MVC框架
- 与Spring兼容性好
- 功能强大,如RESTful、数据验证、格式化、本地化等
- 约定高于配置
2、DispatcherServlet(中心控制器)
Spring的Web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。DispatcherServlet是整个SpringMVC的控制中心。
3、原理图
下图中绿色的部分表示需要自己实现的部分,其他属于框架自动实现的。数字表示接收请求时调用的顺序
4、核心文件(初期学习)
web.xml
项目内路径:webWEB-INFweb.xml
<!-- 注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 关联一个springmvc的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 启动级别-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- / 匹配所有请求(不包括.jsp)-->
<!-- /* 匹配所有请求(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springmvc-servlet.xml
项目内路径:srcmain esourcesspringmvc-servlet.xml
<!-- 配置HandlerMapping和HandlerAdapter-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 视图解析器:DispatcherServlet提供的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!-- Handler-->
<bean id="/template" class="com.wjr.controller.TemplateController"/>
Controller
项目内路径:srcmainjavacomwjrcontrollerTemplateController.class
public class TemplateController implements Controller {
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
//ModelAndView 模型和视图
ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView中,Model
mv.addObject("msg","Hello,SpringMVC!I am the template");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("template");//WEB-INF/jsp/template.jsp
return mv;
}
}
5、运行流程
-
用户发出请求,DispatcherServlet接收请求并拦截;
-
DispatcherServlet在web.xml配置文件中进行注册
<!-- 注册DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 关联一个springmvc的配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!-- 启动级别--> <load-on-startup>1</load-on-startup> </servlet> <!-- / 匹配所有请求(不包括.jsp)--> <!-- /* 匹配所有请求(包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
假设用户请求的url为: http://localhost:8080/SpringMVC/template
-
该url会被拆分成三块(请求位于服务器localhost:8080上的SpringMVC站点的template控制器)
- http://localhost:8080(服务器域名)
- SpringMVC(部署在服务器上的web站点)
- template(控制器)
-
-
DispatcherServlet会自动调用HandlerMapping进行处理器映射,根据请求url中的template查找对应的Handler;
-
HandlerMapping在springmvc-servl;et.xml配置文件中进行注册
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-
-
HandlerExecution表示具体的Handler,其主要的作用为根据url查找控制器,如TemplateController;
-
TemplateController在springmvc-servlet.xml配置文件中进行注册
<bean id="/template" class="com.wjr.controller.TemplateController"/>
-
-
HandlerExecution将查找到的控制器等信息传递给DispatcherServlet;
-
DispatcherServlet再自动调用HandlerAdapter,HandlerAdapter表示处理器适配器,按照特定的规则执行Handler;
-
HandlerAdapter在springmvc-servlet.xml配置文件中进行注册
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
-
-
Handler再让具体的Controller执行;
-
Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView;
-
Controller接口的方法,返回值为ModelAndView
public interface Controller { @Nullable ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception; }
-
-
HandlerAdapter将视图逻辑名或模型(ModelAndView)传给DispatcherServlet
-
DispatcherServlet调用ViewResolver(视图解析器)来解析视图逻辑名;
-
ViewResolver在springmvc-servlet.cml配置文件中注册
<!-- 视图解析器:DispatcherServlet提供的ModelAndView--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 后缀--> <property name="suffix" value=".jsp"/> </bean>
-
-
ViewResolver将解析的视图逻辑名返回给DispatcherServlet;
-
DispatcherServlet根据视图逻辑名调用具体的View(视图)
-
最终结果呈现给用户