Spring开篇介绍-如果没有Spring如何对外暴露一个接口

引言

目前我在互联网行业已经工作5年以上了,回想起刚毕业时刚刚接触Spring框架,做了一个专利管理系统,后续工作中负责过交易型业务,贷前和贷后业务,支付业务等。现在主要深耕营销活动领域,不管是自己开发还是依赖别人的中间件,对于java研发来说,Spring已经成为开发中必不可少的框架。

相信大家对于Spring的使用一定非常熟悉。那么我们想一想,如果没有Spring框架的话,我们在开发一个web接口,或者是一个数据库事物,我们又是如何去实现的呢?在本专栏中让我们带着这些问题去探究Spring框架是如何把这些功能实现的?

本章内容是Spring的开篇,该专栏的学习方式是带着问题找答案,大家可以把自己想象成一个侦探,给自己多提问题,寻找答案的过程就是在破案,我尽量把内容做的生动好理解,希望大家在读完文章后能有所收获。

学习Spring源码有什么用?

我是这样思考这个问题的,首先我们在做一件事情之前,一定会去想做这件事帮助我们解决了什么问题,带来什么好处,我为什么要去做。就比如我要看源码,我为什么要看源码?如果不看源码,只关注相关功能,一样能够满足工作要求。

但是如果只关注功能,不了解背后的运行原理,我们很难在技术上有所提升,阅读优秀的源码能让技术有质的提升,还能在阅读中学习新的想法和方案。

为什么要有开篇提问?

所以在后面Spring框架源码学习的过程中,我都会做一个开篇提问的步骤,这样做呢,能够在后面学习内容的时候,我们能够紧紧的扣住问题。让自己多去想问题,多思考才会有启发,让知识融会贯通。

下面就进入到Spring的正文内容,让我们开启学习Spring源码的之旅吧!

开篇提问

  1. 没有Spring时如何对外暴露一个Controller接口?
  2. 使用Spring如何暴露接口?

没有Spring时如何对外暴露一个Controller接口?

如果没有Spring框架加持的话,我们使用servlet编程暴露一个接口,估计很多人在一开始就接触Spring的话,如果Servlet不知道是什么。咳咳……这得补补课去啦。

注意,因为使用servlet容器,项目需要打成war包

目录结构
对外暴露HelloServletController类,重点注意WEB-INF/web.xml文件,该文件中映射接口访问路径,这样才能在浏览器中访问到
在目录结构

1、引入servlet相关依赖

可以参考下图tomcat官方的servlet和tomcat、jdk版本对照表,我在项目中使用的是tomcat8.5x,jdk1.8,所以选择servlet是3.1版本
servlet版本对照表格
官方链接:https://tomcat.apache.org/whichversion.html

maven依赖
注意打包时,指定war包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>xtol-parent</artifactId>
        <groupId>com.xtol</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>servlet-demo</artifactId>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
    </dependencies>
</project>

2、编写controller接口

使用Servlet暴露接口需要继承HttpServlet,HttpServlet是Servlet接口的一个实现类,并且它是一个抽象类,其中包括doPost,doGet等方法。子类实现这些方法可以做相关操作,代码中以doGet为例。

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 集成Servlet接口,实现需要的方法
 *
 * @author: gyl
 * @datetime: 2022-08-27 12:10
 */
public class HelloServletController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().write(req.getParameter("name") + ",欢迎使用Servlet!");
    }
}

3、暴露接口映射关系

一个接口要写一个标签定义服务映射路径,再写一个定义服务映射的类,从而对外暴露接口

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">
    <display-name>Servlet Application</display-name>

    <servlet>
        <servlet-name>helloServletController</servlet-name>
        <servlet-class>com.xtol.servlet.HelloServletController</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>helloServletController</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
</web-app>

4、接口演示

4.1、配置tomcat

配置tomcat应用,指定服务版本,一定要保证tomcat+servlet+jdk三个版本保持跟上面对照图的关系一致,否则出现不兼容问题就很棘手了
配置tomcat

4.2、引入依赖的war包

配置好tomcat后,引入war包,一定注意右侧红框中的Application context的内容跟浏览器要保持输入一致,如果只有左斜杠“/”的话,按照上面接口映射关系,访问路径是:http://localhost:8080/hello?name=无敌银
如果把左斜杠换成/aaa,那么在访问时在8080端口后面需要把/aaa也加上,例如:http://localhost:8080/aaa/hello?name=无敌银
引入依赖的war包

4.3、访问接口

因为我们暴露的是get请求方式的接口,所以直接在浏览器模拟就行,这样一个Servlet暴露的接口就完成了
接口演示

使用Spring如何暴露接口?

先使用spring boot搭建项目,这样可以减少很多默认的配置,因为spring boot的思想是约定大于配置,这样也可以减少引用jar包解决版本冲突问题

目录结构
对外暴露HelloController类,在使用Spring框架后,因为在类中使用@RequestMapping@RestController@GetMapping三个注解就完成接口暴露,所以不再需要web.xml中编写接口映射关系
目录结构

1、引入spring boot依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>xtol-parent</artifactId>
        <groupId>com.xtol</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>spring-demo</artifactId>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
    </dependencies>
</project>

2、编写controller接口

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: gyl
 * @datetime: 2022-08-27 14:32
 */
@RequestMapping
@RestController
public class HelloController {
    @GetMapping("/spring_hello")
    public String hello(String name) {
        return name + ",你好";
    }
}

3、接口演示

spring接口演示

总结

通过使用ServletSpring框架对外暴露一个Controller接口,Servlet需要配置一个web.xml,增加一个接口就需要增加一个映射关系,一个系统中接口很多,维护起来会很复杂。另外Servlet的接口类需要继承HttpServlet操作不友好,一个Controller类只能提供一个接口,这些问题在Spring中都不存在了,不需要维护web.xml文件,一个类中写不同的方法就可以提供多个接口了
参考对比:
servlet和spring对比
综上由此可见,Spring框架帮助开发同学解放双手,把一些复杂的编码操作变得简单容易。当然上面内容只是Spring框架功能中的冰山一角。从此片文章开始入门。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值