Spring MVC主要解决了接收请求、响应结果及相关的问题。
提示:这里可以添加本文要记录的大概内容:
例如:本文就介绍了SpringBoot的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
在Spring Boot项目中,添加spring-boot-starter-web
依赖项,即可添加Spring MVC框架所需的依赖!
提示:只需要将原有的
spring-boot-starter
改为spring-boot-starter-web
即可。
提示:在创建工程时,如果勾选了Web,本质上也是添加spring-boot-starter-web
依赖项,另外,还会在src/main/resources
下自动创建static
和templates
文件夹。
一旦添加了spring-boot-starter-web
,当启动Spring Boot项目时,会自动启动Tomcat,并将此项目部署到Tomcat上。
Spring Boot启动Tomcat时,默认占用8080
端口,可以在application.properties
中通过server.port
属性来修改端口号,例如:
# 服务端口
server.port=9080
Spring MVC需要自定义控制器类,在类中使用方法来接收请求。
关于控制器类:必须在项目的根包之下,且添加@Controller
注解。
关于处理请求的方法:
@RequestMapping
系列注解来配置路径public
代码如下(示例):
···
@Slf4j
@Controller
public class AlbumController {
public AlbumController() {
log.info(“创建控制器:AlbumController”);
}
// http://localhost:9080/a
@RequestMapping(“/a”)
public String xx() {
log.info(“开始处理请求……”);
return null;
}
}
提示:启动项目后,可以在浏览器或任何可以发出请求的软件中访问 http://localhost:9080/a ,目前会提示500
错误,在服务器端的控制台可以看到日志的输出,且每提交一次以上路径的请求,日志都会输出一次,反映为:每次提交请求,以上方法都会自动运行。
在处理请求方法上添加@ResponseBody
注解,则表示当前方法处理完请求后,将响应正文返回给浏览器
提示:如果没有使用响应正文的做法,则处理请求的方法的返回值表示某个视图组件。
当方法的返回值类型是String
时,响应正文将返回的字符串将作为HTML源代码直接响应到客户端去!还可以把@ResponseBody
添加在控制器类上,则当前控制器类中所有处理请求的方法都将响应正文。
另外,还可以使用@RestController
取代@Controller
和@ResponseBody
!
@RequestMapping
的主要作用是配置“请求路径”与“处理请求的方法”的映射关系。
在配置请求路径时,建议的做法是:在类和方法上分别添加此注解进行配置,在类上的配置值会和每个方法的配置值组合起来,形成完整的请求路径,所以,类上的配置值是一个“统一的URL前缀”,便于和其它控制器需要处理请求路径进行区分。
除了配置请求路径以外,@RequestMapping
注解还可以配置:
method
:用于限制请求方式produces
:用于配置响应头中的文档类型java @RequestMapping(value = {"value1", "value2", "value3"})
在所有注解中,
value`属性都是默认的属性,在配置此属性时,如果注解只配置这1个属性,则可以不必显式指定属性名,即:@RequestMapping(value = {"value1", "value2", "value3"})
@RequestMapping({"value1", "value2", "value3"})
以上2种配置方式是完全等效的!
在@RequestMapping
还定义了method
属性:
@RequestMapping(value = "/add-new", method = RequestMethod.POST)
以上代码表示/add-new
路径只能使用POST
方式来提交请求,如果使用其它请求方式,将响应405
错误。
如果没有配置method
属性,则所有请求方式都是支持的!
为了简化约束请求方式,Spring MVC还提供了以下注解:
@GetMapping
@PostMapping
在Spring MVC中,可以在处理请求的方法的参数列表中,按需添加所需的请求参数(需要客户端提交什么参数,就在方法的参数列表中写什么参数)。
当设计了请求参数后:
null
""
)在设计请求参数时,可以按需添加多个参数,且多个参数不区分先后顺序,各参数也可以按需设计为期望的数据类型
@RequestMapping("/add-new")
public String xx(String name, Integer sort) {
}
在提交的请求中,sort
参数必须是可以被转换成Integer
的,否则,将出现400
错误。
关于400错误:客户端没有按照服务器端的要求来提交请求参数,例如参数类型不可以被成功转换为期望的类型,或服务器要求必须提交某参数却没有提交。
关于Integer
类型的请求参数:
400
错误null
null
当请求参数的数量较多时,还可以将这些请求参数封装到类中,并使用这种类型作为处理请求的方法的参数!通常,建议使用专门的数据类型,而不要使用实体类型!
所以,在Spring MVC中,接收请求参数可以:
提示:以上2种做法可以共存。
甚至,可以按需添加某些特定的参数,例如:HttpServletRequest
、HttpServletReponse
、HttpSession
、其它框架允许的且添加了特定的注解的参数。
http://localhost:8080/album/9527/delete
Spring MVC框架对RESTful提供了很好的支持,要实现以上效果,可以在方法上配置为:
@RequestMapping("/{id}/delete")
在处理请求的方法的参数列表中,可以声明与占位符的名称匹配的参数,并添加@PathVariable
注解,即可接收到URL中的参数值:
// http://localhost:9080/album/9527/delete
@RequestMapping("/{id}/delete")
public String delete(@PathVariable Long id) {
log.debug("开始处理删除id={}请求", id);
return "处理了/" + id + "/delete的请求";
}
提示:如果URL中占位符的名称与方法参数的名称不匹配,可以在
@PathVariable
注解中配置参数,值为URL中占位符的名称即可,则方法参数的名称就不重要了!例如:
@RequestMapping("/{albumId}/delete")
public String delete(@PathVariable("albumId") Long id) {
log.debug("开始处理删除id={}请求", id);
return "处理了/" + id + "/delete的请求";
}
在前后端分离的开发模式下,如果前端(客户端)和后端(服务器端)并不是同一台主机或同一个IP地址,在默认情况下,是不允许跨域访问的(错误提示关键字为:CORS),需要在后端项目中添加以下配置类:
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
Spring MVC主要解决了接收请求、响应结果及相关的问题。