首页 > 其他分享 >SpringMVC框架详解

SpringMVC框架详解

时间:2022-10-23 20:47:38浏览次数:73  
标签:RequestMapping 框架 SpringMVC class 详解 student getStudent 注解 public

简述

  SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring的 Spring MVC 框架或集成其他 MVC 开发框架,如 Struts1(现在一般不用),Struts2 等。

  SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。

SpringMVC的优势

  SpringMVC有清晰的模块划分,把任务分配给角色各司其职

  和spring其他框架能进行无缝连接

  可适配,通过 HandlerAdapter 可以支持任意的类作为处理器。

  可定制性,HandlerMapping、ViewResolver 等能够非常简单的定制

SpringMVC的执行流程

RequestMapping注解

  用于建立请求 URL 和处理请求方法之间的对应关系,它可以放在类上,也可以放在方法上,它的value属性和path属性是一个路径

  method属性用于指定请求的类型,它是枚举类型,method = RequestMethod.POST即为post请求,method = RequestMethod.GET即为get请求

  headers属性指定请求的头部,比如headers = "content-type=text/*" 可以指定网页的数据编码类型

  params属性可以指定请求的参数,如果参数不匹配就无法响应

  被RequestMapping注解的方法可以加参数,可以用来接受http的请求数据,但变量名和请求的key名要一致

SpringMVC相关注解

  通过代码侵入性较弱的注解的方式,springmvc提供了一套实现各种功能的注解,常用注解如下:

@Controller

  @Controller标注在类上,表明这个类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。

@Controller
public class StudentController {
    
}

@RequestMapping

  @RequestMapping注解标注到方法上并关联一个url路径,表示该路径的请求会由该方法进行处理

  如果不加下面的@ResponseBody注解,返回值会通过视图处理器ViewResolver处理为页面的URL,然后跳转到对应页面中

@Controller
public class StudentController {
    @RequestMapping("/getStudent")
    String getStudent(){
        return "student";
    }
}

  像这样返回string,会跳转到

@ResponseBody  

  @ResponseBody注解标注在方法上,表示该方法返回值会通过HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

  或者标注在类上,表示该类所有方法均设置成ResponseBody方法返回数据

@Controller
public class StudentController {
    @RequestMapping("/getStudent")
    @ResponseBody
    public String getStudent(){
        return "student";
    }
}

  现在这个方法的返回值会被视为HTTP的响应体

  如果返回值是类,那么框架会自动序列化为JSON格式

@Controller
public class StudentController {
    @RequestMapping("/getStudent")
    @ResponseBody
    public Student getStudent(){
        return new Student("xiaoming",18);
    }
}

@RequestBody

  @RequestBody注解标注在方法参数前面,用来解析前端请求体中传递给后端的json字符串中的数据,像这样前端的json数据会被解析封装为一个Student类

@Controller
public class StudentController {
@RequestMapping("/getStudent")
@ResponseBody
public String getStudent(@RequestBody Student student){
System.out.println(student);
return "student";
}
}

@ResponseStatus

  @ResponseStatus注解用于返回特定的HTTP状态码,例如下面代码返回的是201

@Controller
public class StudentController {
    @RequestMapping("/getStudent")
    @ResponseBody
    @ResponseStatus(HttpStatus.CREATED)
    public String getStudent(@RequestBody Student student){
        System.out.println(student);
        return "student";
    }
}

@PathVariable

  @PathVariable注解使用在方法参数前,用于取出放在url上的参数,需配合RequestMapping使用

  在url里用大括号将要传入的参数进行标注,我们就可以把url上的参数拿到了

@Controller
public class StudentController {
    @RequestMapping("/student/{id}")
    @ResponseBody
    public String getStudent(@PathVariable Integer id){
        System.out.println(id);
        return "student";
    }
}

@RequestParam

  @RequestParam注解标注在参数前,用于获取get请求中url用?方式传递的参数

@Controller
public class StudentController {
    @RequestMapping("/student")
    @ResponseBody
    public String getStudent(@RequestParam Integer id){
        System.out.println(id);
        return "student";
    }
}

参数校验

  我们可以校验前端传入的参数是否符合我们的要求

  一种方法是我们可以手动取出前端的参数,自己判空,为空抛异常,但是这样太麻烦了

  我们可以在封装的类的成员上标注@NotNull,这是JDK提供的注解

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    @NotNull
    private String name;
    private Integer age;
}

  然后在Controller类中方法的参数列表上标注@Valid,此时框架就会自动帮我们校验该参数的状态

