前端开发学习Spring Boot开发,写接口请求,并配置全局请求拦截器
因为我用的idea是社区版,所以首先在Spring boot初始化一个项目。我的选项是
安装了两个插件:
Spring Web插件是Spring Boot框架中用于开发Web应用程序的模块。它提供了创建RESTful服务的能力,支持数据绑定,数据验证,CSRF保护,表单处理等功能。
Lombok插件是一个Java库,它可以通过注解的方式,使得Java代码变得更加简洁,提高开发效率。例如,你可以使用@Data注解,Lombok会自动为你的类生成getter和setter方法,以及equals,hashCode和toString方法。这样可以减少大量的样板代码。
因为我本机安装的jdk是1.8所以我改了pom.xml文件中的相关版本
之后重新下载依赖文件。
写一个请求
先认识一下启动类
默认会自动生成一个启动类,每一个启动类对应一个配置项,就是上图有右上角的东西。
启动类就是程序的入口。
众所周知,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
执行项目,然后在浏览器访问
成功返回!
内置服务器
这里说明一下,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
方法中传入"/**",表示拦截所有请求。
这样,每次请求都会先经过MyInterceptor
的preHandle
方法,然后是Controller
的处理方法,接着是postHandle
方法,最后是afterCompletion
方法。
我再请求一下最上面的接口地址http://localhost:9000/helloWorld
,结果
这种写全局请求拦截器的方式真的一开始有点莫名其妙。关键是在只有一个启动类下怎么就被这个配置类拦截了呢?
根本不如express框架那样只要在程序最前面写一个中间件就可以。
后来慢慢理解了。这种面向对象的编程方式和之前学的模板方法设计模式非常接近,就是覆写内置的方法。
换句话说人家的拦截逻辑是内置的,你只要实现implements
对应的内置类就可以了,好吧!
转载自:https://juejin.cn/post/7371640570422116361