【Java 中级】一文精通 Spring MVC - Restful(二)

发布于:2023-09-22 ⋅ 阅读:(56) ⋅ 点赞:(0)

在这里插入图片描述

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 高阶
🙉八股文专题:剑指大厂,手撕 Java 八股文

1. Spring MVC 接受参数乱码如何解决

Spring MVC 提供了多种方式来解决参数乱码的问题。以下是一些常用的方法:

  1. 使用过滤器解决乱码问题:可以配置一个字符编码过滤器,将请求和响应的字符编码设置为统一的编码格式,例如 UTF-8。在 web.xml 文件中添加以下配置:
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这样配置后,请求和响应的字符编码就会被统一设置为 UTF-8,解决了参数乱码的问题。

  1. 在 Spring MVC 的配置文件中设置字符编码过滤器:在 Spring MVC 的配置文件(如 spring-mvc.xml)中添加以下配置:
<bean id="characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter">
    <property name="encoding" value="UTF-8" />
    <property name="forceEncoding" value="true" />
</bean>

这样配置后,字符编码过滤器会在请求进入 Spring MVC 前将字符编码设置为 UTF-8。

  1. 在控制器方法上添加 @RequestMapping 注解的 produces 属性:在控制器方法上添加 @RequestMapping 注解,并设置 produces 属性为 “text/html;charset=UTF-8”,例如:
@RequestMapping(value = "/hello", produces = "text/html;charset=UTF-8")
public String hello(@RequestParam("name") String name) {
    // 处理 name 参数
    return "hello";
}

这样配置后,响应的 Content-Type 头部会被设置为指定的字符编码,确保正确的字符集被返回给客户端。

  1. 将参数base64加密:传递的参数base64加密,在Controller 接收到之后再解密,即可解决参数乱码问题。

2. 什么是 Restful

Restful 是一种软件架构风格,用于设计网络应用程序的 API。它是 Representational State Transfer(表述性状态转移)的缩写,强调了在网络中以资源为中心进行通信和交互。

Restful 架构的设计原则包括:

  1. 基于资源:将应用程序的功能抽象为资源,并通过 URI(统一资源标识符)来标识和定位资源。每个资源都有唯一的 URI,通过不同的 HTTP 方法对资源进行操作。
  2. 使用标准的 HTTP 方法:Restful API 使用标准的 HTTP 方法来表示对资源的操作。常用的 HTTP 方法包括 GET(获取资源)、POST(创建资源)、PUT(更新资源)、DELETE(删除资源)等。
  3. 无状态性:每个请求都是独立的,服务器不会存储客户端的状态信息。客户端的每个请求都应该包含足够的信息来处理请求,服务器可以根据请求中的信息进行响应。
  4. 使用统一的接口:Restful API 使用统一的接口来进行通信,例如使用 JSON 或 XML 格式来表示资源的表述,使用 HTTP 状态码来表示操作的结果。
  5. 可缓存性:Restful 架构支持缓存,服务器可以通过设置适当的缓存策略来提高性能和可扩展性。
  6. 按需加载:客户端可以根据需要选择性地获取资源的部分内容,而不是一次性获取全部资源。

通过遵循 Restful 架构的设计原则,可以构建出易于理解、可扩展、可维护和可测试的 Web API。Restful API 在互联网应用开发中得到广泛应用,可以用于构建各种类型的应用,包括移动应用、Web 应用、微服务等。

3. 请求映射

3.1. @RequestMapping

@RequestMapping 是 Spring MVC 中用于映射请求路径和方法的注解。它可以用于将特定的 URL 映射到方法上,以处理客户端的请求。

