前端开发学习Spring Boot开发,写接口请求,并配置全局请求拦截器

因为我用的idea是社区版,所以首先在Spring boot初始化一个项目。我的选项是

image.png

安装了两个插件:

Spring Web插件是Spring Boot框架中用于开发Web应用程序的模块。它提供了创建RESTful服务的能力,支持数据绑定,数据验证,CSRF保护,表单处理等功能。

Lombok插件是一个Java库,它可以通过注解的方式,使得Java代码变得更加简洁,提高开发效率。例如,你可以使用@Data注解,Lombok会自动为你的类生成getter和setter方法,以及equals,hashCode和toString方法。这样可以减少大量的样板代码。

因为我本机安装的jdk是1.8所以我改了pom.xml文件中的相关版本

image.png

之后重新下载依赖文件。

写一个请求

先认识一下启动类

image.png

默认会自动生成一个启动类,每一个启动类对应一个配置项,就是上图有右上角的东西。

启动类就是程序的入口。

众所周知,java是强类型语言,采用严格的面向对象编程。和JavaScript这种天生适合面向过程编程的有很大不同,写java是需要将过程或业务转为对象的。

我要写一个接口,就是写一个类,然后写一个方法。现在我来写一个hellWorld接口。我需要先创建一个HelloWorldController类。具体内容

package helloWorld.start; // 包地址 外显的包地址 比nodejs还是不同

import org.springframework.web.bind.annotation.GetMapping; // 引入依赖包 也使用关键词import
import org.springframework.web.bind.annotation.RestController; // 引入依赖包

@RestController //注解 理解某种快捷方式
public class HelloWorldController { // 一个java的类
    @GetMapping("/helloWorld") //注解 理解某种快捷方式
    public String helloWorld(){  // 方法
        return "Hello World!";
    }
}

然后我改一下访问端口号,具体在application.properties改,改端口号为9000

image.png

执行项目,然后在浏览器访问

image.png

成功返回!

内置服务器

这里说明一下,Spring Boot内置了Tomcat。Tomcat是一个web 服务器,这样你就不用额外开启服务器了。

Tomcat实质是一个应用服务器,主要用于执行Java代码,如Java Servlet、JavaServer Pages (JSP)、Java Expression Language和Java WebSocket等技术。它可以创建动态内容。

和Nginx有相同之处,都是服务器,但Nginx主要用于处理静态内容,如HTML、CSS和JavaScript文件。它也可以作为反向代理服务器,将请求转发到其他服务器(如Tomcat)处理。

这些都是开发基础知识,比如使用vue单页面项目做本地开发,实际内置了nodejs的http模块作为服务器。

注解

注解是Java的一个特性,它从Java 5开始引入。注解使得开发可以以声明的方式编程。我认为就是一种快捷方式。比如我可以自己定义一个注解

通过使用@interface关键字来创建自定义注解

public @interface MyCustomAnnotation {
    String value() default "";
}

上面定义了一个名为MyCustomAnnotation的注解,它有一个名为value的元素,且默认值为空字符串。然后可以在类、方法或字段上使用这个注解

@MyCustomAnnotation("Hello, World!")
public class MyClass {
    //...
}

MyClass类上使用了MyCustomAnnotation注解,并为value元素赋值为"Hello, World!"。可以说注解大大简化了代码的复杂性。

解释一下上面注解的作用。

这个自定义注解MyCustomAnnotation本身并没有任何作用。它只是一个标记,可以被附加到Java的类、方法或字段上。这个注解有一个名为value的元素,可以接受一个字符串值,如果使用这个注解时没有指定value,那么默认值是空字符串。

注解的作用取决于你如何使用它。例如,你可以在代码中查找使用了这个注解的类、方法或字段,然后根据value的值来执行一些操作。这需要你自己编写处理注解的代码。

例如,可以定义这个注解用来标记那些需要进行特殊处理的方法,然后在运行时通过Java的反射API找到这些方法并执行特殊处理。

@MyCustomAnnotation("specialMethod")
public void myMethod() {
    //...
}

然后可以编写如下的代码来找到并调用这个方法:

for (Method method : MyClass.class.getMethods()) {
    if (method.isAnnotationPresent(MyCustomAnnotation.class)) {
        MyCustomAnnotation annotation = method.getAnnotation(MyCustomAnnotation.class);
        if ("specialMethod".equals(annotation.value())) {
            method.invoke(myClassInstance);
        }
    }
}

当然你可以自定义更加复杂的注解,比如类似@RestController的注解,@RestController是一个Spring MVC的注解,它是@Controller@ResponseBody两个注解的组合。它的主要作用是将Controller的方法返回的对象通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用@RestController注解的Controller类中的方法无需再使用@ResponseBody注解,因为这个类返回的所有值都会自动被转换成JSON格式。

顺便解释一下@GetMapping

@GetMapping是Spring MVC中的一个注解,它是@RequestMapping注解的一个简化版,用于处理HTTP GET请求。

@GetMapping注解用于将一个特定的HTTP GET请求映射到一个特定的处理方法上

@GetMapping("/hello")
public String hello() {
    return "Hello, World!";
}

上面当应用收到一个路径为"/hello"的GET请求时,Spring MVC会调用hello()方法来处理这个请求。

也可以在@GetMapping注解中指定一个或多个参数

@GetMapping(value = "/hello", params = "name")
public String hello(String name) {
    return "Hello, " + name + "!";
}

写到这里觉得注解有些像nodejs里面中间件。

配置全局请求拦截器

在nodejs的express中写全局拦截器或者在vue单页面项目中都是可以写全局拦截器的,Spring boot当然也可以。

在Spring Boot项目中,可以通过实现HandlerInterceptor接口来创建一个全局请求拦截器。创建一个名为MyInterceptor的类,实现HandlerInterceptor接口

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle被调用");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle被调用");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion被调用");
    }
}

然后,创建一个配置类,将拦截器添加到Spring的拦截器链中:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

在上述代码中,在addPathPatterns方法中传入"/**",表示拦截所有请求。

这样,每次请求都会先经过MyInterceptorpreHandle方法,然后是Controller的处理方法,接着是postHandle方法,最后是afterCompletion方法。

我再请求一下最上面的接口地址http://localhost:9000/helloWorld,结果

image.png

这种写全局请求拦截器的方式真的一开始有点莫名其妙。关键是在只有一个启动类下怎么就被这个配置类拦截了呢?

根本不如express框架那样只要在程序最前面写一个中间件就可以。

后来慢慢理解了。这种面向对象的编程方式和之前学的模板方法设计模式非常接近,就是覆写内置的方法。

换句话说人家的拦截逻辑是内置的,你只要实现implements对应的内置类就可以了,好吧!

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值