# Spring MVC框架

Spring MVC框架的作用

Spring MVC主要解决了接收请求、响应结果及相关的问题。

文章目录

    • Spring MVC框架的作用
  • 前言
  • 一、## 基础配置
  • 二、使用Spring MVC框架接收请求
    • 响应正文
    • @RequestMapping
    • 接收请求参数
    • RESTful风格
  • 三、## 前后端分离的跨域访问
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

例如:本文就介绍了SpringBoot的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、## 基础配置

在Spring Boot项目中,添加spring-boot-starter-web依赖项,即可添加Spring MVC框架所需的依赖!

提示:只需要将原有的spring-boot-starter改为spring-boot-starter-web即可。
提示:在创建工程时,如果勾选了Web,本质上也是添加spring-boot-starter-web依赖项,另外,还会在src/main/resources下自动创建statictemplates文件夹。

一旦添加了spring-boot-starter-web,当启动Spring Boot项目时,会自动启动Tomcat,并将此项目部署到Tomcat上。

Spring Boot启动Tomcat时,默认占用8080端口,可以在application.properties中通过server.port属性来修改端口号,例如:

# 服务端口
server.port=9080

二、使用Spring MVC框架接收请求

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

@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种做法可以共存。

甚至,可以按需添加某些特定的参数,例如:HttpServletRequestHttpServletReponseHttpSession、其它框架允许的且添加了特定的注解的参数。

RESTful风格

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主要解决了接收请求、响应结果及相关的问题。

你可能感兴趣的:(SpringBoot框架技术,spring,mvc,java)