关于Spring MVC框架

这篇具有很好参考价值的文章主要介绍了关于Spring MVC框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Spring MVC框架的作用

关于控制器

 关于统一处理异常的方法:

在处理异常的类中,关于处理异常的方法:

Knife4j框架

添加依赖

关于Knife4j的配置类:


Spring MVC框架的作用

Spring MVC框架的基础依赖项是spring-webmvc。

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

关于控制器

控制器(Controller)是用于接收请求、响应结果的。

在类上添加@Controller即可将此类标记为“控制器类”。

默认情况下,Spring MVC框架处理响应时,并不是“响应正文”的,各方法的返回值表示“视图组件的名称”,也就是说,每次处理完请求后,Spring MVC框架还应该处理一个“视图”,最终,将“视图”响应到客户端去,这不是前后端分离的做法。

目前,主流的开发模式是前后端分离的,更加适用于多种不同客户端软件的项目中,在这种模式下,当服务器端每次处理完请求后,只需要将结果(数据)响应到客户端,由客户端去决定如何识别、使用所响应的数据。

在处理请求的方法上添加@ResponseBody注解,即可使得此方法是“响应正文”的,即方法的返回值会直接响应到客户端去,就符合前后端分离的模式。

也可以将@ResponseBody添加在控制器类上,则当前类中所有处理请求的方法都是“响应正文”的!

在开发实践中,通常选择在类上添加@RestController注解,此注解使用了@Controller和@ResponseBody作为其元注解,同时具有这2个注解的效果,其源代码:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

关于@RequestMapping注解 在Spring MVC框架中,提供了@RequestMapping,主要用于配置请求路径与处理请求的方法的映射关系。

还可以在控制器类上添加@RequestMapping注解,当配置了某个路径值后,此路径值将作为当前控制器类中的每个处理请求的URL的前缀部分,例如,在类上的配置值是/album,在方法上的配置值是/add-new,则完整的URL就是/album/add-new。

提示:如果在控制器类和方法上都使用@RequestMapping配置了URL,框架会自动处理必要的和多余的/,例如:

在类上使用@RequestMapping的配置值 在方法上使用@RequestMapping的配置值

/album /add-new

/album add-new

album /add-new

album add-new

/album/ /add-new

/album/ add-new

album/ /add-new

album/ add-new

以上配置的组合都是等效的!通常,推荐使用以上第1种或第4种。

在@RequestMapping注解的源代码中有:

String[] value() default {};

以上代码表示:

value():表示此注解可以配置名为value的属性

String[]:表示此属性的值是String[]类型的

default {}:表示此属性的默认值是空数组

所以,在使用时,可以配置为:

@RequestMapping(value = {"a", "b"})

在Java语言中,如果需要配置的注解参数的属性名是value,且只配置这1个属性时,可以不必显式声明属性名称,即:

@RequestMapping(value = {"a", "b"})
@RequestMapping({"a", "b"})

以上2种写法是完全等效的!

在Java语言中,如果需要配置的注解属性的值是某种数组,但是,需要使用的数组值中只有1个元素时,可以不必使用大括号将其框住,即:

@RequestMapping({"a"})
@RequestMapping("a")

以上2种写法是完全等效的!

在@RequestMapping的源代码有:

@AliasFor("path") // 关注
String[] value() default {};

以上@AliasFor表示“等效于”,所以,在源代码中还有:

@AliasFor("value")
String[] path() default {};

另外,在@RequestMapping的源代码中有:

RequestMethod[] method() default {};

以上属性用于“限制客户端提交请求时的请求方式”,如果没有配置此属性,则所有的请求方式都是允许的,如果进行限制,则只允许特定的请求方式,如果使用了不匹配的请求方式,将响应405,例如,配置为:

@RequestMapping(value = "/hello", method = RequestMethod.POST)

当提交GET类型的请求时,服务器端将响应:

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback. Thu Feb 23 11:35:10 CST 2023 There was an unexpected error (type=Method Not Allowed, status=405).

并且,如果存在2个配置,只要请求方式不同,URL允许相同!例如:

@RequestMapping(value = "/hello", method = RequestMethod.POST)
public String hello1() {
    // ...
}

@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello2() {
    // ...
}

 在Spring MVC框架中,提供了一些基于@RequestMapping的其它注解,例如:

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping

@PatchMapping

开发实践小结

在控制器类上推荐使用@RestController

在控制器类上推荐使用@RequestMapping配置URL前缀

各处理请求的方法上推荐使用@GetMapping等限制了请求方法的注

解来配置URL统一处理异常

Spring MVC框架提供了统一处理异常的机制,可以实现“对于每种异常,只需要编写1次处理此异常的代码即可,无论在处理哪个请求的过程中出现此异常,都会通过这同一段代码进行处理”。

 关于统一处理异常的方法:

注解:@ExceptionHandler

返回值类型:参考处理请求的方法

方法名:参考处理请求的方法

