1.MVC框架简介
MVC设计模式:
M:model层,模型数据,业务处理
C:controller,控制层,负责接受并处理请求,响应客户端
V:view视图层,呈现模型与用户进行交互。
image.png
2.SpringMVC
SpringMVC框架是目前实现MVC设计模式的最好框架
一.Spring MVC的核心组件
1.DispatcherServlet:前置控制器,是整个流程控制的核心,用来控制其他组件的执行,进行统一的调度,降低各个组件之间的耦合性,相当与一个总指挥的地位
2.Handler:处理器,完成具体的业务逻辑,DispatcherServlet接收到用户请求之后,将请求转发给Handler
3.HandlerMapping:Handler的具体实现是通过HandlerMapping来实现的,他会将请求URL映射到具体的Handler。将请求映射到具体的Handler,这就是HandlerMapping的具体工作。
4.HandlerInterceptor:处理器拦截器,这是一个接口,如果我们需要做一些拦截处理,可以实现此接口来实现这个功能。
5.HandlerExecutionChain:处理器执行链
6.HandlerAdapter:处理器适配器,Handler在执行业务方法之前,会进行一些列的操作,包括对表单数据验证,表单数据类型的转换,将表单数据封装到JavaBean当中,这些都是通过HandlerAdapter来完成的,DispatchServlet通过HandlerAdapter来执行不同的Handler。
7.ModelAndView:装载模型数据和视图信息(逻辑视图,是handler的处理结果,返回给DIspatcherServlet的),DispatchServlet拿到ModelAndView之后,借助ViewResolver视图解析器来解析ModelAndView
8.ViewResolver:视图解析器会将逻辑视图解析为物理视图,最终将结果渲染给客户端
二.SpringMVC的实现流程
1.客户端请求被DispatcherServlet接收
2.DispatcherServlet节后到请求后通过HandlerMapping将请求映射到具体的Handler,同时还包括了一个HandlerInterceptor,并且Handler与HandlerInterceptor是结合起来的,以一个HandlerExecutionChain的结果返回给DispatcherServlet
3.生成Handler与HandlerInterceptor
4.HandlerExecutionChain(Handler+HandlerInterceptor)
5.DispatcherServlet拿到Handler之后,通过HandlerAdaptor执行Handler
6.Handler的业务方法执行完之后,会返回一个结果ModelAndView结果给DispatchServlet,
7.DispatchServlet拿到ModelAndView之后,通过ViewResolver来进行视图解析,视图解析器会将逻辑视图解析为物理视图,并且会进行模型数据的封装,最终将填充了模型数据的view响应给客户端
8.将填充了模型数据的view响应给DispatchServlet
9.DispatchServlet将view渲染后给用户
image.png
3.基于xml的配置方式
1.SpringMVC基础配置
2.XML配置Controller(即Handler),HandlerMapping组件映射,这一步主要就是把一个请求与一个具体的Handler关联起来,让这个Handler去处理请求
3.XML配置ViewReslover组件映射
*****************************自己写的Handler******************************
package com.imooc.handler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
/**
* MyHandler作为一个Handler控制器需要实现一个接口Controller
* 此时提示参数javax.servlet.http.HttpServletRequest httpServletRequest出错
* 这是因为servletjar包未导入,导入即可
*/
public class MyHandler implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
/**
* 装载模型数据和逻辑视图
*/
ModelAndView modelAndView=new ModelAndView();
/**
* 添加模型数据,SpringMVC会自动将模型数据放到request域当中。
*/
modelAndView.addObject("name","Tom");
/**
* 指定添加逻辑视图
* DispatcherServlet获得ModelAndView之后,调用我们自己在springmvc.xml当中配置的视图解析器解析他
* 此处在经过视图解析器的解析之后,变成了/show.jsp
*/
modelAndView.setViewName("show");
return modelAndView;
}
}
*****************************自己写的View**********************************
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--获取request域当中的值-->
${name}
</body>
</html>
***********在Spring的配置文件当中配置Handler和HandlerMapping************
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置HandlerMapping,将请求url映射到具体的Handler-->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!--配置mapping-->
<property name="mappings">
<props>
<!--配置test请求对应的Handler-->
<prop key="/test">testHandler</prop>
</props>
</property>
</bean>
<!--配置Handler-->
<bean id="testHandler" class="com.imooc.handler.MyHandler"></bean>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置视图解析器的前缀后缀-->
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
***************在web.xml当中配置DispatcherServlet******************
<!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文件的位置-->
<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>
************************************流程***********************************
当用户发出请求时,首先被web.xml当中的DispatcherServlet俘获,然后DispatcherServlet按照springmvc.xml当中当中的配置根据HandlerMapping找
到对应的Handler,Handler处理的结果是返回一个ModelAndView组件,然后DispatcherServlet根据springmvc.xml当中配置的ViewResolver来解析出ModelAndView,然后返回给客户端。
4.基于注解方式的使用
1.SpringMVC基础配置
2.Controller,HandlerMapping通过注解进行映射配置
3.XML配置ViewResovler
***************************************springmvc.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:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
">
<!--将AnnotationHandler这个类交给IOC容器去管理-->
<context:component-scan base-package="com.imooc.handler"/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置视图解析器的前缀后缀-->
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
************************************自定义的Handler*******************************
package com.imooc.handler;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.Map;
/**
* 注意基于注解的Handler不需要实现Controller接口
* 此时我们可以自己写一个方法来处理业务逻辑
*/
@Controller
public class AnnotationHandler {
/**
* 使用注解的方式的时候,可以不用实现Controller接口,然后自己写一个业务方法
* @return ModelAndView
*
* 将业务方法与请求对应起来(modelAndViewTest)
* 告诉控制器modelAndViewTest这个业务方法是处理/modelAndViewTest这个请求的
*/
@RequestMapping("/modelAndViewTest")
public ModelAndView modelAndViewTest(){
/**
* 创建ModelAndView对象
*/
ModelAndView modelAndView=new ModelAndView();
/**
* 封装数据
*/
modelAndView.addObject("name","Tom");
/**
* 指定逻辑视图
*/
modelAndView.setViewName("show");
return modelAndView;
}
/**
* 业务方法:model来传值,string进行视图解析
* 此方法相当于把ModelAndView分成2部分
*/
@RequestMapping("/modelTest")
public String ModelTest(Model model){
/**
* 填充模型数据
*/
model.addAttribute("name","catalina");
/**
* 返回模型视图
*/
return "show";
}
/**
* 业务方法:Map集合传值,string进行视图解析
*/
@RequestMapping("/mapTest")
public String Maptest(Map<String,String> map){
/**
* 填充数据模型
*/
map.put("name","cat");
/**
* 返回模型视图
*/
return "show";
}
}
基于注解的方式和基于xml的方式的区别只在第二步,即一个是要值springmvc.xml当中配置(HandlerMapping,和Handler),一个追需要在类里面配置(HandlerMapping,和Handler).
5.SpringMVC的<mvc:annotation-driver/>标签详解
在实际开发当中通常都是要加这个标签的
<mvc:annotation- driven/>会自动册
RequestMappingHandlerMapping、RequestMappingHandlerAdapter 、ExceptionHandlerExceptionResolver三个bean。
还将提供以下支持:
支持使用 Conversion service实例对表单参数进行类型转换
支持使用@ Number Formatannotation、@ DateTime Format注解完成数据类型的格式化
支持使用@vaid注解对 Java Bean实例进行JsR303验证
支持使用@ RequestBody和@ Response Body注解