一、什么是MVC
MVC是模型、视图、控制器的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。
MVC用于表现层,主要作用是降低了视图和业务逻辑之间的双向耦合
MVC不是一种设计模式,是一种架构模式,不同的MVC存在差异
Model(模型):
数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao)和服务层(行为Service))。也就是模型提供了 模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View(视图):
负责进行模型的展示,,一般就是我们见到的用户界面,客户想看到的东西。
Controller(控制器):
接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。
特点:
- 轻量级,简单易学
- 高效,基于请求响应的web框架
- 与spring兼容性好,无缝结合
- 约定优于配置
- 功能强大:RESTful、数据验证、格式化、本地化、主题等
- 简洁灵活
二、springMVC如何配置:
1.在web.xml中配置dispatcherServlet:mvc框架前端总调度器(会去完成web交互时的各种调度工作)
<?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>
2.由于mvc属于spring的功能模块,所以必须得有核心容器的支持,因此需要配置spring的配置文件springmvc.xml:
<?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"><!--注册controller组件--><bean id="/controller" class="com.jy.controller.TestController"></bean><!--注册一个处理映射器--><bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean><!--注册一个适配器--><bean id="adapter" class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean><!--注册视图解析器--><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--设置视图的前缀--><property name="prefix" value="/jsp/"></property><!--设置视图的后缀--><property name="suffix" value=".jsp"></property></bean></beans>
其中的处理映射器和适配器可以不用配置,其他组件都需要配置
三、重点:springmvc的整体调度流程
1、客户端发送请求给服务端,springMVC框架会通过DispatcherServlet来做一个资源的拦截(比如http://localhost:8080/servlet/controller1)
2、DispatcherServlet会调用处理映射器HandlerMapping来完成对地址的解析,然后把解析的信息告诉DispatcherServlet
3、DispatcherServlet调用处理适配器HandlerAdapter从容器中找到对应的资源(会找到controller1对应的资源)
4、HandlerAdapter找到对应资源之后,会去调用具体的Controller(然后回去封装数据,设置视图名称)
5、执行完逻辑之后,HandlerAdapter将controller执行结果视图和模块(ModelAndView)返回给DispatcherServlet6、继续调用ViewResolver视图解析器来解析ModelAndView里面视图名称,然后根据视图解析器内部的匹配规则来定位到具体的前端资源(jsp)7、ViewResolver在解析完之后会将解析的信息告诉DispatcherServlet,然后回去做具体的页面跳转、数据渲染等工作!!<br />
四、springMVC基于注解<mvc:default-servlet-handler/> :让springmvc不处理静态资源<mvc:annotation-driven>:支持mvc注解驱动InternalResourceViewResolver:视图解析器
@Controller : 如果只是在spring框架中使用,就是将当前类的实例存放到容器中,如果在springmvc中,它不仅可以存实例到容器,还可以将该类下任意返回值是String的方法的返回值作为一份视图名称,用于视图跳转。
@RequestMapping: 用于地址的映射 ,可以修饰类与方法
@ResponseBody :让当前视图失效,像普通方法一样只返回数据
@Controller@RequestMapping("user")public class UserController{@RequestMapping("test")public String getTest(){return "test";}@ResponseBody@RequestMapping("test02")public String getTest02(){return "test02";}}
web.xml同上
springmvc.xml:
<?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"xmlns:context="http://www.springframework.org/schema/context"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.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--开启扫描包--><context:component-scan base-package="com.jy"></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="/WEB-INF/jsp/"></property><!--设置后缀--><property name="suffix" value=".jsp"></property></bean></beans>

五、springmvc如何接收前端传递的值
springmvc可以支持参数接值,在前端需要传递的数据,后端可以使用参数进行接收。
@RequestMapping("test03")public String getTest03(String name,String password){System.out.println(name+" "+ password);return "test";}
spirngmvc在参数列表中,可以通过实体接值
Mvc是自定义的一个类
@RequestMapping("test04")public String getTest04(Mvc mvc){System.out.println(mvc);return "test";}
六、springmvc如何将封装的数据存到Model中
例如
将接收到的数据响应到浏览器
@RequestMapping("test05")public String getTest05(Mvc mvc, Model model){/*** 把实体存到Model中* model.addAttribute 底层封装的是request域*/model.addAttribute(mvc);return "test02";}

七、转发与重定向
转自:https://blog.csdn.net/liuhaiyang98/article/details/119767988
当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重定向。而根据所要跳转的资源类型,又可分为两类:跳转到页面与跳转到其它处理器。
注意,对于请求转发的页面,可以是 WEB-INF 中页面;而重定向的页面,是不能为 WEB-INF 中页的。因为重定向相当于用户再次发出一次请求,而用户是不能直接访问 WEB-INF 中资源的。 ```java @Controller public class MyController {/**
- 控制器方法返回值是ModelAndView实现转发forward
- 语法:mv.setViewName(“forward:视图完整路径”)
forward特点:不和视图解析器一同工作的,就当项目中没有视图解析器 / @RequestMapping(value = “/forward.do”) public ModelAndView doforward(){ ModelAndView mv=new ModelAndView();
mv.addObject(“msg”,”在ModelAddView中处理了doforward.do的请求”); //请求转发 mv.setViewName(“forward:WEB-INF/view/show.jsp”);
return mv; }
/**
- 当控制器方法返回modelAndview实现重定向 语法: mv.setViewName(“redirect:视图完整路径”)
- redirect特点:不和视图解析器一同工作,相当于项目中没有视图解析器
- 框架提供重定向的功能 (不能访问WEB-INF)
- 1.框架可以实现两次请求之前的数据传递,把第一次请求中的model里面简单类型的数据转换中成为字符串
- 附加到目标页面的后面,做get传递参数。也可以在目标页面中获取参数值使用
2.在目标页面中,可以使用${param.参数名} 获取参数的值 */ @RequestMapping(“/redirect.do”) public ModelAndView doRedirect(String name,Integer age){ System.out.println(“在ModelAddView中处理了doRedirect.do的请求”);
ModelAndView mv=new ModelAndView();
mv.addObject(“name”,name); //请求重定向 mv.setViewName(“redirect:/other.jsp”);
return mv; }
