SpringMVC是什么
MVC设计模式
在了解SpringMVC之前,我们需要了解MVC设计模式,MVC模式指的是可以将一个Web Application分为一下三层:
- Controller(控制层):负责接收并处理请求,响应客户端。
- Model(模型层):负责处理业务逻辑,产生不同的模型数据。
- View(视图层):将模型数据展现给用户,与用户进行交互的窗口。
那么控制层、模型层、视图层之间是如何进行交换的呢?
当有一个请求发送来时,会被控制层进行接收,然后控制层根据不同的请求,调用不同的模型层方法,不同的方法会对数据库进行不同的持久化操作,从而产生不同的模型数据,将其封装后传递个视图层,视图层将拿到的数据进行渲染,最终将结果相应给客户端。
SpringMVC设计模式
SpringMVC是企业级开发框架,是目前最好的实现MVC设计模式的框架,他基于SpringIOC为基础,利用容器来简化自己的配置,相当于Spring框架的一个子模块。
SpringMVC的核心组件
- DispatcherServlet:前置控制器。
它是整个流程控制的核心,用来控制其他组件的执行,进行统一的调度,降低各个组件之间的耦合性,相当于一个总指挥。 - Handler:处理器,完成具体的业务逻辑。
- HandlerMapping:将请求映射到Handler
当DispatcherServlet接收到请求后,需要将不同的请求分发到不同的Handler中,此时就需要HandlerMapping。 - HandlerInterceptor:处理器拦截器
它是一个接口,若需要进行拦截处理,那么可以实现这个接口。 - HandlerExecutionChain:处理器执行链。
它包括两部分内容,一个是Handler和一个HandlerInterceptor,一般会有默认的拦截器,如果需要额外的添加拦截器,可以通过实现该接口来添加,但它至少都会返回一个默认拦截器。 - HandlerAdapter:处理器适配器
Handler在处理业务方法之前需要进行对表单数据的验证、数据类型的转换、将表单数据封装到JavaBean当中,这一系列的操作都是由HandlerAdapter来完成的,DispatcherServlet通过HandlerAdapter来执行不同的Handler。 - ModelAndView:装载模型数据和视图信息
这里的视图信息指的是逻辑视图,ModelAndView作为Handler的处理结果返回给DispatcherServlet。 - ViewResolver:视图解析器
DispatcherServlet拿到ModelAndView后需要进行解析,解析时需要借助ViewResolver,将逻辑视图转换为物理视图,最后渲染给客户端
组件之间如何进行交互
- 客户端请求被DispatcherServlet接收 。
- DispatcherServlet将请求映射到Handler。
- 通过HandlerMapping生成Handler以及HandlerInterceptor。
- 返回HandlerExecutionChain(Handler + HandlerInterceptor)给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter执行Handler。
- 返回一个ModelAndView给DispatcherServlet。
- DispatcherServlet通过ViewResolver进行解析。
- 返回填充了模型数据的View,相应给客户端。
Demo
web.xml配置文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 配置前置控制器-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化的参数 用来指定springmvc.xml的位置 contextConfigLocation上下文配置路径-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!-- 配置映射 /表示拦截所有请求-->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
applicationContext.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 需要在其中配置HandlerMapping,通过一个请求和Handler进行对应,目的是将url请求映射到Handler-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- 配置test对应的Handler-->
<prop key="/test">testHandler</prop>
</props>
</property>
</bean>
<!-- 配置Handler-->
<bean id="testHandler" class="com.yanyi.handler.MyHandler"/>
<!-- 配置视图解析器 配置视图解析器的目的是将逻辑视图转换为物理视图
在MyHandler中的逻辑视图为show,需要将show这一个字符串映射到show.jsp
这里用到了视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
SpringMVC需要我们自己开发的软件有两个,一个是Handler,还有一个是View,Handler实现了Controller接口中的handleRequest
方法,在其中为modelAndView
添加模型数据和视图逻辑。
package com.yanyi.handler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class MyHandler implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
//在这里处理具体的业务逻辑 把逻辑视图解析成物理视图
//modelAndView是装载模型数据和逻辑视图的
ModelAndView modelAndView = new ModelAndView();
//为其添加模型数据 Tom
modelAndView.addObject("Name","Tom");
//为其添加逻辑视图
modelAndView.setViewName("show");
return modelAndView;
}
}
下来编写jsp显示页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--判断是否忽略EL表达式 false 即不忽略EL表达式--%>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${Name}
</body>
</html>
所以,用完整的话来说就是用户通过客户端发送请求,被DispatcherServlet接收,具体内容在web.xml中进行配置servlet,其中指定applicationContext.xml的配置文件的位置,以及org.springframework.web.servlet.DispatcherServlet。springmvc若使用的是注解方式进行配置的,那么打开自动扫描包,若使用的是xml方式,需要配置Handler和HandlerMapping,在HandlerMapping中配置:将一个请求和Handler进行对应,目的是将url请求映射到Handler。然后返回HandlerExecutionChain到DispatcherServlet,将获取到的Handler通过HandlerAdapter去执行具体的Handler的具体业务方法,然后返回ModelAndView给DispatcherServlet。ModelAndView包含了两部分内容,一部分是模型数据,另一部分是视图信息,DispatcherServlet需要借助ViewResolver解析器进行解析,将逻辑视图解析为物理视图,完成模型数据的填充,然后返回给客户端。