@RequestMapping 注解有以下常用属性:

  • value 或 path:用于指定请求的 URL 路径。可以是一个字符串值,表示单个路径,也可以是一个字符串数组,表示多个路径。例如,@RequestMapping(“/hello”) 表示将 “/hello” 路径映射到方法上。
  • method:用于指定请求的 HTTP 方法。可以是一个 RequestMethod 枚举值,也可以是一个 RequestMethod 数组。默认情况下,RequestMapping 注解适用于所有的 HTTP 方法。例如,@RequestMapping(value = “/hello”, method = RequestMethod.GET) 表示只有 GET 请求方法才会映射到该方法上。
  • params:用于指定请求的参数。可以是一个字符串值,表示单个参数;也可以是一个字符串数组,表示多个参数。例如,@RequestMapping(value = “/hello”, params = “name”) 表示只有带有 “name” 参数的请求才会映射到该方法上。
  • headers:用于指定请求的头信息。可以是一个字符串值,表示单个头信息;也可以是一个字符串数组,表示多个头信息。例如,@RequestMapping(value = “/hello”, headers = “User-Agent=Mozilla”) 表示只有带有 “User-Agent” 头信息为 “Mozilla” 的请求才会映射到该方法上。
  • consumes:用于指定请求的媒体类型。可以是一个字符串值,表示单个媒体类型;也可以是一个字符串数组,表示多个媒体类型。例如,@RequestMapping(value = “/hello”, consumes = “application/json”) 表示只有请求的媒体类型为 “application/json” 的请求才会映射到该方法上。
  • produces:用于指定响应的媒体类型。可以是一个字符串值,表示单个媒体类型;也可以是一个字符串数组,表示多个媒体类型。例如,@RequestMapping(value = “/hello”, produces = “application/json”) 表示该方法会产生 “application/json” 类型的响应。

下面是一个使用 @RequestMapping 的示例:

@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
    // 处理请求
    return "hello";
}

在上述示例中,当请求的 URL 路径为 “/hello”,且请求方法为 GET 时,该方法将会被调用。
@RequestMapping 注解可以用于处理不同类型的请求,如 GET、POST、PUT、DELETE 等。它可以用于类级别和方法级别,用于映射类和方法的请求路径。

通过 @RequestMapping 注解的灵活配置,可以根据请求的路径、方法、参数等进行精确的请求映射和处理。

3.2. @GetMapping

@GetMapping 是 Spring MVC 中的一个注解,用于将 HTTP GET 请求映射到方法上。它是 @RequestMapping 注解的一个缩写形式,专门用于处理 GET 请求。

@GetMapping 注解具有以下特点:

  • 简化的请求映射:使用 @GetMapping 注解可以将特定的 URL 路径映射到方法上,而无需显式指定请求方法和其他属性。它相当于 @RequestMapping 注解中的 method 属性为 RequestMethod.GET 的简写形式。
  • 常用于查询操作:由于 GET 请求通常用于获取资源或执行查询操作,因此 @GetMapping 注解常用于处理查询请求。
  • 支持多个路径:可以在 @GetMapping 注解中指定一个或多个路径,用于匹配不同的 URL 路径。
  • 可以用于类级别和方法级别:@GetMapping 注解既可以用于类级别,也可以用于方法级别。当用于类级别时,表示该类中的所有方法都将映射到指定的路径上。

下面是一个使用 @GetMapping 的示例:

@Controller
@RequestMapping("/hello")
public class HelloWorldController {
    @GetMapping("/greeting")
    public String greeting() {
        // 处理 GET 请求
        return "greeting";
    }
}

在上述示例中,当请求的 URL 路径为 “/hello/greeting” 且请求方法为 GET 时,greeting() 方法将会被调用。

@GetMapping 注解是 Spring MVC 中处理 GET 请求的常用注解之一。它简化了请求映射的配置,并提供了清晰的语义,用于处理查询操作和获取资源。

3.3. @PostMapping

@PostMapping 是 Spring MVC 中的一个注解,用于将 HTTP POST 请求映射到方法上。它是 @RequestMapping 注解的一个缩写形式,专门用于处理 POST 请求。

