1 @RestController
@RestController 是一个 Spring Framework 中的注解,用于标识一个类是一个控制器(Controller),并且该控制器中的方法返回的数据不是视图页面,而是直接作为响应内容发送到客户端,通常是以 JSON 格式返回数据。
以下是对 @RestController 注解的详解:
- 用途: @RestController 主要用于创建 RESTful 风格的控制器,它将控制器中的方法的返回值直接序列化为 JSON 或其他格式的数据,而不是渲染为视图页面。
替代方式:
在 Spring 中,通常有两种方式来创建控制器类:@Controller 和 @RestController。
@Controller 用于传统的 MVC 模式,它返回视图页面,而 @RestController 用于 RESTful API,它返回数据。
- 示例:
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
@RestController
public class MyRestController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}
}
在上面的示例中,MyRestController 类使用 @RestController 注解标识,它的 sayHello 方法返回一个字符串,这个字符串将作为响应的内容返回给客户端。
- 自动 JSON 序列化: 当使用 @RestController 注解标识的类返回对象时,Spring Boot 会自动将对象序列化为 JSON 格式,并设置正确的 Content-Type 头部,使客户端能够正确地解析响应数据。
- 常见用途: 创建 RESTful API,用于与前端或其他系统交互。 提供移动应用程序的后端服务。 创建微服务的端点,用于微服务架构中的通信。 @RestController 是 Spring Framework 中用于创建 RESTful 风格控制器的关键注解,它使得创建 Web 服务变得更加简单和方便,特别是在需要返回 JSON 或其他数据格式的情况下。
2.@RequestMapping
@RequestMapping 是 Spring Framework 中用于映射 URL 到控制器方法的注解。它被用于将一个特定的 URL 请求映射到一个处理该请求的方法上。在 Spring 的 Web 应用程序中,@RequestMapping 注解通常用于控制器类的方法上,以确定哪个方法将处理特定的 HTTP 请求。
@RequestMapping
注解对请求处理类中的请求处理方法进行标注;@RequestMapping
注解拥有以下的六个配置属性:
value
:映射的请求URL或者其别名method
:兼容HTTP的方法名params
:根据HTTP参数的存在、缺省或值对请求进行过滤header
:根据HTTP Header的存在、缺省或值对请求进行过滤consume
:设定在HTTP请求正文中允许使用的媒体类型product
:在HTTP响应体中允许使用的媒体类型
提示:在使用@RequestMapping之前,请求处理类还需要使用@Controller或@RestController进行标记
下面是使用@RequestMapping的两个示例:
@RequestMapping还可以对类进行标记,这样类中的处理方法在映射请求路径时,会自动将类上@RequestMapping设置的value拼接到方法中映射路径之前,如下:
基本使用:
代码语言:java复制@RequestMapping("/path")
public String handleRequest() {
// 处理请求的逻辑
return "viewName"; // 返回视图名称
}
在这个例子中,当请求的 URL 匹配 “/path” 时,Spring 将调用 handleRequest 方法来处理该请求,并返回一个与视图相关的名称。
- HTTP 方法映射:
@RequestMapping(value = "/path", method = RequestMethod.GET)
public String handleGetRequest() {
// 处理 GET 请求的逻辑
return "viewName";
}
可以通过 method 属性指定处理的 HTTP 方法。默认情况下,它匹配所有的 HTTP 方法。
- 多路径映射:
@RequestMapping(value = {"/path1", "/path2"})
public String handleMultiplePaths() {
// 处理多个路径的逻辑
return "viewName";
}
通过提供多个路径,可以将多个 URL 映射到同一个处理方法上。
- 请求参数匹配:
@RequestMapping(value = "/path", params = "paramName=value")
public String handleParamRequest() {
// 处理带有特定参数的请求的逻辑
return "viewName";
}
通过 params 属性,可以根据请求参数进行匹配,以决定是否调用特定的处理方法。
- 请求头匹配:
@RequestMapping(value = "/path", headers = "headerName=value")
public String handleHeaderRequest() {
// 处理带有特定请求头的请求的逻辑
return "viewName";
}
通过 headers 属性,可以根据请求头信息进行匹配。
- 消费类型和产出类型:
@RequestMapping(value = "/path", consumes = "application/json", produces = "text/html")
public String handleMediaTypeRequest() {
// 处理特定媒体类型的请求的逻辑
return "viewName";
}
通过 consumes 属性可以指定接受的请求的媒体类型,通过 produces 属性可以指定生成的响应的媒体类型。
- 路径变量:
@RequestMapping("/path/{variable}")
public String handlePathVariable(@PathVariable String variable) {
// 使用路径变量的值进行处理
return "viewName";
}
使用 {} 语法可以捕获 URL 中的路径变量,并将其传递给方法参数。
- Ant 风格路径:
@RequestMapping("/path/*/resource")
public String handleAntPath() {
// 处理 Ant 风格的路径匹配
return "viewName";
}
使用通配符 * 和 ** 可以实现 Ant 风格的路径匹配。
@RequestMapping 可以根据实际需要的情况进行组合和使用,以实现更加灵活的 URL 映射。从 Spring 4.3 开始,还引入了更具体的注解如 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping 等,分别用于更方便地定义 GET、POST、PUT、DELETE 请求的映射。
3 @EnableWebMvc
@EnableWebMvc
是一个Spring框架]的注解,用于在基于Java的Spring应用程序中启用Spring MVC(Model-View-Controller)
配置。通常将它应用于带有@Configuration注解的配置类上。
在Spring应用程序中,Spring MVC框架允许使用模型-视图-控制器的架构模式构建Web应用程序。它提供了处理HTTP请求、管理控制器、处理视图以及管理其他与Web相关组件的功能。
通过在配置类中添加@EnableWebMvc
,Spring
将启用以下功能:
RequestMappingHandlerMapping
:基于@RequestMapping
、@GetMapping
、@PostMapping
等注解,将传入的HTTP请求映射到适当的控制器方法。RequestMappHandlerAdapter
:帮助调用控制器方法并准备要发送回客户端的响应。- 异常处理:配置默认的
ExceptionHandlerExceptionResolver
来处理异常并返回适当的错误响应。 - 视图解析器:配置视图解析以将视图名称解析为实际的视图实现,例如
JSP
或Thymeleaf
模板。 - 静态资源处理:配置支持提供静态资源,如
CSS
、JavaScript
和图像。 - 消息转换器:配置消息转换器,用于在HTTP请求/响应与Java对象之间进行转换(例如JSON与POJO之间的转换)。undefined请看WebMvcConfigurer 类源码,重启其中的方法即可实现以上功能使用实例以下是在Spring配置类中使用@EnableWebMvc的示例:
@Configuration
@EnableWebMvc
public class MyWebConfig {
// 可以在这里定义其他配置和bean
}
需要注意的是,@EnableWebMvc
是较旧的配置Spring MVC
的方式。如果使用SpringBoot
,它提供了自动配置,通常不需要显式使用@EnableWebMvc,因为它已经包含在默认配置中。Spring Boot
会根据特定的依赖项和注解的存在自动启用与Web相关的配置。
在 MyWebConfig
中可以配置许多与 Spring MVC
和 Web
应用程序相关的内容。下面是一些可以在 MyWebConfig 类中进行配置的常见选项:
- 视图解析器(View Resolvers):配置用于将视图名称解析为实际视图实现的视图解析器。例如,可以配置使用
JSP
或Thymeleaf
模板引擎来呈现视图。
首先,确保项目中已经有一个视图文件夹(例如:/WEB-INF/views/),并且在其中存放了要渲染的 JSP 视图文件。
在 MyWebConfig 类中添加一个方法,用于配置视图解析器。该方法需要返回一个 ViewResolver 对象,并使用 InternalResourceViewResolver 类来配置 JSP 视图解析器。
下面是实现的代码:
代码语言:java复制import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
public class MyWebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/"); // 设置视图文件所在目录
viewResolver.setSuffix(".jsp"); // 设置视图文件后缀名
return viewResolver;
}
}
在上述代码中,创建了一个名为viewResolver
的方法,它返回一个 InternalResourceViewResolver
对象。我们通过调用 setPrefix()
方法设置了视图文件所在的目录为/WEB-INF/views/
,并通过调用 setSuffix()
方法设置了视图文件的后缀名为 .jsp。
这样配置后,当的控制器方法返回视图名时(例如:return “hello”
;),Spring MVC
将会自动将视图名解析为 /WEB-INF/views/hello.jsp
,然后渲染该 JSP 视图。
- 静态资源处理(
Static Resources Handling
):配置用于处理静态资源(如 CSS、JavaScript、图像等)的方式。可以定义静态资源的位置和URL映射规则。
实现静态资源处理的示例代码:
代码语言:java复制import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
@Configuration
@EnableWebMvc
public class MyWebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 定义静态资源位置和URL映射规则
// 例如,将所有以 /static/ 开头的 URL 映射到 /resources/ 目录下的静态资源
registry.addResourceHandler("/static/**")
.addResourceLocations("/resources/");
}
}
在上述代码中,我们重写了 addResourceHandlers()
方法,并在其中定义了静态资源处理器。
addResourceHandler()
方法用于定义静态资源的 URL 映射规则。在示例中,我们将所有以 /static/
开头的 URL 映射到/resources/
目录下的静态资源。这意味着客户端可以通过/static/
后跟静态资源文件名的方式来访问这些资源。
addResourceLocations()
方法用于指定静态资源的位置。在示例中,我们将静态资源放置在 /resources/
目录下,实际上可以将静态资源放置在任何目录。
假设有一个名为 style.css
的 CSS
文件,现在客户端可以通过/static/style.css
的 URL 来访问这个 CSS 文件,Spring MVC
会自动将请求映射到对应的静态资源
- 消息转换器(
Message Converters
):配置用于在 HTTP 请求和响应之间转换数据的消息转换器。常用的消息转换器包括处理 JSON、XML 等数据格式的转换器。
实现消息转换器配置的示例代码:
代码语言:java复制import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.MediaType;
import java.util.List;
@Configuration
@EnableWebMvc
public class MyWebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 添加 JSON 消息转换器
converters.add(new MappingJackson2HttpMessageConverter());
}
}
在上述代码中,我们重写了 configureMessageConverters()
方法,并在其中添加了一个 JSON 消息转换器 MappingJackson2HttpMessageConverter
。
configureMessageConverters()
方法用于配置消息转换器。在示例中,我们添加了一个 MappingJackson2HttpMessageConverter
实例,这个转换器可以将 Java 对象转换为 JSON 格式的数据,并将 JSON 格式的数据转换为 Java 对象。
Spring MVC 会按照配置的消息转换器的顺序尝试将请求和响应的内容转换为适当的数据格式。如果客户端发送的是 JSON 数据,MappingJackson2HttpMessageConverter
会将其转换为 Java 对象,并将其传递给后端处理。如果后端响应是 Java 对象,MappingJackson2HttpMessageConverter
将把它转换为 JSON 数据并发送给客户端。
还可以根据需要添加其他类型的消息转换器,例如处理XML
格式的数据。要添加 XML 消息转换器,可以使用MappingJackson2XmlHttpMessageConverter
或其他适合的转换器
- 拦截器(
Interceptors
):配置请求拦截器,用于在请求处理前后添加逻辑。拦截器可以用于日志记录、权限检查等场景。 - 文件上传配置(
File Upload Configuration
):配置用于处理文件上传的设置,例如设置文件上传的临时位置和最大文件大小。 临时位置和最大文件大小。文件上传通常涉及到将文件从客户端上传到服务器,并且在处理上传过程中需要一个临时位置来存储文件。
以下是一个实现文件上传配置的示例代码:
代码语言:java复制import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class MyWebConfig implements WebMvcConfigurer {
// 配置文件上传解析器
// 设置上传文件的临时存储位置和最大文件大小
// 这里设置为10MB,可以根据实际需要进行调整
public MultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setMaxUploadSize(10485760); // 设置最大文件大小为10MB (10 * 1024 * 1024 bytes)
resolver.setDefaultEncoding("UTF-8"); // 设置文件编码
return resolver;
}
}
在上述代码中,我们使用 CommonsMultipartResolver
来实现文件上传配置。这个解析器基于 Apache Commons FileUpload
库,是一个常用的文件上传解析器。
setMaxUploadSize() 方法用于设置最大文件大小,这里设置为 10MB(10 * 1024 * 1024 字节)。可以根据需要调整此值。
setDefaultEncoding()
方法设置文件编码,这里设置为 UTF-8。
此外,还需要在 web.xml
文件中进行一些配置,以使 Spring MVC
能够找到并使用这个配置类。在 web.xml 中添加以下配置:
<servlet>
<servlet-name>your-servlet-name</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>your.package.name.MyWebConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
替换 中的 your.package.name.MyWebConfig
为实际的配置类的完整包路径。
这样就完成了文件上传的配置。现在,当控制器处理文件上传时,可以使用 Spring MVC 的文件上传功能,并在指定的临时位置找到上传的文件
- 跨域资源共享(
CORS
):配置跨域资源共享,允许从其他域中访问的应用程序。 - 国际化和本地化(
Internationalization and Localization
):配置应用程序的国际化和本地化支持,以便根据用户的地区和语言提供不同的内容。 - 安全配置(
Security Configuration
):配置应用程序的安全性,例如基于角色的访问控制。 - 异常处理(
Exception Handling
):定义全局的异常处理器,用于处理应用程序中未处理的异常,并返回适当的错误响应。undefined其他定制化配置:根据的应用程序需求,还可以配置其他定制化的设置,例如添加自定义的Spring Bean
、数据库连接配置等。