Spring MVC介绍
目录大纲
• Spring MVC的介绍
• Spring MVC的运行原理
• 各个组件介绍:前端控制器,处理器适配器,处理器映射器,视图解析器
• Spring MVC的使用Demo
• 处理器和映射器的配置(xml配置和注解)
• Spring MVC和Mybatis的整合(SSM整合)
• 方法入参和返回值的详解
• 图片上传功能(大文件处理的问题:图片,视频,音频)
• JSON格式的数据传输
• 异常处理机制
• RESTFul风格的接口
• 拦截器
Spring MVC的介绍
Java EE体系结构包括四层,从上到下应用层,web层,业务层,持久层,Struts和Spring MVC是web层的框架,Spring是业务层的框架,Hibernate和Mybatis是持久层框架
Spring MVC是一种基于Java,实现了Web的MVC设计模式,请求驱动类型的轻量级web框架,即使用了MVC架构模式的思想,将Web层进行指责解耦,基于请求驱动指的就是请求响应模型,
框架存在的目的是帮助简化开发,Spring MVC简化web开发
MVC模式的演进
在早期的Java Web的开发中,统一将显示层,控制层、数据层的操作交给JSP或者是JavaBean来进行处理
早期的web开发的交互图存在大的弊端
JSP和JavaBean之间严重耦合,Java代码和HTML代码也耦合
开发中不经要掌握Java,还需要掌握前端技术
前后端存在相互依赖,前端需要等待后端完成,后端也依赖前端完成,才能进行有效的测试,代码难以复用的(前后端分离)
很快提出了新的方式:servlet+Jsp_JavaBean锁替代,早期的MVC模式演进如下:
用户请求首先到达servlet,然后根据请求调用相应的Java Bean,将结果显示交给JSP去完成,这样的模式成为MVC模式
M代表模型(Model)
模型就是数据,就是dao、bean
V代表视图(View)
就是页面、JSP用来展示模型中的数据
C代表控制器(Controller)
控制器就是把不同的数据(Model),显示在不同的视图上(View),servlet扮演控制器的角色
在Spring中给出的MVC的方法如下:
传统的模型层被差分成业务层(Service)和数据访问层(Dao),在service下可以通过Spring的声明式操作数据访问层
特点:
结构松散:几乎所有的SpringMBC使用各类视图
松耦合,各个模块分离
与Spring无缝集成
Spring 架构
Spring MVC是属于SPring的一个模块
SpringMVC和Spring无序通过中间整合即可以进行使用
Spring MVC 是一个基于MVC的Web框架
Spring MVC的运行原理
具体流程:
第一步:用户发起request请求(URL)到前端控制器DispatcherServlet
第二步:前端控制器请求处理映射器HandlerMapping查找Handler,可以通过注解、xml进行查找
第三步:处理器映射器向前端控制器返回映射结果:处理器映射器链HandlerExecutionChain对象,包含一个Handler处理器对象、多个HandlerInterceptor拦截器对象
第四步:前端控制器请求处理器处理器适配器HandlerAdapter请求执行Handler
第五步:处理器适配器执行Handler
第六步:处理器执行完返回给适配器ModelAndView对象,ModelAndView是一个SPring MVC底层的对象,包含了Model和View,Model是业务对象的返回的模型数据,View是逻辑视图名
第七步:处理器适配器返回给前端控制器ModelAndView对象
第八步:前端控制器请求视图解析器ViewResolver解析视图,视图解析器将逻辑视图名解析为具体的View(jsp…)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行页面渲染,视图渲染将模型数据(ModelAndView对象)填充到response域
第十一步:前端控制器向用户响应结果
SPring MVC各组件的介绍
前端控制器DispatcherServlet
由框架提供,不需要开发人员开发
Spring MVC的入口函数,接收请求,响应结果,相当于转发器,中央处理器,有了DispatcherServlet减少其他组件之间的耦合度。它相当于MVC模型中的C(控制器)
处理器映射器HandlerMapping
由框架提供,不需要开发人员开发
根据请求URL查找Handler,即处理器(Controller),Spring MVC提供不同的映射器实现不同的映射方式,例如:配置文件方法,实现接口方式,注解方式等…
处理器适配器HandlerAdapter
由框架提供,不需要开发人员开发
按照特定的规则(HandlerAdapter要求的规则)去执行Handler,进而通过适配器适配到真正执行的处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
处理器Handler
需要开发人员进行开发
按照HandlerAdapter的要求进行编写,这样适配器才可以正确的找到执行Handler,处理器是后端控制器。由于Handler处理用户的具体业务逻辑,一般情况下需要开发人员根据业务进行开发
视图解析器ViewResolver
由框架提供,不需要开发人员开发
进行视图解析,根据逻辑视图名解析成真正的视图View。首先根据逻辑视图名解析成物理视图名即具体的页面地址,在生成View的视图对象,最后将View进行渲染将处理结果通过页面展示给用户,Spring MVC框架提供和诺的View视图类型,包括jstlView,freemarkerView,pdfView…等,一般情况下需要通过页面标签或页面模板的技术将模型数据通过页面展示给用户
视图View
需要开发人员进行开发
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
Spring MVC的使用Demo
从零开始搭建Spring MVC的项目
通过maven管理的web项目,选择如上
创建一个项目名为:SpringMVCTL的web项目,初始化的目录结构如上
SpringMVC 依赖jar包
通过maven管理jar,将依赖添加到pom.xml文件中
<!--Spring MVC依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
SpringMVC是SPring的一部分,所以Spring MVC运行时需要Spring的依赖完整的依赖
在web.xml配置文件中配置前端控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!--配置前端控制器-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!--
第一种:*.action或者*.do:访问是以*.action或者*.do结尾的,由DispatcherServlet进行解析
第二种:/:所有的URL都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet解析(css\js),
使用此方式可以实现RESTFul风格的URL
第三种:/*:使用这种配置,最终要转发到一个jsp页面是:任然会有DispatcherServlet进行jsap地质,不能通过jsp页面扎到Handler,会报错
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
注意:前端控制器是需要使用org.springframework.web.servlet.DispatcherServlet,即该拦截器将所有的请求统一交给DispatcherServlet处理(spring-webmvc)
创建Spring-mvc.xml配置文件
在resource资源目录下,创建spring-mvc.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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<!--配置Spring MVC的需要扫描注解的包路径-->
<context:component-scan base-package="com.tulun.contrller"/>
<!--处理器映射器,适配器采用Spring MVC提供的默认的处理器处理,不需要显性的配置-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
注意:将spring-mvc.xml文件的加载需要在web.xml文件中配置。
编写Handler(Controller层)
/*
处理器
*/
@Controller
public class ControllerDemo {
@RequestMapping("/tulun")
public String tulun() {
//返回ModelAndView对象
//View的逻辑视图名:"/Web-INF/jsp/tulun.jsp"
return "tulun";
}
}
编写View(JSP页面)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<h1 >Hello Tulun</h1>
</body>
</html>
代码的目录结构如下:
部署服务
web代码的执行需要部署到服务器上,常见的服务器由Tomcat、Jetty,Jetty属于轻量级的服务器,在idea中直接使用插件的形式来添加jetty服务器
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.24</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<!--端口号-->
<port>8080</port>
<maxIdleTime>30000</maxIdleTime>
</connector>
</connectors>
<contextPath>/</contextPath>
</configuration>
</plugin>
启动jetty服务器过程如下:
启动服务器
在浏览器上输入URL:localhost:8088/tulun
如果显示以上信息,说明用户请求的整个过程没有问题,获取到了响应结果