👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主
⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 高阶
🙉八股文专题:剑指大厂,手撕 Java 八股文
文章目录
1. Spring MVC 接受参数乱码如何解决
Spring MVC 提供了多种方式来解决参数乱码的问题。以下是一些常用的方法:
使用过滤器解决乱码问题
:可以配置一个字符编码过滤器,将请求和响应的字符编码设置为统一的编码格式,例如 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,解决了参数乱码的问题。
在 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。
在控制器方法上添加 @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 头部会被设置为指定的字符编码,确保正确的字符集被返回给客户端。
将参数base64加密
:传递的参数base64加密,在Controller 接收到之后再解密,即可解决参数乱码问题。
2. 什么是 Restful
Restful 是一种软件架构风格,用于设计网络应用程序的 API。它是 Representational State Transfer(表述性状态转移)的缩写,强调了在网络中以资源为中心进行通信和交互。
Restful 架构的设计原则包括:
基于资源
:将应用程序的功能抽象为资源,并通过 URI(统一资源标识符)来标识和定位资源。每个资源都有唯一的 URI,通过不同的 HTTP 方法对资源进行操作。使用标准的 HTTP 方法
:Restful API 使用标准的 HTTP 方法来表示对资源的操作。常用的 HTTP 方法包括 GET(获取资源)、POST(创建资源)、PUT(更新资源)、DELETE(删除资源)等。无状态性
:每个请求都是独立的,服务器不会存储客户端的状态信息。客户端的每个请求都应该包含足够的信息来处理请求,服务器可以根据请求中的信息进行响应。使用统一的接口
:Restful API 使用统一的接口来进行通信,例如使用 JSON 或 XML 格式来表示资源的表述,使用 HTTP 状态码来表示操作的结果。可缓存性
:Restful 架构支持缓存,服务器可以通过设置适当的缓存策略来提高性能和可扩展性。按需加载
:客户端可以根据需要选择性地获取资源的部分内容,而不是一次性获取全部资源。
通过遵循 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 初阶