文章目录
一、Spring MVC是什么
Spring MVC是一种基于 Java 的、实现 MVC 设计模型的、请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。
Spring MVC是一个MVC模式的WEB开发框架。它已经成为目前最主流的MVC框架之一,并且随着Spring 3.0的发布,全面超越 Struts2,成为最优秀的 MVC 框架。
Spring MVC通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口,同时它还支持 RESTful 编程风格的请求。
Spring和Spring MVC的相同点:
- 都是容器(管理对象的地方)。
两者的区别:
- Spring可以说是一个管理bean的容器,也可以说是包括很多开源项目的总称。(Spring是管理service和dao层的容器)
- Spring MVC是Spring其中的一个开源项目,是基于Spring功能之上添加的Web框架,想用Spring MVC必须先依赖Spring。(Spring MVC是管理controller对象的容器)
二、Spring MVC的执行流程
Spring MVC的执行流程:
- 用户发送请求至前端控制器
DispatcherServlet
。 DispatcherServlet
收到请求调用HandlerMapping
处理器映射器。- 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给
DispatcherServlet
。 DispatcherServlet
调用HandlerAdapter
处理器适配器。HandlerAdapter
经过适配调用具体的处理器(Controller,也叫后端控制器)。- Controller执行完成返回ModelAndView。
HandlerAdapter
将controller执行结果ModelAndView返回给DispatcherServlet
。DispatcherServlet
将ModelAndView传给ViewReslover视图解析器。- ViewReslover解析后返回具体
View
。 DispatcherServlet
根据View
进行渲染视图(即将模型数据填充至视图中)。DispatcherServlet
响应用户。
Spring MVC的六大组件:
DispatcherServlet
前端控制器。DispatcherServlet
是整个流程控制的中心,相当于 MVC 模式中的 C,由它调用其它组件处理用户的请求。DispatcherServlet 的存在降低了组件之间的耦合性。HandlerMapping
处理器映射器。HandlerMapping
负责根据用户请求即找到对应Handler
。Spring MVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。HandlerAdapter
处理器适配器。通过HandlerAdapter
对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。Handler
处理器。Handler
就是我们开发中要编写的具体业务控制器。由DispatcherServlet
把用户请求转发到Handler
。由Handler
对具体的用户请求进行处理。ViewResolver
视图解析器。ViewResolver
负责将处理结果生成View
视图。ViewResolver
首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成View
视图对象,最后对View
进行渲染将处理结果通过页面展示给用户。View
视图。Spring MVC 框架提供了很多的View
视图类型的支持,包括:jstlView、freemarkerView、pdfView等,最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
三、Spring MVC注解和XML配置
3.1 常用注解
详解springmvc常用5种注解:https://www.jb51.net/article/166604.htm
注解 | 说明 |
---|---|
@RequestMapping | 用于处理请求地址映射,可以作用于类和方法上。 |
@RequestParam | 用于获取传入参数的值。 (当请求参数名称和方法形参不一致时在两者之间手动形成映射) |
@PathViriable | 用于定义路径参数值。 (用在restful风格的请求中,通过占位符解析url地址上的请求参数) |
@ResponseBody | 作用于方法上,可以将整个返回结果以某种格式返回,如json或xml格式。 |
@CookieValue | 用于获取请求的Cookie值。 |
@ModelAttribute | 用于把参数保存到Model对象中。 |
@SessionAttributes | 将模型中的数据存储到request域中。 |
@Controller | 用于实例化Bean,使用在控制层类上。 |
@Service | 用于实例化Bean,使用在service层类上。 |
@Repository | 用于实例化Bean,使用在dao层类上。 |
@Component | 用于实例化Bean,使用在类上。 |
@RequestMapping
请求映射,常用属性如下
- value:用于指定请求的URL。它和path属性的作用是一样的。
- method:用于指定请求的方式。
- params:用于指定限制请求参数的条件,要求请求参数的key和value必须和配置的一模一样。该属性支持简单的表达式。如
params={"accountName"}
请求参数必须有accountName,params={"money!100"}
请求参数中money不能是100。
3.2 MVC命名空间的引入
命名空间:
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
约束地址:
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
3.3 组件扫描
Spring MVC基于Spring容器,所以在进行Spring MVC操作时,需要将Controller存储到Spring容器中,如果使用 @Controller
注解标注的话,就需要使用 <context:component-scan base-package=“com.example.controller"/>
进行组件扫描。
3.4 XML配置说明
Spring MVC有默认组件配置,默认组件都是 DispatcherServlet.properties 配置文件中配置的,该配置文件地址org/springframework/web/servlet/DispatcherServlet.properties ,该文件中配置了默认的视图解析器 org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
该解析器源码中可以看到其默认设置,如下:
REDIRECT_URL_PREFIX = "redirect:" --重定向前缀
FORWARD_URL_PREFIX = "forward:" --转发前缀(默认值)
prefix = ""; --视图名称前缀
suffix = ""; --视图名称后缀
我们可以通过属性注入的方式修改视图的前后缀:
<!--配置内部资源视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
Spring MVC入门案例:https://blog.youkuaiyun.com/weixin_60808029/article/details/124835656#Spring_MVC_712
四、Spring MVC的数据响应方式和获得请求数据
4.1 数据响应方式
有两种数据响应方式:页面跳转、回写数据。
第一种:页面跳转方式
- 返回字符串形式
该方式会将返回的字符串与视图解析器的前后缀拼接后跳转。
@RequestMapping("/quick")
public String quickMethod(){
return "index";
}
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
上述代码代表的转发资源地址是:/WEB-INF/views/index.jsp
。
返回带有前缀的字符串:转发 forward:/WEB-INF/views/index.jsp
,重定向 redirect:/index.jsp
。
- 通过ModelAndView对象返回①
在Controller中方法返回ModelAndView对象,并且设置视图名称。
@RequestMapping(value="/quick2")
public ModelAndView save2(){
/*
Model:模型,用来封装数据
View:视图,用来展示数据
*/
ModelAndView modelAndView = new ModelAndView();
//设置模型数据,数据返回到request域中
modelAndView.addObject("username","itcast");
//设置视图名称
modelAndView.setViewName("success");
return modelAndView;
}
- 通过ModelAndView对象返回②
在Controller中方法形参上直接声明ModelAndView,无需在方法中自己创建,由Spring自行提供并注入,在方法中直接使用该对象设置视图,同样可以跳转页面。
@RequestMapping(value="/quick3")
public ModelAndView save3(ModelAndView modelAndView){
modelAndView.addObject("username","itheima");
modelAndView.setViewName("success");
return modelAndView;
}
@RequestMap