@PostMapping 注解具有以下特点:

  • 简化的请求映射:使用 @PostMapping 注解可以将特定的 URL 路径映射到方法上,而无需显式指定请求方法和其他属性。它相当于 @RequestMapping 注解中的 method 属性为 RequestMethod.POST 的简写形式。
  • 常用于表单提交:由于 POST 请求通常用于向服务器提交数据,因此 @PostMapping 注解常用于处理表单提交请求。
  • 支持多个路径:可以在 @PostMapping 注解中指定一个或多个路径,用于匹配不同的 URL 路径。
  • 可以用于类级别和方法级别:@PostMapping 注解既可以用于类级别,也可以用于方法级别。当用于类级别时,表示该类中的所有方法都将映射到指定的路径上。

下面是一个使用 @PostMapping 的示例:

@Controller
@RequestMapping("/hello")
public class HelloWorldController {
    @PostMapping("/greeting")
    public String greeting() {
        // 处理 POST 请求
        return "greeting";
    }
}

在上述示例中,当请求的 URL 路径为 “/hello/greeting” 且请求方法为 POST 时,greeting() 方法将会被调用。

@PostMapping 注解是 Spring MVC 中处理 POST 请求的常用注解之一。它简化了请求映射的配置,并提供了清晰的语义,用于处理表单提交等 POST 请求操作。

3.4. @PutMapping

@PutMapping 是 Spring MVC 中的一个注解,用于将 HTTP PUT 请求映射到方法上。它是 @RequestMapping 注解的一个缩写形式,专门用于处理 PUT 请求。

@PutMapping 注解具有以下特点:

  • 简化的请求映射:使用 @PutMapping 注解可以将特定的 URL 路径映射到方法上,而无需显式指定请求方法和其他属性。它相当于 @RequestMapping 注解中的 method 属性为 RequestMethod.PUT 的简写形式。
  • 常用于资源更新:由于 PUT 请求通常用于更新服务器上的资源,因此 @PutMapping 注解常用于处理资源更新请求。
  • 支持多个路径:可以在 @PutMapping 注解中指定一个或多个路径,用于匹配不同的 URL 路径。
  • 可以用于类级别和方法级别:@PutMapping 注解既可以用于类级别,也可以用于方法级别。当用于类级别时,表示该类中的所有方法都将映射到指定的路径上。

下面是一个使用 @PutMapping 的示例:

@RestController
@RequestMapping("/api")
public class UserController {
    @PutMapping("/users/{id}")
    public User updateUser(@PathVariable("id") Long id, @RequestBody User user) {
        // 根据 id 更新用户信息
        return userService.updateUser(id, user);
    }
}

在上述示例中,当请求的 URL 路径为 “/api/users/{id}” 且请求方法为 PUT 时,updateUser() 方法将会被调用,根据传入的 id 和用户信息进行更新操作。

@PutMapping 注解是 Spring MVC 中处理 PUT 请求的常用注解之一。它简化了请求映射的配置,并提供了清晰的语义,用于处理资源更新等 PUT 请求操作。

3.5. @DeleteMapping

@DeleteMapping 是 Spring MVC 中的一个注解,用于将 HTTP DELETE 请求映射到方法上。它是 @RequestMapping 注解的一个缩写形式,专门用于处理 DELETE 请求。
@DeleteMapping 注解具有以下特点:

  • 简化的请求映射:使用 @DeleteMapping 注解可以将特定的 URL 路径映射到方法上,而无需显式指定请求方法和其他属性。它相当于 @RequestMapping 注解中的 method 属性为 RequestMethod.DELETE 的简写形式。
  • 常用于资源删除:由于 DELETE 请求通常用于删除服务器上的资源,因此 @DeleteMapping 注解常用于处理资源删除请求。
  • 支持多个路径:可以在 @DeleteMapping 注解中指定一个或多个路径,用于匹配不同的 URL 路径。
  • 可以用于类级别和方法级别:@DeleteMapping 注解既可以用于类级别,也可以用于方法级别。当用于类级别时,表示该类中的所有方法都将映射到指定的路径上。