参数列表:必须包含异常类型的参数,表示需要被处理的异常,并且,只能按需添加HttpServletRequest、HttpServletResponse等少量特定类型的参数,不可以随意添加其它参数,当方法有多个参数时,各参数可以不区分先后顺序 例如,在AlbumController中添加:

@ExceptionHandler
public JsonResult handleServiceException(ServiceException e) {
    return JsonResult.fail(ServiceCode.ERROR, "出错啦~~~!");
}

则当前类中任何处理请求的方法不再需要处理ServiceException,如果执行过程中出现了ServiceException,都会由以上方法进行处理!

需要注意:当把处理异常的方法定义在控制器类中时,仅作用于当前控制器类中所有处理请求的方法,无法作用于其它控制器类中处理请求的方法!

应该自定义类,在类上添加@ControllerAdvice注解,则此类中特定的方法(例如添加了@ExceptionHandler注解的方法)将作用于Spring MVC框架处理每个请求的过程中,例如:

@ControllerAdvice

public class GlobalExceptionHandler {

@ExceptionHandler
@ResponseBody
public JsonResult handleServiceException(ServiceException e) {
    return JsonResult.fail(ServiceCode.ERROR, "出错啦~~~!");
}

 另外,也可以使用@RestControllerAdvice来取代

@ControllerAdvice与@ResponseBody,例如:

@RestControllerAdvice // 取代@ControllerAdvice与@ResponseBody

public class GlobalExceptionHandler {

@ExceptionHandler
public JsonResult handleServiceException(ServiceException e) {
    return JsonResult.fail(ServiceCode.ERROR, "出错啦~~~!");
}

}  

在处理异常的类中,关于处理异常的方法:

允许同时存在若干个处理异常的方法,但各方法处理的异常必须不同 多个处理不同异常的方法,所处理的异常允许存在父子级关系,在实际处理时,优先按照最匹配的类型的方法进行处理 强烈建议添加处理Throwable类型异常的方法,避免向客户端响应500错误

在此方法中,应该记录异常的类型和关键信息,并且,执行到此方法时,应该及时添加新的、处理对应异常的方法 另外,关于异常信息的描述,应该是“谁抛出,谁描述”的原则,所以,应该在ServiceException类中添加带String message的构造方法,并且通过父级类别的构造方法将参数用于对detailMessage属性(定义在Throwable类中)赋值,后续,可以通过getMessage()方法获取此值,例如:

public class ServiceException extends RuntimeException {

public ServiceException(String message) {
    super(message);
}

然后,在业务实现过程中,当需要抛出异常时,封装描述文本,例如:

// 判断查询结果是否为null
if (album == null) {
    // 是:数据不存在,抛出异常
    String message = "删除相册失败,尝试删除的相册数据不存在!";
    log.warn(message);
    throw new ServiceException(message);
}

后续,在全局异常处理器中,通过异常对象可以获取所封装的描述文本,例如:

@ExceptionHandler
public JsonResult handleServiceException(ServiceException e) {
    return JsonResult.fail(ServiceCode.ERROR, e.getMessage());
}

Knife4j框架

Knife4j是一款基于Swagger的在线API文档框架。

关于Knife4j的使用,步骤为:

添加依赖

注意:当前使用的Knife4j必须基于Spring Boot 2.6以下版本(不含2.6),如果需要使用更高版本的Spring Boot,则需要使用更高版本的Knife4j 在主配置文件中启用Knife4j的增强模式

knife4j.enable=true

在项目中添加Knife4j的配置类

复制代码即可 注意:必须关注“控制器类的根包”的值是否匹配 关于Knife4j的依赖项:

<!-- Knife4j Spring Boot:在线API -->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>2.0.9</version>
</dependency>

关于Knife4j的配置类:

package cn.tedu.csmall.product.config;

import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

/**

 * Knife4j配置类
   *

 * @author java@tedu.cn

 * @version 0.0.1
   */
   @Slf4j
   @Configuration
   @EnableSwagger2WebMvc
   public class Knife4jConfiguration {

   /**

    * 【重要】指定Controller包路径
      */
      private String basePackage = "cn.tedu.csmall.product.controller";
      /**
    * 分组名称
      */
      private String groupName = "product";
      /**
    * 主机名
      */
      private String host = "http://java.tedu.cn";
      /**
    * 标题
      */
      private String title = "宇宙在线API文档--商品管理";
      /**
    * 简介
      */
      private String description = "宇宙在线API文档--商品管理";
      /**
    * 服务条款URL
      */
      private String termsOfServiceUrl = "http://www.apache.org/licenses/LICENSE-2.0";
      /**
    * 联系人
      */
      private String contactName = "Java";
      /**
    * 联系网址
      */
      private String contactUrl = "";
      /**
    * 联系邮箱
      */
      private String contactEmail = "15503412624@163.com";
      /**
    * 版本号
      */
      private String version = "1.0.0";

   @Autowired
   private OpenApiExtensionResolver openApiExtensionResolver;

   public Knife4jConfiguration() {
       log.debug("创建配置类对象:Knife4jConfiguration");
   }

