软件设计之SSM(9)
路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
尚硅谷新版SSM框架全套视频教程,Spring6+SpringBoot3最新SSM企业级开发
资料可以去尚硅谷官网免费领取
学习内容:
SpringMVC
- 概念及核心组件
- MVC初始化类
- 数据接收
1、概念及核心组件
SpringMVC
是 Spring 框架中的一个模块,主要用于简化和组织 Java Web 应用程序中的请求处理和响应逻辑(简化前端参数接收( 形参列表 )
、简化后端数据响应(返回值)
)。它是一个基于 Model-View-Controller (MVC) 设计模式的框架,提供了一整套用于处理 HTTP 请求、生成响应和将业务逻辑与视图解耦的机制。
SpringMVC处理请求流程:
- 客户端发送请求:浏览器或其他客户端向服务器发送 HTTP 请求,请求的 URL 会被发送到服务器并被分配到特定的
DispatcherServlet
- DispatcherServlet 接收请求:DispatcherServlet 是 Spring MVC 的核心组件,负责接收所有的请求并进行分发。它相当于
前端控制器(Front Controller)
,所有请求都会首先经过它。[需要web.xml配置生效] - HandlerMapping 映射请求:DispatcherServlet 调用一个或多个 HandlerMapping,这些映射器的作用是根据请求的 URL 找到合适的
处理器(Handler)
。通常,@RequestMapping 注解
就定义了请求路径与控制器方法之间的映射关系。[需要进行IoC配置] - 调用处理器适配器 (HandlerAdapter):找到处理器(通常是一个控制器方法)后,DispatcherServlet 会根据处理器的类型找到相应的
HandlerAdapter
,并通过适配器调用真正的处理方法。 - 执行控制器逻辑:控制器中的处理方法被调用,执行具体的业务逻辑。它会处理请求参数,调用服务层,执行数据库查询等操作,并通常会返回一个包含视图名称和模型数据的
ModelAndView 对象
- 视图解析:控制器返回的视图名称需要解析为具体的视图文件,DispatcherServlet 调用 ViewResolver 来
解析视图名称
。视图解析器(如 InternalResourceViewResolver)会将视图名称与实际的 JSP、Thymeleaf、FreeMarker 等视图模板进行匹配。 - 渲染视图:视图解析完成后,视图会被渲染,模型数据将被填充到视图中,最终生成 HTML 响应。
- 返回响应给客户端:视图渲染完成后,DispatcherServlet 将生成的 HTML 响应发送回客户端,用户可以在浏览器中看到处理后的结果。
2、MVC初始化类
在传统的 Spring MVC 应用中,通常会在 web.xml 中配置 DispatcherServlet 来处理请求,并配置 Spring 的应用上下文。这种 XML 配置方式虽然很灵活,但并不够现代和简洁。
AbstractAnnotationConfigDispatcherServletInitializer
是 Spring 提供的一个方便类,用于简化基于 Java 配置的 Spring Web 应用的初始化。实现该类的目的是用来替代传统的 web.xml 配置文件,以编程方式注册 DispatcherServlet,并配置 Spring 应用的上下文。
onStartup
是该类中的一个关键方法,它负责在应用启动时完成初始化工作。开发者可以通过 onStartup 方法直接与 ServletContext 交互,注册 Servlet
、创建配置Ioc容器
、配置过滤器、监听器等。
创建初始化类实现该接口目的:
- 注册
DispatcherServlet
通过继承 AbstractAnnotationConfigDispatcherServletInitializer,可以自动注册 DispatcherServlet,它是 Spring MVC 的核心前端控制器,用于拦截所有的请求并分发给合适的控制器进行处理。 - 加载 Spring 和 Spring MVC 配置类 该类会通过两个方法分别为根应用上下文(Root ApplicationContext)和 Spring MVC 应用上下文(Servlet ApplicationContext)提供配置类:
getRootConfigClasses():
用于配置应用的全局根配置,例如服务层、数据源等。getServletConfigClasses():
用于配置 Spring MVC 的相关配置,例如控制器、视图解析器等。
- 配置 URL 映射 实现该类时,需要定义哪些 URL 请求应该由 DispatcherServlet 处理,通常通过 getServletMappings() 方法来实现。通常的映射是 “/”,表示拦截所有请求。
3、数据接收
访问路径设置
@RequestMapping注解
的作用就是将请求的 URL 地址和处理请求的方式(handler方法)关联起来,建立映射关系。
- 在@RequestMapping注解指定 URL 地址时,可以精准路径匹配、也可以通过使用
通配符
模糊匹配 - 设置到类级别: @RequestMapping 注解可以设置在控制器类上,用于映射整个控制器的通用请求路径。这样,如果控制器中的多个方法都需要映射同一请求路径,就不需要在每个方法上都添加映射路径。
- 设置到方法级别: @RequestMapping 注解也可以单独设置在控制器方法上,用于更细粒度地映射请求路径和处理方法。当多个方法处理同一个路径的不同操作时,可以使用方法级别的 @RequestMapping 注解进行更精细的映射。
- 附带请求方式限制: HTTP 协议定义了八种请求方式,
GET
、POST
等,设置请求方式可以指定该方法只处理某种特定的 HTTP 请求方法,违背请求方式,会出现405异常
,该注解只能添加到handler方法上,无法添加到类上。
接收参数
表单参数param与json参数比较
表单参数(param):
如果你的请求数据是简单的键值对(如登录表单、查询参数),并且不需要传递复杂的对象结构,使用表单参数是比较方便和直接的方式。
JSON 参数:
如果需要传递复杂的数据结构(如对象数组、嵌套对象等),并且客户端和服务器端采用的是 RESTful 风格的交互,使用 JSON 参数会更加适合。JSON 参数的可读性和结构化使它在现代 Web 开发中成为标准。
比较项 | 表单参数(param) | JSON 参数 |
---|---|---|
数据格式 | key=value | JSON 格式 { "key": "value" } |
适用场景 | 简单键值对、表单提交 | 复杂的对象或嵌套结构的数据 |
请求类型 | GET、POST、PUT、DELETE 等 | 通常为 POST、PUT、PATCH 等 |
传递方式 | 查询参数、表单参数,放在 URL 或请求体中 | 请求体中 |
解析 | 自动解析为 @RequestParam 或对象 | 需要使用 @RequestBody 来解析 |
优点 | 简单、快速 | 结构化数据支持强,适合复杂的对象和数组 |
缺点 | 不适合复杂的数据结构 | 需要手动解析 JSON 数据,并设置请求头 |
param参数接收
- 直接接收
在url中传递参数,即可自动接收,但要求形参数名和类型与传递参数相[可以不传递参数,不会报错]
比如:
localhost:8080/param/data?name=root&age=10
//直接获取
//只要形参数名和类型与传递参数相同,即可自动接收
@RequestMapping("data")
@ResponseBody
public String data(String name, int age){
System.out.println("name = " + name + ", age = " + age);
return "name = " + name + ", age = " + age ;
}
- @RequestParam注解
可以使用@RequestParam
注释将 Servlet 请求参数(即查询参数或表单数据)绑定到控制器中的方法参数。
代码 | 作用 |
---|---|
@RequestParam("stuAge") String age: | 传递参数变更为stuAge |
required = false: | 默认情况下,传递参数要求是必须传递的,这是该值可以不传递,转而设置为默认值 |
defaultValue = "18": | 设置age的默认值为18 |
@GetMapping(value="/data")
@ResponseBody
public Object paramForm(@RequestParam("name") String name,
@RequestParam(value = "stuAge",required = false,defaultValue = "18") int age){
System.out.println("name = " + name + ", age = " + age);
return name+age;
}
- 一名多值
多选框,提交的数据的时候一个key对应多个值,可以使用集合进行接收
注意:
这里一定要加注解@RequestParam
,不加会直接将多个请求参数作为字符串复制给集合,报错
/**
* 前端请求: http://localhost:8080/param/mul?hbs=吃&hbs=喝
*
* 一名多值,可以使用集合接收即可!但是需要使用@RequestParam注解指定
*/
@GetMapping(value="/mul")
@ResponseBody
public Object mulForm(@RequestParam List<String> hbs){
System.out.println("hbs = " + hbs);
return hbs;
}
- 实体接收
Spring MVC 是 Spring 框架提供的 Web 框架,它允许开发者使用实体对象来接收 HTTP 请求中的参数。通过这种方式,可以在方法内部直接使用对象的属性来访问请求参数,而不需要每个参数都写一遍。
前提:
定义一个用于接收参数的实体类
@Controller
@RequestMapping("param")
public class ParamController {
@RequestMapping(value = "/user", method = RequestMethod.POST)
@ResponseBody
public String addUser(User user) {
// 在这里可以使用 user 对象的属性来接收请求参数
System.out.println("user = " + user);
return "success";
}
}
路径参数接收
动态路径设计:
/user/{动态部分}/{动态部分} 动态部分使用{}包含即可! {}内部动态标识!
形参列表取值:
- @PathVariable Long id 如果形参名 = {动态标识} 自动赋值
- @PathVariable(“动态标识”) Long id 如果形参名 != {动态标识} 可以通过指定动态标识赋值
/**
* 访问测试: /param/user/1/root -> id = 1 uname = root
*/
@GetMapping("/user/{id}/{name}")
@ResponseBody
public String getUser(@PathVariable Long id,
@PathVariable("name") String uname) {
System.out.println("id = " + id + ", uname = " + uname);
return "user_detail";
}
JSON参数接收
在控制器中,使用 @RequestBody 注解来接收 JSON 数据,并将其转换为 Java 对象
在接收JSON时,需要面对两个问题:
- 不支持json数据类型处理
- 没有json类型处理的工具(jackson)
对应的解决方案是:
- 配置json转化器:在配置类加上注解
@EnableWebMvc
- 在pom.xml 加入jackson依赖:
jackson-databind
@PostMapping("/person")
@ResponseBody
public String addPerson(@RequestBody Person person) {
// 在这里可以使用 person 对象来操作 JSON 数据中包含的属性
return "success";
}
接收Cookie数据
可以使用 @CookieValue 注释
将 HTTP Cookie 的值绑定到控制器中的方法参数
@GetMapping("/demo")
public void handle(@CookieValue("CookieName") String cookie) {
//...
}
接收请求头数据
可以使用 @RequestHeader
批注将请求标头绑定到控制器中的方法参数。
下面的示例获取Accept-Encoding
和Keep-Alive
标头的值:
@GetMapping("/demo")
public void handle(
@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) {
//...
}