软件设计之SSM(9)

软件设计之SSM(9)

路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
尚硅谷新版SSM框架全套视频教程,Spring6+SpringBoot3最新SSM企业级开发
资料可以去尚硅谷官网免费领取

学习内容:

SpringMVC

  1. 概念及核心组件
  2. MVC初始化类
  3. 数据接收

1、概念及核心组件

SpringMVC 是 Spring 框架中的一个模块,主要用于简化和组织 Java Web 应用程序中的请求处理和响应逻辑(简化前端参数接收( 形参列表 )简化后端数据响应(返回值))。它是一个基于 Model-View-Controller (MVC) 设计模式的框架,提供了一整套用于处理 HTTP 请求、生成响应和将业务逻辑与视图解耦的机制。

SpringMVC处理请求流程:

  1. 客户端发送请求:浏览器或其他客户端向服务器发送 HTTP 请求,请求的 URL 会被发送到服务器并被分配到特定的 DispatcherServlet
  2. DispatcherServlet 接收请求:DispatcherServlet 是 Spring MVC 的核心组件,负责接收所有的请求并进行分发。它相当于前端控制器(Front Controller),所有请求都会首先经过它。[需要web.xml配置生效]
  3. HandlerMapping 映射请求:DispatcherServlet 调用一个或多个 HandlerMapping,这些映射器的作用是根据请求的 URL 找到合适的处理器(Handler)。通常,@RequestMapping 注解就定义了请求路径与控制器方法之间的映射关系。[需要进行IoC配置]
  4. 调用处理器适配器 (HandlerAdapter):找到处理器(通常是一个控制器方法)后,DispatcherServlet 会根据处理器的类型找到相应的 HandlerAdapter,并通过适配器调用真正的处理方法。
  5. 执行控制器逻辑:控制器中的处理方法被调用,执行具体的业务逻辑。它会处理请求参数,调用服务层,执行数据库查询等操作,并通常会返回一个包含视图名称和模型数据的ModelAndView 对象
  6. 视图解析:控制器返回的视图名称需要解析为具体的视图文件,DispatcherServlet 调用 ViewResolver 来解析视图名称。视图解析器(如 InternalResourceViewResolver)会将视图名称与实际的 JSP、Thymeleaf、FreeMarker 等视图模板进行匹配。
  7. 渲染视图:视图解析完成后,视图会被渲染,模型数据将被填充到视图中,最终生成 HTML 响应。
  8. 返回响应给客户端:视图渲染完成后,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容器、配置过滤器、监听器等。

创建初始化类实现该接口目的:

  1. 注册DispatcherServlet通过继承 AbstractAnnotationConfigDispatcherServletInitializer,可以自动注册 DispatcherServlet,它是 Spring MVC 的核心前端控制器,用于拦截所有的请求并分发给合适的控制器进行处理。
  2. 加载 Spring 和 Spring MVC 配置类 该类会通过两个方法分别为根应用上下文(Root ApplicationContext)和 Spring MVC 应用上下文(Servlet ApplicationContext)提供配置类:
  • getRootConfigClasses():用于配置应用的全局根配置,例如服务层、数据源等。
  • getServletConfigClasses():用于配置 Spring MVC 的相关配置,例如控制器、视图解析器等。
  1. 配置 URL 映射 实现该类时,需要定义哪些 URL 请求应该由 DispatcherServlet 处理,通常通过 getServletMappings() 方法来实现。通常的映射是 “/”,表示拦截所有请求。

3、数据接收

访问路径设置

@RequestMapping注解的作用就是将请求的 URL 地址和处理请求的方式(handler方法)关联起来,建立映射关系。

  1. 在@RequestMapping注解指定 URL 地址时,可以精准路径匹配、也可以通过使用通配符模糊匹配
  2. 设置到类级别: @RequestMapping 注解可以设置在控制器类上,用于映射整个控制器的通用请求路径。这样,如果控制器中的多个方法都需要映射同一请求路径,就不需要在每个方法上都添加映射路径。
  3. 设置到方法级别: @RequestMapping 注解也可以单独设置在控制器方法上,用于更细粒度地映射请求路径和处理方法。当多个方法处理同一个路径的不同操作时,可以使用方法级别的 @RequestMapping 注解进行更精细的映射。
  4. 附带请求方式限制: HTTP 协议定义了八种请求方式,GETPOST等,设置请求方式可以指定该方法只处理某种特定的 HTTP 请求方法,违背请求方式,会出现405异常,该注解只能添加到handler方法上,无法添加到类上

接收参数

表单参数param与json参数比较

表单参数(param):如果你的请求数据是简单的键值对(如登录表单、查询参数),并且不需要传递复杂的对象结构,使用表单参数是比较方便和直接的方式。

JSON 参数:如果需要传递复杂的数据结构(如对象数组、嵌套对象等),并且客户端和服务器端采用的是 RESTful 风格的交互,使用 JSON 参数会更加适合。JSON 参数的可读性和结构化使它在现代 Web 开发中成为标准。

比较项表单参数(param)JSON 参数
数据格式key=valueJSON 格式 { "key": "value" }
适用场景简单键值对、表单提交复杂的对象或嵌套结构的数据
请求类型GET、POST、PUT、DELETE 等通常为 POST、PUT、PATCH 等
传递方式查询参数、表单参数,放在 URL 或请求体中请求体中
解析自动解析为 @RequestParam 或对象需要使用 @RequestBody 来解析
优点简单、快速结构化数据支持强,适合复杂的对象和数组
缺点不适合复杂的数据结构需要手动解析 JSON 数据,并设置请求头

param参数接收

  1. 直接接收
    在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 ;
    }
  1. @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;
}
  1. 一名多值
    多选框,提交的数据的时候一个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;
  }
  1. 实体接收
    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-EncodingKeep-Alive标头的值:

@GetMapping("/demo")
public void handle(
    @RequestHeader("Accept-Encoding") String encoding, 
    @RequestHeader("Keep-Alive") long keepAlive) { 
  //...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值