MVC是一种分层的思想,Spring已经写好了MVC的结构供使用,这里简单了解一下。
MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。--来自百度
SpringMVC,是Spring框架里用来简化基于MVC架构的web应用程序开发的框架,控制器C做两件事情,一是接受请求,根据请求调用相应模型M来处理请求,第二是依据模型M返回的结果调用视图V。为了实现控制器的上述功能,需要在xml文件中来配置完成。
SpringMVC五大组件
SpringMVC有五大组件,其组成了一个MVC的结构。
(1)DispatcherServlet
DispatcherServlet:前端控制器,接受Web端请求
(2)HandlerMapping
HandlerMapping:映射处理器,告诉前端控制器请求应该交给哪个处理器M来处理
(3)Controller
Controller:处理器,负责执行具体的任务,可调用DAO等组件,编写时需要实现Controller接口及约定方法,处理器将处理结果封装成一个对象,处理成ModelAndView对象返回给前端控制器
(4)ModelAndView
ModelAndView:处理结果和视图名,视图名是一列字符串,会发送给前端控制器,比如视图名可能是hello.jsp,也可能是freemarker或者velocity类型,不一定是用jsp一种视图技术
(5)ViewResolver
ViewResolver:视图解析器,会解析前端控制器发给它的视图名字符串做出处理,可能是处理jsp,也可能是freemarker或者velocity等,解析完成后,前端控制器发送页面给浏览器
简单来说,DispatcherServlet和HandlerMapping配合使用进行请求分发,因此对应就是C结构。Controller对分发的请求进行处理,并返回一个包含数据和视图名的ModelAndView对象给前端控制器DispatcherServlet,因此其就是M结构。前端控制器DispatcherServlet将ModelAndView对象交给视图解析器ViewResolver来处理,视图解析器将页面渲染后发送浏览器,其就是V结构。
SpringMVC如何使用
按照如下步骤来,可以实现一个简单的SpringMVC结构。
step1.导包 spring-webmvc,pom.xml中配置
1 <dependency> 2 <groupId>org.springframework</groupId> 3 <artifactId>spring-webmvc</artifactId> 4 <version>4.2.3.RELEASE</version> 5 </dependency>
step2.添加配置文件spring-mvc.xml,暂时为默认文件无任何添加配置信息
step3.配置前端控制器DispatcherServlet,在web.xml中配置,由前端控制器来启动spring容器
1 <!-- 配置DispatcherServlet --> 2 <servlet> 3 <servlet-name>springmvc</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <!-- DispatcherServlet的初始化方法会启动spring容器,contextConfigLocation用来指定spring配置文件的位置 --> 6 <!-- 初始化参数,配置spring容器启动读取配置文件的路径 --> 7 <init-param> 8 <param-name>contextConfigLocation</param-name> 9 <param-value>classpath:spring-mvc.xml</param-value> 10 </init-param> 11 <!-- 设置tomcat启动就创建spring容器 --> 12 <load-on-startup>1</load-on-startup> 13 </servlet> 14 <servlet-mapping> 15 <servlet-name>springmvc</servlet-name> 16 <url-pattern>*.do</url-pattern> 17 </servlet-mapping>
step4.写Controller
1 package Controller; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.springframework.web.servlet.ModelAndView; 7 import org.springframework.web.servlet.mvc.Controller; 8 9 /** 10 * 处理器,需要实现Controller接口 11 * @author yangchaolin 12 * 13 */ 14 public class helloController implements Controller{ 15 /** 16 * handleRequest方法名固定,返回值类型ModelAndView也固定,后续有其他方式可以更改 17 */ 18 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { 19 System.out.println("handleRequest"); 20 /** 21 * ModelAndView有两个常用的构造器 22 * ModelAndView(String viewName) 23 * ModelAndView(String viewName,Map data) 24 * viewName就是视图名,Map就是处理结果 25 */ 26 return new ModelAndView("hello");//返回视图名hello 27 } 28 }
step5.写jsp
在WEB-INF下添加hello.jsp用于测试
1 <h1>hello springmvc</h1>
step6.配置HandlerMapping和viewResolver
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" 4 xmlns:jee="http://www.springframework.org /schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 5 xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation=" 7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 9 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd 10 http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd 11 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 12 http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd 13 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 14 15 <!-- 配置HandlerMapping,使用HandlerMapping接口下的实现类SimpleUrlHanderMapping --> 16 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 17 <property name="mappings"> 18 <props> 19 <prop key="/hello.do">helloController</prop> 20 <!-- 当地址为/hello.do时,会根据它的value:helloController,去寻找bean id为helloController的对象 --> 21 <!-- Mapping中存入的是properties对象,key为url,value为控制器的id --> 22 </props> 23 </property> 24 </bean> 25 26 <!-- HandlerMapping会根据设置的mapping,根据url去寻找对应的bean id,然后启动对应的Controller --> 27 <!-- 配置Controller --> 28 <bean id="helloController" class="Controller.helloController"> 29 30 </bean> 31 32 <!-- 配置视图解析器viewResolver --> 33 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 34 <property name="prefix" value="/WEB-INF/" /> 35 <property name="suffix" value=".jsp" /> 36 <!-- 前缀和后缀配置,视图名hello通过上面的配置可以映射到/WEB-INF/hello.jsp --> 37 </bean> 38 39 </beans>
配置视图解析器需要根据使用的实际情况来配置,如果是jsp,可以使用InternalResourceViewResolver,如果是velocity,使用VelocityViewResolver,如果是freemarker,使用FreeMarkerViewResolver。
测试访问结果
结论
SpringMVC的出现可以简化开发,以前写的一个项目使用Servlet+JSP,需要写一个servlet类(相当如C)来专门处理请求,在重写的service方法里写业务逻辑(相当如M)和需要返回的视图(相当如V),这样代码不够好维护,SpringMVC的出现可以解决这个问题,并且让代码具有可扩展性。
参考博客