1.Spring MVC框架概念介绍
Spring MVC框架: Spring MVC是Spring Framework的一部分,用于构建基于Java的Web应用程序。它提供了一种轻量级、灵活且可扩展的方式来开发Web应用程序。Spring MVC框架主要关注于分离应用程序的不同层次,并提供了设计模式和现代Web开发的最佳实践。
MVC设计模式: MVC是一种软件设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。每个组件都具有不同的职责,可以独立开发和测试,从而提高了代码的可维护性、可扩展性和可重用性。
以下是MVC设计模式中各个组件的职责:
-
模型(Model):
- 模型表示应用程序的数据和业务逻辑。
- 它负责处理数据的读取、存储和验证。
- 模型通常包含POJO(Plain Old Java Object)或实体类,以及与数据相关的操作。
-
视图(View):
- 视图负责展示模型中的数据给用户。
- 它通常是用户界面的一部分,如HTML页面、JSP页面、Thymeleaf模板等。
- 视图不包含业务逻辑,只负责呈现数据。
-
控制器(Controller):
- 控制器接收用户的请求,并根据请求执行相应的操作。
- 它处理用户输入并决定使用哪个模型和视图来响应请求。
- 控制器通过协调模型和视图之间的交互来实现业务流程。
MVC设计模式的优势包括:
- 分离关注点:将各个组件的职责明确分离,使代码更加模块化,易于维护和测试。
- 可重用性:可以通过使用相同的模型和视图来支持多个控制器,提高了代码的可重用性。
- 灵活性:可以独立扩展和修改模型、视图和控制器,而不影响其他组件。
Spring MVC框架借鉴了MVC设计模式的思想,并提供了一个基于注解和配置的方式来实现MVC架构。它通过DispatcherServlet作为前端控制器,将请求分发给相应的控制器处理,并将结果返回给视图进行展示。
2.Spring MVC 步骤
-
创建一个Maven项目。
- 使用Maven创建一个新的项目结构。
-
在项目的pom.xml文件中添加Spring MVC依赖。
- 在
<dependencies>
标签内,添加Spring MVC相关的依赖。例如:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.10</version> </dependency>
这将引入Spring MVC所需的基本库。
- 在
-
创建Spring MVC配置文件。
- 在
src/main/resources
目录下创建一个spring-mvc.xml
文件(命名可以根据自己的喜好进行调整)。 - 在配置文件中配置Spring MVC相关的组件,如处理器映射器、视图解析器等。
- 在
-
创建控制器。
- 创建一个带有@Controller注解的类,其中包含处理HTTP请求的方法。
- 使用@RequestMapping注解来映射请求的URL和HTTP方法到对应的处理方法。
-
创建视图文件。
- 根据需要,创建JSP、Thymeleaf模板或其他类型的视图文件,用于呈现最终的响应结果。
-
运行应用程序。
- 配置任何必要的服务器(如Tomcat)并将应用程序部署到服务器上。
- 在浏览器中访问应用程序的URL,触发请求处理流程。
3.Spring MVC体系架构
Spring MVC的核心框架结构是基于DispatcherServlet
。下面是Spring MVC请求处理流程的简要概述:
-
客户端发送请求:
- 客户端通过URL向服务器发送HTTP请求,例如
http://example.com/products
.
- 客户端通过URL向服务器发送HTTP请求,例如
-
DispatcherServlet拦截请求:
DispatcherServlet
是Spring MVC的前端控制器,它拦截所有的请求,并协调整个请求处理流程。
-
处理器映射器(Handler Mapping)确定处理器:
DispatcherServlet
将请求传递给处理器映射器。- 处理器映射器根据配置或注解的规则,决定将请求映射到哪个控制器的处理方法上。
-
控制器处理请求:
- 控制器(Controller)是一个被映射的处理器,它会执行与请求对应的处理方法。
- 控制器处理请求时可以进行业务逻辑的处理、调用服务层方法等操作。
-
控制器返回ModelAndView:
- 控制器处理方法的返回值通常是一个
ModelAndView
对象,其中包含了处理结果和视图信息。
- 控制器处理方法的返回值通常是一个
-
视图解析器(View Resolver)解析视图:
- 视图解析器将控制器方法返回的逻辑视图名称解析为实际的视图对象。
- 视图解析器根据配置或规则将逻辑视图名转换为JSP、Thymeleaf模板或其他视图类型。
-
视图渲染:
- 解析后的视图对象将被用来进行视图渲染,将模型数据填充到视图中生成最终的HTML、JSON等响应。
-
响应返回给客户端:
- 经过视图渲染后,
DispatcherServlet
将最终的响应返回给客户端。
- 经过视图渲染后,
在整个请求处理流程中,DispatcherServlet
起到了核心的作用。它负责协调各个组件的工作,如处理器映射器、控制器、视图解析器和视图渲染等,以完成请求的处理和响应的生成。
需要注意的是,以上流程只是简要概述了Spring MVC的主要处理步骤。实际应用中,可能还会涉及到拦截器、数据绑定、数据验证、异常处理等其他环节。
4.基于注解的控制器
1.在Spring MVC中,@Controller
、@RequestMapping
注解以及@GetMapping
、@PostMapping
、@DeleteMapping
注解和<mvc:annotation-driven/>
配置一起用于实现Controller和View之间的映射关系。
-
@Controller
注解:@Controller
注解用于将一个类标记为控制器类,用于处理HTTP请求。- 通过在Controller类上添加
@Controller
注解,Spring会自动将该类注册为一个控制器Bean,并在请求到达时调用相应的处理方法。
-
@RequestMapping
注解:@RequestMapping
注解用于映射请求的URL和HTTP方法到对应的处理方法。- 可以将
@RequestMapping
注解应用到Controller类和方法上,指定相应的URL路径和HTTP方法。 - 例如,使用
@RequestMapping("/home")
标记在Controller类上,表示所有以"/home"开头的请求都将交给该控制器处理。 - 在处理方法上使用
@RequestMapping
注解,可以进一步细化请求映射。
-
HTTP方法注解(如
@GetMapping
、@PostMapping
、@DeleteMapping
):- 这些注解是@RequestMapping注解的衍生注解,用于细化HTTP方法的映射。
@GetMapping
用于将HTTP GET请求映射到相应的处理方法。@PostMapping
用于将HTTP POST请求映射到相应的处理方法。@DeleteMapping
用于将HTTP DELETE请求映射到相应的处理方法。- 通过使用这些注解,可以更加明确地定义处理特定HTTP方法的请求。
-
<mvc:annotation-driven/>
配置:<mvc:annotation-driven/>
是Spring MVC XML配置文件中的一个配置元素。- 它用于启用基于注解的Spring MVC功能,包括自动注册控制器Bean、请求映射、类型转换、数据校验等。
- 在配置文件中添加
<mvc:annotation-driven/>
,Spring MVC会自动扫描带有@Controller
和其他相关注解的类,并将它们注册为控制器。
结合使用上述注解和配置,你可以实现Controller和View之间的映射关系,将不同的HTTP请求映射到对应的处理方法上,从而实现对应的业务逻辑并返回相应的视图结果。
2.Spring MVC中,可以使用不同的注解来处理Servlet API入参,包括@RequestParam
和@ModelAttribute
。
-
@RequestParam
注解:@RequestParam
注解用于从请求参数中获取值,并将其绑定到方法的参数上。- 可以使用
name
属性指定请求参数的名称,如果不指定,默认使用方法参数的名称。 - 通过
value
属性可以设置参数的别名。 - 使用
required
属性指定该参数是否是必需的,默认为true
,如果请求中没有相应的参数会抛出异常。可以设置为false
,当请求中没有参数时会给参数赋予默认值(如null
)。 - 通过
defaultValue
属性可以设置参数的默认值,在请求中没有相应参数时使用该默认值。
-
@ModelAttribute
注解:@ModelAttribute
注解用于将请求参数绑定到一个实体对象上。- 可以通过在方法的参数上添加
@ModelAttribute
注解,并指定对象的属性名称,让Spring MVC自动将请求参数绑定到对象的对应属性上。 - 如果没有指定
name
属性,则默认使用参数的类型名称作为属性名称。 - 当请求参数较多时,使用
@ModelAttribute
注解可以更方便地将参数组织到一个对象中,实现参数的批量绑定。
使用这些注解,你可以很方便地处理请求中的参数并进行相应的数据绑定。例如,使用@RequestParam
获取单个参数,使用@ModelAttribute
将参数绑定到对象上。
3.在Spring MVC中,ModelAndView
用于处理控制器方法的出参。它可以同时包含模型数据和视图信息,用于向视图传递数据并选择要呈现的视图。
以下是使用ModelAndView
进行出参处理的示例:
-
创建
ModelAndView
对象:ModelAndView modelAndView = new ModelAndView();
-
设置模型数据:
modelAndView.addObject("key", value);
可以使用
addObject
方法向模型中添加数据。"key"
是属性的名称,value
是对应的值。可以多次调用addObject
方法来添加多个属性。 -
设置视图名称:
modelAndView.setViewName("viewName");
使用
setViewName
方法设置要呈现的视图的名称。这里的"viewName"
可以是逻辑视图名(如"home"
)或者物理视图的路径(如"WEB-INF/views/home.jsp"
)。 -
返回
ModelAndView
对象: 控制器方法的返回值为ModelAndView
对象,Spring MVC会根据其中包含的模型数据和视图信息来进行相应的处理。
在视图中,可以使用${key}
表达式来访问模型中的数据,${key}
会被实际的值替代。
示例代码如下所示:
@RequestMapping("/example")
public ModelAndView example() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name", "Alice");
modelAndView.setViewName("exampleView");
return modelAndView;
}
在上述示例中,模型中添加了一个名为"name"的属性,值为"Alice"。视图名称设置为"exampleView"。最终,返回的ModelAndView
对象将被解析为对应的视图,并向视图传递模型数据。
Spring MVC中,除了使用ModelAndView
进行出参处理之外,还可以使用Model
和Map
对象来传递数据到视图。
-
使用
Model
对象:Model
对象是一个接口,可以在控制器方法的参数列表中声明它,并使用它来添加模型数据。示例如下:@RequestMapping("/example") public String example(Model model) { model.addAttribute("name", "Alice"); return "exampleView"; }
在上述示例中,
Model
对象的addAttribute
方法用于添加名为"name"的属性,值为"Alice"。返回的字符串"exampleView"表示该方法要呈现的视图。 -
使用
Map
对象:Map
对象是Model
接口的子接口,也可以在控制器方法的参数列表中声明它,并使用它来添加模型数据。示例如下:@RequestMapping("/example") public String example(Map<String, Object> map) { map.put("name", "Alice"); return "exampleView"; }
在上述示例中,
Map
对象的put
方法用于将名为"name"的属性和值"Alice"添加到模型中。返回的字符串"exampleView"表示该方法要呈现的视图。
无论是使用Model
还是Map
对象,最终返回的字符串都表示要呈现的视图的名称。
在视图中,可以使用${name}
表达式来访问模型中的数据,${name}
会被实际的值替代。
这些方法都可以用于将模型数据传递给视图,可以根据自己的需求选择使用哪种方式。