Spring MVC体系结构和处理请求控制器
MVC设计模式
通常的Web项目,架构模式基本分层
- 数据库访问接口:DAO层
- 处理业务逻辑:Service层
- 数据实体:POJO
- 负责前端请求的接受处理:Servlet
- 负责前端页面展示:JSP
MVC设计模式:它是软件工程中的一种软件架构模式。它强制性地使软件系统的输入、处理和输出分开。把软件系统分为三个基本部分:模型(Model)、视图(View)、控制器(Controller)
- 视图(View):负责格式化数据并把他们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。对应组件:JSP或者HTML文件
- 控制器(Controller):负责接收并转发请求,对进行处理后指派视图并将响应结果发送给客户端。对应组件Servlet
- 模型(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,负责数据逻辑(业务规则)的处理和实现数据操作。对应组件:JavaBean(处理业务逻辑Service层,数据库操作相关的DAO层,贯穿各层之间的数据模型,数据实体POJO)
MVC的两种模式
(1)JSP Model1
- 业务流程较为简单时,可以把控制器的功能交给视图实现。故Model1模式只有视图和模型,没有控制器(JSP+JavaBean)
- 浏览器 - 请求 - JSP - JavaBean - 数据库 - JavaBean - JSP -响应 - 浏览器
(2) JSP Model2
- 相比JSPModel1,业务流程复杂时,就需要把业务流程控制交给控制器来实现。即(JSP+Servlet+JavaBean)
- 浏览器 - 请求 - Servlet - JavaBean- JSP - 数据库 - JavaBean - JSP -Servlet -响应 - 浏览器
MVC处理过程
MVC的整体结构,对于MVC三个部分(模型、视图、控制器)功能职责分别进行了相应的阐述
(1)首先视图提供系统与用户交互的界面,并发送用户输入给控制器
(2)控制器接收用户的请求,并决定应该调用哪个模型来进行处理
(3)模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据)
(4)控制器根据返回的处理结果,调用相应的视图格式化模型返回的数据,并通过视图呈现给用户结果
MVC优缺点
- 优点
- 多视图共享一个模型,大大提高代码的可重用性
- MVC三个模块相互独立,松耦合架构
- 控制器提高了应用程序的灵活性和可配置性
- 有利于软件工程化管理
通过MVC的设计模式最终可以打造出一个松耦合+高重用性+高可适用性的架构
2.缺点
- 原理复杂
- 增加了系统结构和实现的复杂性
- 视图对模型数据的低效率访问
MVC来说:并不适合小型甚至中型规模的项目,花费大量时间将MVC应用到规模并不是很大的应用程序通常得不偿失
Spring MVC介绍及其环境搭建
Spring MVC框架介绍
Spring MVC是Spring框架中用于Web应用开发的一个模块,是Spring提供的一个基于MVC设计式的优秀Web开发框架,本质上相当于Servlet。在MVC设计模式中,Spring MVC作为控制器来建立模型与视图的数据交互,是机构最清晰的MVC Model2实现。
Spring MVC框架中,Controller替换Servlet来担负控制器的职责,Controller接收请求,调用相应的Model进行处理,处理器完成业务处理后返回处理结果。Controller调用相应的View并对处理结果进行视图渲染,最终相应给客户端。
Spring MVC环境搭建
在idea中新建Web Project后,使用Spring MVC框架的步骤
- 引入jar文件
- 在web.xml中配置Servlet,定义DispatcherServlet
- Spring MVC是基于Servlet的,DispatcherServlet是整个Spring MVC框架的核心,它负责截获请求并将其分派给相应的处理器处理。那么配置Spring MVC,首先要进行DispatcherServlet的配置,当然跟所有的Servlet一样,用户必须在web.xml中进行配置。
-
<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:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
-
- Spring MVC是基于Servlet的,DispatcherServlet是整个Spring MVC框架的核心,它负责截获请求并将其分派给相应的处理器处理。那么配置Spring MVC,首先要进行DispatcherServlet的配置,当然跟所有的Servlet一样,用户必须在web.xml中进行配置。
- 创建Spring MVC的配置文件
- 项目工程下创建resources目录(Source Folder),在目录下添加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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<bean name="/index.html" class="com.controller.IndexController"/>
<!--视图对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans> -
DispatcherServlet将一个请求通过咨询HandlerMapping的Bean,交给特定的Controller处理,Spring提供了多种处理器映射(HandlerMapping)支持
- org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
- org.springframework.web.servlet.handler.SimpleUrlHanderMapping
- org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
- org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping等。
- 可以根据需求进行处理器映射选择,Spring默认使用BeanNameUrlHandlerMapping,即在Spring容器中查找与请求URL同名的Bean。
-
- 项目工程下创建resources目录(Source Folder),在目录下添加Spring MVC的xml配置文件
- 创建Controller(处理请求的控制器)
- 配置好相关环境,开始编写Controller和View
-
public class IndexController extends AbstractController {
protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
System.out.print("hello,SpringMVC!");
return new ModelAndView("index");
}
}
-
- 配置好相关环境,开始编写Controller和View
- 创建View
- 根据spring-servlet.xml中配置的prefix(前缀)路径和suffix(后缀)-.jsp,我们在WEB-INF下创建jsp文件夹,在文件夹下创建jsp视图-index.jsp,由于IndexController返回的逻辑视图名称为index,那么通过视图解析器会将视图逻辑解析为/WEB-INF/jsp/index.jsp。
- 部署运行
- 当用户发送URL请求,根据web.xml中对DispatcherServlet的配置,找到相应bean标签中的name属性名通过返回相应属性名,并根据HandlerMapping找到处理相应请求的Controller来处理请求;Controler处理完后,返回ModelAndView对象;该对象告诉DispatcherServlet需要通过那个视图来进行数据模型展示,DispatcherServlet根据视图解析器把Controller返回的逻辑视图名转换成真正的View并输出。逻辑视图名并不是真正的视图而只是视图名的一部分,通过springmvc.xml中指定的前缀后缀与逻辑视图名的拼接得到最好的视图名进行渲染
7. 更改HeandlerMapping(处理器映射)
首先更改Spring MVC的处理器映射的配置为支持注解式处理器,配置标签,它是Spring MVC提供的一键式配置方法,配置此标签,Spring MVC会帮助我们自动做一些注册组件之类的事情。
<mvc:annotation-driven/>
<context:component-scan base-package="com.controller"/>
注解:@Controller - 指定为控制器类
@RequestMapping("/index") - 设置唯一的URL 可以看做Handler
Spring MVC框架的请求处理流程及体系结构
- 首先用户发送请求到前端控制器(DispatcherServlet),前端控制器根据请求信息决定选择页面控制器(Controller)来进行处理,并把请求委托给它
- 页面控制器接收到请求后,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)
- 前端控制器回收控制权,然后根据返回的逻辑视图名,选择相应的真正视图,进行渲染
Spring MVC框架的特点
1.清晰的角色划分。SpringMVC在Model、View和Controller方面提供了一个非常清晰的角色划分,这三个方面真正是各司其职。
2.灵活的配置功能。因为Spring的核心是IoC,同样在实现MVC上,也可以吧各种类当作Bean来通过XML配置。
3.提供了大量额控制器接口和实现类。开发者可以使用Spring提供的控制器实现类,也可以自己实现控制器接口。
4.真正做到与View层的实现无关(JSP、Velocity、XSLT等)。它不会强制开发者使用JSP,也可以根据项目需要使用Velocity、XSLT等技术、
5.国际化支持
6.面向接口编程
7.Spring提供了Web应用开发的一整套流程
Spring MVC总结
框架搭建
请求处理流程
核心组件
DispatcherServlet(前端处理器)
Handler(请求处理器)
HandlerMapping(处理器映射)
使用bean方式指定
<bean name="/index.html" class="com.controller.IndexController"/>
使用注解方式指定@Controller - @RequestMapping
<mvc:annotation-driven />
<context:component-scan base-package="com.controller"/>
HandlerAdapter
ViewResolver
参数传递
@RequestMapping - 可以在类定义和方法定义,定义的参数是全局唯一,如果有相同级别相同名称则会报错,类级别大于方法级别 |
映射规则:
通过请求URL映射:
RequestMapping请求的参数底层定义的是数组类型所以定义的方式可以为:@RequestMapping("/index") @RequestMapping({"/index","/"}) @RequestMapping(value="/index")
通过请求参数进行映射:方法参数直接入参的话,方法入参名必须与请求名保持一致
通过请求方式进行映射:get \ post
@RequestMapping(value="/index",method=RequestMethod.GET,params="username")
@RequestParam - 在控制器类中指定参数入参
value - 请求的入参参数 public String method(@RequestParam(value="username",required=false)String username)
required - 请求的参数是否必须设置了这个参数如果为false不必要参数的话,不想输入参数时,@RequestMapping设置了参数还是必须输入参数,所以不想输入参数时:1.将required设置为false,2.将@RequestMapping的入参参数取消
ModelAndView
控制器处理方法的返回值若为ModelAndView,则包含视图信息,又包含模型数据信息。有了该对象后,Spring MVC就可以使用视图对模型数据进行渲染。
(1)添加模型数据
ModelAndView addObject(String attributeName,Object attributeValue);该方法第一个参数为key,第二个参数为value。key值可以随意指定必须保证在Model的作用域中唯一。
(2)ModelAndView addAllObjects(Map<String,?> modelMap);模型对象也是一个Map对象,可以添加Map对象到Model中。
(3)void setView(View view);指定一个具体的视图对象。
(4)void setViewName(String viewName);指定一个逻辑视图名
Model
除了可以使用ModelAndView对象返回模型数据,还可以使用Spring MVC提供的Model对象来完成模型数据传递。
Model addAttribute(String value) - 默认以对象的类型作为key值 string
Model addAttribute(Object obj,String value)
Model addAllAttributes(Map<String,?> modelMap)
把需要传递的参数放入Model中即可,返回字符串类型的逻辑视图名。在JSP页面中直接使用EL表达式即可获得参数