下面是一个使用 @DeleteMapping 的示例:

@RestController
@RequestMapping("/api")
public class UserController {
    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable("id") Long id) {
        // 根据 id 删除用户
        userService.deleteUser(id);
    }
}

在上述示例中,当请求的 URL 路径为 “/api/users/{id}” 且请求方法为 DELETE 时,deleteUser() 方法将会被调用,根据传入的 id 进行用户删除操作。

@DeleteMapping 注解是 Spring MVC 中处理 DELETE 请求的常用注解之一。它简化了请求映射的配置,并提供了清晰的语义,用于处理资源删除等 DELETE 请求操作。

3.6. @PathVariable

@PathVariable 是 Spring MVC 中的一个注解,用于将 URL 路径中的变量绑定到方法的参数上。它可以用于获取 RESTful 风格的 URL 中的路径变量。

@PathVariable 注解具有以下特点:

  • 获取路径变量:通过在 @PathVariable 注解中指定变量名称,可以将对应的 URL 路径中的变量值绑定到方法的参数上。
  • 支持多个路径变量:可以在方法参数上使用多个 @PathVariable 注解,用于获取多个路径变量的值。
  • 可以指定路径变量的名称:可以使用 @PathVariable(“name”) 的形式来指定路径变量的名称,如果名称与方法参数名称一致,可以省略括号中的名称。
  • 支持类型转换:@PathVariable 注解支持将路径变量的值转换为方法参数的类型,例如将字符串转换为整数、日期等。

下面是一个使用 @PathVariable 的示例:

@GetMapping("/users/{id}")
public User getUserById(@PathVariable("id") Long id) {
    // 根据 id 获取用户信息
    return userService.getUserById(id);
}

在上述示例中,当请求的 URL 路径为 “/users/{id}” 时,其中的 “{id}” 将会被绑定到方法参数 id 上,然后可以根据该 id 获取对应的用户信息。

@PathVariable 注解是 Spring MVC 中处理路径变量的常用注解之一。它可以方便地从 URL 路径中获取变量值,并将其绑定到方法的参数上,用于处理 RESTful 风格的请求。

4. 静态资源的访问

静态资源是指在 Web 应用程序中不经过处理直接返回给客户端的文件,如 HTML、CSS、JavaScript、图片等。在 Spring MVC 中,可以通过配置来访问静态资源。

首先,需要在 Spring MVC 的配置文件中配置静态资源的访问路径。可以通过以下方式进行配置:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
     @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }
}

在上述示例中,我们配置了 “/static/**” 路径下的静态资源可以通过访问路径 “/static/…” 来访问,而这些静态资源实际上位于类路径下的 “/static/” 目录中。

接下来,我们可以在 HTML 页面中引用这些静态资源。例如,我们在 HTML 页面中引用名为 “style.css” 的 CSS 文件,可以使用以下方式:

<link rel="stylesheet" type="text/css" href="/static/css/style.css">

在上述示例中,我们通过 “/static/css/style.css” 路径来引用名为 “style.css” 的 CSS 文件。

最后,当客户端请求访问静态资源时,Spring MVC 将会根据配置的资源处理器(ResourceHandler)来处理这些请求,并将对应的静态资源返回给客户端。

通过配置静态资源的访问路径,可以在 Spring MVC 中方便地访问静态资源。通过配置资源处理器和在 HTML 页面中引用静态资源,可以使客户端能够正确地获取并使用这些静态资源。

精彩专栏推荐订阅:在下方专栏👇🏻
2023年华为OD机试真题(A卷&B卷)+ 面试指导
精选100套 Java 项目案例
面试需要避开的坑(活动)
你找不到的核心代码
带你手撕 Spring
Java 初阶

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到