@Controller
public class StudentController {
    @RequestMapping("/student")
    @ResponseBody
    public String getStudent(@RequestBody @Valid Student student){
        return student.toString();
    }
}

异常处理

ResponseStatusException

  我们可以在需要抛出异常的地方抛出spring框架为我们提供的异常ResponseStatusException

@Controller
public class StudentController {
    @RequestMapping("/student")
    @ResponseBody
    public String getStudent(){
        throw new ResponseStatusException(HttpStatus.NOT_FOUND,"Student not fund!");
    }
}

  我们在异常中设置http的状态码和异常的信息

  如果使用此方法的话要在yml进行配置

server:
  error:
    include-message: always

自己定义的异常

  我们可以抛出自己定义的异常,方便我们定义业务中的问题,同时发生异常后的返回数据格式我们也可以自己定义

  例如我们定义如下的错误返回数据

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ErrorResult {
    private String message;
}

  我们定义了如下的自定义异常

public class StudentNotFoundException extends RuntimeException {
    public StudentNotFoundException(String message) {
        super(message);
    }
}

  然后我们创建一个类用于处理异常,然后可以使用@ControllerAdvice注解进行标注,在类中每一个方法对应一个异常

  然后我们就可以构建我们的错误返回数据类,并将错误信息返回至前端

@ExceptionHandler(CarNotFoundException.class)
public ResponseEntity<ErrorResult> handle(CarNotFoundException ex) {
ErrorResult errorResult = new ErrorResult(ex.getMessage());
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResult);
}

  我们也可以直接返回errorResult,此时记得要加@ResponseBody

@ExceptionHandler(StudentNotFoundException.class)
@ResponseBody
public ErrorResult handle(StudentNotFoundException ex) {
    ErrorResult errorResult = new ErrorResult(ex.getMessage());
    return errorResult;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

  

 

标签:RequestMapping,框架,SpringMVC,class,详解,student,getStudent,注解,public
From: https://www.cnblogs.com/CNLayton/p/16819211.html

相关文章

  • php-fpm 配置详解
    php-fpm工作流程php-fpm全名是PHPFastCGI进程管理器php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置。启动php-fpm之后,会创建一......
  • Hibernate缓存及核心接口类详解
    Hibernate缓存概述一级缓存(session级别缓存)也叫事务级别的缓存二级缓存(sessionFactory缓存)也叫应用级缓存三级缓存(查询缓存)区别:一级缓存的生命周期和session的生命......
  • 10.stm32启动文件详解
    ......
  • 利用Bootstrap 框架来制作栅格系统与轮播图
    Bootstrap框架官网:http://getbootstrap.com/中文网址:https://www.bootcss.com/简介:BS是用来做响应式页面的前端UI框架,它提供了栅格系统、样式布局、API供我们直接使用......
  • Linux下IIC驱动编写,介绍IIC子系统框架的使用
    一、IIC协议介绍说起IIC,搞单片机,嵌入式的那肯定是接触的比较多的。串口、IIC、SPI这3个协议在单片机阶段应该是用比较多的,很多的外设模块,芯片都是串口、IIC、SPI等协议与主......
  • gin框架(4)- binding和validate
    前言在Engine与Context中,我们提到了Context的作用之一就是解析request请求并实现request在上下游的传递,其中的解析request调用的是binding相关的函数,解析完数据,还需......
  • 7.Python自定义排序详解
    如果以创建的对象作为列表中的元素,那么对列表进行排序时可使用sort()函数或sorted()函数,但要注意的是:①当排序对象为列表的时候两者适合的场景不同②sorted()函数会返......
  • gin框架(3)- Engine与Context
    前言在上一章,我们讲述了request请求是如何在gin中流转的,其中提到了两个比较重要的结构体Engine和Context。Engine在gin中充当server的角色,Context则负责对request的封装(类......
  • Sentinel(二)--限流详解
    在Sentinel中,限流的直接表现形式是,在执行EntrynodeA=SphU.entry(resourceName)的时候抛出FlowException异常。FlowException是BlockException的子类,您可以捕捉Blo......
  • php yield详解
       简单例子//包含yield的函数可以生成一个generator对象,可以被foreach遍历functionGenerator(){for($i=0;$i<3;$i++){echo"输出存在......