1.1简介
Spring MVC是spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了机会是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过spring的依赖注入功能,这些bean被注入到控制器中 。
Spring MVC主要由前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对象(Command 请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。构成
1.2SpringMVC优势
- 清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器( Validator)、命令对象(Command 请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。
- 分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要;
- 由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象;
- 和Spring 其他框架无缝集成,是其它Web框架所不具备的;
- 可适配,通过HandlerAdapter可以支持任意的类作为处理器;
- 可定制性,HandlerMapping、ViewResolver等能够非常简单的定制;
- 功能强大的数据验证、格式化、绑定机制;
- 利用Spring提供的Mock对象能够非常简单的进行Web层单元测试;
- 本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。
- 强大的JSP标签库,使JSP编写更容易。
1.3springMVC的运行原理
首先让我们了解下 MVC(Model-View-Controller)三元组的概念:
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或 JavaBean 组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据) 和 服务层(行为)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
领域模型
javaBean组件等价于 域模型层 + 业务逻辑层 + 持久层
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,
由视图负责展示。 也就是说控制器做了个调度员的工作,。
Springmvc运行原理流程
核心架构的具体流程步骤如下:
1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
1.3入门使用
1.导入jar包这里使用的是maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
2.配置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>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3.创建mvc-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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--1.配置url处理映射
url处理映射的方式有三种:
1.BeanNameUrlHandlerMapping[通过url名找到对应bean的name的控制器]
2.SimpleUrlHandlerMapping:[简单的url处理映射]通过key找到id的控制器 了解就行
3.ControllerClassNameHandlerMapping[控制器类名处理映射]不要配置路径
默认路径就是类名,首字母小写,后面加上.do就行-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--2.配置控制器处理适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--3.配置控制器 相当于配置了访问路径 name="/user.do" id="userController"-->
<bean name="/user.do" class="com.ywj.controller.UserController"></bean>
<!--4.配置资源视图解析-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/views/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4.创建一个Controller控制器UserController
package com.ywj.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
/**
* @ClassName UserController
* @Author ywj
* @Describe
* @Date 2019/1/14 0014 7:41
*/
public class UserController implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView=new ModelAndView("user/user");
modelAndView.addObject("name","花花");
return modelAndView;
}
}
5.创建页面user.jsp
6.运行项目访问路径
如果页面使用不了el表达式只要将这个语句替换你的页面的语句就可以了
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" isELIgnored="false"%>
1.4Url处理器映射(了解)
BeanNameUrlHandlerMapping
通过url名找到对应bean的name的控制器:比如通过user.do找到UserController
SimpleUrlHandlerMapping
[简单的url处理映射]通过key找到id的控制器 了解就行
ControllerClassNameHandlerMapping
[控制器类名处理映射]不要配置路径
默认路径就是类名,首字母小写,后面加上.do就行
这个在spring5.多已经被删除了所以不做演示只做解释
1.5处理器适配器
SimpleControllerHandlerAdapter
功能:执行Controller调用Controller里面的handleRequest方法返回ModelAndView
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
控制器的方法在上文
HttpRequestHandlerAdapter
和上个方法的区别就是没有返回值所以控制器的写法也不同(这个只作为了解即可)
配置:
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<bean name="/http.do" class="com.ywj.controller.UserHttpController"></bean>
控制器想要达到上文的效果写法为:
package com.ywj.controller;
import org.springframework.web.HttpRequestHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @ClassName UserHttpController
* @Author ywj
* @Describe
* @Date 2019/1/14 0014 10:06
*/
public class UserHttpController implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
//这是一个无返回的
httpServletRequest.setAttribute("name","花花");
httpServletRequest.getRequestDispatcher("/views/user/user.jsp").forward(httpServletRequest,httpServletResponse);
}
}
欲知后事如何,且听下回分解