   @Bean
   public Docket docket() {
       String groupName = "1.0.0";
       Docket docket = new Docket(DocumentationType.SWAGGER_2)
               .host(host)
               .apiInfo(apiInfo())
               .groupName(groupName)
               .select()
               .apis(RequestHandlerSelectors.basePackage(basePackage))
               .paths(PathSelectors.any())
               .build()
               .extensions(openApiExtensionResolver.buildExtensions(groupName));
       return docket;
   }

   private ApiInfo apiInfo() {
       return new ApiInfoBuilder()
               .title(title)
               .description(description)
               .termsOfServiceUrl(termsOfServiceUrl)
               .contact(new Contact(contactName, contactUrl, contactEmail))
               .version(version)
               .build();
   }
   }
   完成后,启动项目,可以通过 http://localhost:8080/doc.html 进行访问。

以上就是本次文章   希望对你有所帮助~文章来源地址https://www.toymoban.com/news/detail-449173.html

到了这里,关于关于Spring MVC框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java EE】关于Spring MVC 响应

    在博主前面写的博客 【Java EE】Spring请求如何传递参数详解 中我们已经设置了响应数据,Http响应结果可以是数据,也可以是静态⻚⾯,也可以针对响应设置状态码, Header信息等 首先我们像创建一个静态界面,创建位置如下: 前端代码如下: 不过这里的后端的代码和以前的代码

    2024年04月14日
    浏览(49)
  • Spring MVC框架

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一

    2024年02月05日
    浏览(39)
  • 38、springboot为 spring mvc 提供的静态资源管理,覆盖和添加静态资源目录

    ▲ 默认的四个静态资源目录: /META-INF/resources /resources /static /public ▲ ResourceProperties.java类的源代码,可看到CLASSPATH_RESOURCE_LOCATIONS常量的定义: CLASSPATH_RESOURCE_LOCATIONS = new String[]{“classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, “classpath:/public/”}; 这意味

    2024年02月11日
    浏览(45)
  • JavaWeb框架:Spring MVC介绍

    MVC(Model View Controller,模型-视图-控制器) ,作为一种设计模式,用于应用程序的分层开发。 Spring MVC ,由 Spring 框架提供的基于 MVC 设计模式的一个轻量级 Web 开发框架。Spring MVC 提供了一个前端控制器 DispatcherServlet 来分派请求,然后通过配置处理程序映射、视图解析等,使

    2024年02月12日
    浏览(34)
  • 【Spring框架全系列】初识Spring MVC(上)

    🌃哈喽,大家好,我是小浪。接着上篇博客,我们学习了springboot配置日志文件,到此,那么springboot的内容也更新的差不多了,由于是初学阶段,所以不学习那么深入,那么我们学习框架都知道SSM,当前我们已经学习完毕springboot了,那么今天就来学习第二个S,Spring MVC;📬📬

    2024年02月07日
    浏览(124)
  • Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(一)

    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅 3.流程跳转 在web.xml里添加Servlet然后执行 可以看到通过url拼接可以获取传递的数据 四种跳转指的是:在SpringMVC中控制器与JSP或者控制器与控制器之间的跳转。 Controller - - forward — JSP Co

    2024年02月05日
    浏览(57)
  • 【框架篇】Spring MVC 介绍及使用(详细教程)

    MVC(Model-View-Controller)是一种常见的软件设计模式,用于将应用程序的逻辑分离成三个独立的组件: 模型(Model) :模型是应用程序的数据和业务逻辑的表示。它负责处理数据的读取、存储和操作,以及业务规则的处理。模型通常是独立于用户界面的,可以在不同的视图和控

    2024年02月14日
    浏览(45)
  • SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!

    (1) 创建工程 创建一个Maven的web工程 pom.xml添加SSM需要的依赖jar包 编写Web项目的入口配置类,实现 AbstractAnnotationConfigDispatcherServletInitializer 重写以下方法。 getRootConfigClasses() :返回Spring的配置类-需要 SpringConfig 配置类。 getServletConfigClasses() :返回SpringMVC的配置类-需要 SpringMvc

    2024年01月17日
    浏览(59)
  • 【SpringMVC】基于 Spring 的 Web 层MVC 框架

    🎄欢迎来到@边境矢梦°的csdn博文🎄 🎄本文主要梳理SpringMVC : 基于 Spring 的 Web 层MVC 框架 🎄 🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下 🫰🫰🫰 ,下次更新不迷路🎆 Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大

    2024年02月08日
    浏览(42)
  • springBoot 配置文件 spring.mvc.throw-exception-if-no-handler-found 参数的作用

    在Spring Boot应用中,可以通过配置文件来控制当找不到请求处理器(handler)时是否抛出异常。具体的配置参数是 spring.mvc.throw-exception-if-no-handler-found 。 默认情况下,该参数的值为 false ,即当找不到请求处理器时,Spring MVC会返回404 Not Found响应。如果将该参数设置为 true ,则当

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包