一、什么是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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://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)返回给DispatcherServlet
6、继续调用ViewResolver视图解析器来解析ModelAndView里面视图名称,然后根据视图解析器内部的匹配规则来定位到具体的前端资源(jsp)
7、ViewResolver在解析完之后会将解析的信息告诉DispatcherServlet,然后回去做具体的页面跳转、数据渲染等工作!!<br />![](https://cdn.nlark.com/yuque/0/2022/png/21686270/1644241218890-9b45e248-ef36-444d-9cbf-2a2a9822a2ac.png#clientId=u58ce2c41-128f-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u796b625a&margin=%5Bobject%20Object%5D&originHeight=567&originWidth=1091&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=ue666fe62-7ff0-45c5-99e1-e762fbd35ee&title=)
四、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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://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; }