一、MVC的引入
1.1 什么是MVC
- MVC是模型(Model 用于封装数据)、视图(View 渲染数据与跳转页面)、 控制器(Controller 表现层中的资源)的简写,是一种软件设计规范。
- 是将业务逻辑、数据、显示分离的方法来组织代码。
- MVC主要作用是降低了视图与业务逻辑间的双向偶合。
- MVC不是种设计模式,MVC是一种架构模式,不同的MVC存在差异。
- Model (模型) :数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在般 都分离开来: Value Objeat (数据Dao)和服务层 (行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
- View (视图)负贡进行模型的展示,一般就是我们见到的用户界面。客户想看到的东西。
- Controller (控制器) :按收用户请求,委托给模型进行处理(状态改变),处理完华后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作
1.2 SpringMVC
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级 Web框架:
Spring MVC的特点:
- 1.轻量级,简单易学。
- 2.高效,基于请求响应的MVC框架
- Spring兼容性好,无缝结合
- 4.约定优于配置
- 5.功能强大: RESTful. 数据验证、格式化、本地化、上题等
- 6.简法灵活
1.3 DispatcherServlet
- Spring的web框架围绕DispatcherServlet调度
Servlet设计。
DispatcherServlet的作用定将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上
版本的用户可以采用基于注解形式进行开发
二、MVC的应用
2.1 导入支持jar包

2.2 Controller测试
2.2.1 配置xml文件 添加约束

在配置xml文件时需要注意
- 注册controller组件时,需要注意注册资源id不能与controller组件重名。
- 由于我们需要在controllerTest中访问jsp,需要让服务器找到这个jsp文件,所以需要一个视图解析器进行解析以及前后缀的添加。
学习要点:配置视图解析器
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--注册资源路径,id通常都是一个资源路径,controller通常视为资源,class为全类名--><bean id="/controller1" class="com.SpringMVC.ControllerTest"></bean><!--注册controller组件--><!--配置视图解析器--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--设置视图的前缀--><property name="prefix" value="/jsp/"></property><!--设置视图的后缀--><property name="suffix" value=".jsp"></property></bean></beans>
2.2.2 controllerTest类
学习要点:controller组件的写法:
public class ControllerTest implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {//创建一个实例ModelAndView modelAndView = new ModelAndView();//封装数据modelAndView.addObject("message","hello mvc");//设置视图名称(就是test.jsp)modelAndView.setViewName("test");return modelAndView;}}
2.2.3 配置web.xml文件
dispatcherServlet的配置
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置前端总控制器--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--绑定spring核心配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:xml/springmvc.xml</param-value></init-param><!--设置启动级别:希望在tomcat服务器启动的时候就去加载核心容器对象--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><!--拦截客户端所有的请求--><url-pattern>/</url-pattern></servlet-mapping></web-app>
三、MVC的执行流程
- 客户端会给服务端发送请求,springMVC会通过DispatcherServlet来进行资源的拦截 http://loca1host:8080/web/ controller1
- DispatcherServlet拦截到请求之后,会调用一个处理映射器handlerMapping来解析地址,将解析的结果告知DispatcherServlet
- DispatcherServlet会调用一个处理适配器handlerAdapter从容器中心配到对应的资源(根据资源路径来匹配具体的资源)
- 匹配的资源之后,会将结果告知DispatcherServlet,然后再去执行具体的Controller
- 封装数据、处理数据,将数据封装到model中,设置视图名称返@model和view给DispatcherServlet
- DispatcherServlet会调用视图解析器来解析view中的视图,然后在将结果告DispatcherServlet
- DispatcherServlet会根招解析好的视图来进行视图页面的跳转,然后渲染数据。
四、mvc基于注解的方式进行开发
流程 :
- 配置xml 文件,(添加依赖、开启扫描包、过滤、视图解析器)
- 配置web.xml文件:配置前端总控制器、绑定spring核心配置文件、设置启动级别、拦截客户端所有的请求
4.1 xml核心文件配置

一、根据使用来确定依赖:基本是根据mvc的依赖再结合context的依赖组合而成的。
<!--开启扫描包--><context:component-scan base-package="com.SpringMVC"></context:component-scan><!--过滤静态资源--><mvc:default-servlet-handler></mvc:default-servlet-handler><!--开启mvc注解支持--><mvc:annotation-driven></mvc:annotation-driven><!--配置视图解析器--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--设置前缀--><property name="prefix" value="/jsp/"></property><!--设置后缀--><property name="suffix" value=".jsp"></property></bean>
4.2 web.xml的配置
注意前端总控制器的DispatcherServlet,配置时使用的名字为dispatcherServlet,以及注意核心配置文件的路径修改。
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置前端总控制器--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--绑定spring核心配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:xml/springmvc02.xml</param-value></init-param><!--设置启动级别:希望在tomcat服务器启动的时候就去加载核心容器对象--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><!--拦截客户端所有的请求--><url-pattern>/</url-pattern></servlet-mapping></web-app>
4.3 controller层的配置,
- 不需要使用
public class ControllerTest implements Controller { @Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {return null}
- 直接添加注解
- 使用@Controller注解的类是不需要在xml文件中进行注册的。
- @RequestMapping(“/user”) 用于声明资源路径 ,用于地址的映射。
- @ResponBody 可以直接返回一个字符串给客户端
@Controller 可以让当前类的实例交由spring容器管理,该类下的方法返回值如果是String类型的,那么该返回值将会看成是视图,并且会通过视图解析器进行解析,然后跳转到具体的视图。
@Controller//配置一个资源路径@RequestMapping("/user")public class UserContorller {//model是一个域对象 底层是一个request域@RequestMapping("/test01")public String getTest01(Model model){model.addAttribute("message","hello SpringMVC");return "test1";//转发到test1.jsp下}}
4.4 访问测试:
根据我们的两次@RequestMapping("/user")、@RequestMapping("/test01")使用的位置路径,需要注意我们的访问路径为:[http://localhost:8080/web/user/test01](http://localhost:8080/web/user/test01)
五、基于MVC的前端数据的回传
5.1 参数回传
@RequestMapping("/test02")public void getTest02(int i,String name) {System.out.println(i);System.out.println(name);}
访问如下:对数据进行赋值,即可实现数据回传。
http://localhost:8080/web/user/test02?i=10&name=jack
5.2 视图失效
@ResponseBody 让当前方法的视图失效,然后可以直接返回数据给客户端
@RequestMapping("/test04")@ResponseBodypublic String getTest04(MvcVo mvcVo){return "hello";}
使得数据失效,return “hello”;直接向客户端(网页)传递字符串,而不是跳转视图。
