SpringMVC常用注解及作用
Spring MVC 是一个用于构建基于 Java 的 Web 应用程序的框架,它提供了许多注解来简化开发过程和增加代码的可读性。下面是一些常用的 Spring MVC 注解及其作用:
@Controller
: 用于标识一个类为控制器,处理用户请求并返回响应。@RequestMapping
: 用于映射请求 URL 到具体的控制器方法。可以用于类级别和方法级别,用来定义不同的请求路径。@GetMapping
: 等同于@RequestMapping(method = RequestMethod.GET)
,用于将 HTTP GET 请求映射到方法上。@PostMapping
: 等同于@RequestMapping(method = RequestMethod.POST)
,用于将 HTTP POST 请求映射到方法上。@PutMapping
: 等同于@RequestMapping(method = RequestMethod.PUT)
,用于将 HTTP PUT 请求映射到方法上。@DeleteMapping
: 等同于@RequestMapping(method = RequestMethod.DELETE)
,用于将 HTTP DELETE 请求映射到方法上。@RequestParam
: 用于将请求参数绑定到方法的参数上,可以指定参数名称、是否必需等属性。@PathVariable
: 用于将请求路径中的变量绑定到方法的参数上,可以用于 RESTful 风格的 URL。@RequestBody
: 用于将请求的内容(如 JSON 或 XML)绑定到方法的参数上。@ResponseBody
: 用于将方法的返回值直接作为响应体返回给客户端,通常用于返回 JSON 数据。@ModelAttribute
: 用于将请求参数绑定到模型对象上,可以用于表单数据的绑定。@SessionAttribute
: 用于将模型对象存储在会话中,可以在多个请求之间共享数据。@Valid
: 用于启用参数的验证,通常与javax.validation
标准配合使用。
这些注解只是 Spring MVC 中的一部分,还有其他许多注解可以用于处理拦截器、异常处理、视图解析等方面。使用这些注解可以简化开发过程,并且提高代码的可读性和维护性。
SpringMVC的工作流程
Spring MVC 的工作流程如下:
- 客户端发送请求:客户端发送一个 HTTP 请求到 Spring MVC 应用程序,请求可以是 GET、POST、PUT、DELETE 等。
- DispatcherServlet 接收请求:DispatcherServlet 是 Spring MVC 的前端控制器,它是整个请求处理的入口。它接收到请求后,根据配置的 URL 映射规则,决定将请求交给哪个控制器处理。
- HandlerMapping 查找处理器:DispatcherServlet 调用 HandlerMapping,根据请求的 URL 查找合适的处理器(Controller)。
- 控制器处理请求:找到对应的控制器后,DispatcherServlet 调用控制器的处理方法来处理请求。控制器根据业务逻辑进行处理,并根据需要调用服务层、数据访问层等组件。
- 模型数据处理:控制器处理请求时,可能会产生一些模型数据,用于呈现给用户或传递给视图进行渲染。模型数据可以存储在模型对象中。
- 视图解析:控制器处理完请求后,通常会返回一个逻辑视图名(如 JSP、Thymeleaf 模板等)。DispatcherServlet 调用视图解析器,根据逻辑视图名解析出实际的视图对象。
- 视图渲染:DispatcherServlet 调用视图对象的渲染方法,将模型数据填充到视图中,生成最终的响应内容。
- 响应结果返回:DispatcherServlet 将渲染后的视图响应给客户端,完成请求处理过程。
在整个请求处理过程中,Spring MVC 还提供了一些拦截器、处理器适配器、异常处理等组件,可以对请求进行拦截、预处理、后处理等操作,以及处理异常情况。这些组件可以通过配置进行灵活的定制和扩展,以满足不同的需求。
@RestController 和 @Controller的区别
@Controller
和 @RestController
是 Spring MVC 中常用的注解,用于标识一个类为控制器。它们之间的区别如下:
- 返回值处理方式:
@Controller
注解通常用于传统的 Web 应用程序,控制器方法返回的是一个逻辑视图名,Spring MVC 会将其解析为一个视图对象,并通过视图解析器进行渲染。也就是说,@Controller
适用于需要返回 HTML 页面的场景。@RestController
注解是 Spring 4.0 引入的新注解,它结合了@Controller
和@ResponseBody
的功能。控制器方法使用@RestController
注解后,方法返回的是数据对象,Spring MVC 会自动将其转换为 JSON 或 XML 格式,并作为响应体返回给客户端。所以,@RestController
适用于构建 RESTful API,返回的是数据而不是页面。
@ResponseBody
默认存在:
- 在
@Controller
中,如果希望控制器方法的返回值直接作为响应体返回给客户端,需要在方法上使用@ResponseBody
注解。而在@RestController
中,@ResponseBody
的功能已经默认存在,不需要显式使用该注解。
- 注解组合:
@RestController
是一个组合注解,等同于@Controller
和@ResponseBody
的组合。使用@RestController
注解的类,不再需要在每个方法上添加@ResponseBody
注解。
综上所述,@Controller
适用于传统的 Web 应用程序,返回的是视图页面,而 @RestController
适用于构建 RESTful API,返回的是数据对象,并以 JSON 或 XML 格式进行序列化。选择哪个注解取决于应用程序的需求和设计目标。
如何解决 POST 请求和 GET 请求中文乱码问题
要解决 POST 请求和 GET 请求中文乱码问题,可以采取以下方法:
对于 POST 请求:
在接收请求的控制器方法上添加 @RequestMapping 注解,并设置 produces 和 consumes 属性为 “application/x-www-form-urlencoded;charset=UTF-8”,指定请求和响应的字符编码为 UTF-8。
示例:
@RequestMapping(value = "/example", method = RequestMethod.POST, produces = "application/x-www-form-urlencoded;charset=UTF-8", consumes = "application/x-www-form-urlencoded;charset=UTF-8")
public String handlePostRequest(@RequestParam("data") String data) {
// 处理请求
}
如果使用的是 Spring Boot,可以在配置文件中添加以下配置,指定编码为 UTF-8:
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
对于 GET 请求:
修改应用服务器的默认字符编码为 UTF-8。例如,在 Tomcat 的 server.xml 文件中的 元素中添加 URIEncoding=“UTF-8” 属性。
示例:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
在接收请求的控制器方法上添加 @RequestMapping 注解,并设置 produces 属性为 “text/html;charset=UTF-8”,指定响应的字符编码为 UTF-8。
示例:
@RequestMapping(value = "/example", method = RequestMethod.GET, produces = "text/html;charset=UTF-8")
public String handleGetRequest() {
// 处理请求
}
确保在处理 POST 和 GET 请求时,请求参数和响应内容的字符编码都设置为 UTF-8,可以有效解决中文乱码问题。