• 通过SpringBoot实现一个简单的httpServer(详细)


    好久没写程序了,也赶不上时代的步伐,靠着一些基础加上网上的资料,实现了一个:使用SpringBoot来建一个简单的Servert程序,包含与数据库交互的部分。

    前端是用postman做的测试。

    简单点说,除了数据库的部分,主要是参考了https://blog.csdn.net/az44yao/article/details/118059945,中途遇到了好多坑,所以写下来记录一下,也帮助一下和我类似的朋友。

    关于前端

    这几个红框部分是需要注意的
    在这里插入图片描述
    get和post就不说了,下一个层级,Params写的参数会带在url里,Body的方式则不会。Body主要使用form-data和json两种方式传递数据。

    关于后端

    环境搭建

    下载IDEA,我的是2021.3.3版本

    新建项目

    注意,这里的部分依赖,如果不引入全,后面怎么引入我也没找到,索性新建了一个项目。
    在这里插入图片描述
    如果没有DB部分,则只引入web就好,后面两个是db部分,当然我看资料还有其他的方式连接db,我这里使用了jdbc的方式。
    在这里插入图片描述
    点击Finish,项目就是建好了。

    修改端口号

    在application.properties中加入:server.port=8080

    逻辑处理

    controller类做参数处理(坑一见下)

    在这里插入图片描述

    @RestController
    public class APIController {
        @RequestMapping("/test")
        public String Test(){
            return "hello seven";
        }
    
        /**
         * url中包含param的方式
         * @param tmp
         * @return
         */
        @RequestMapping(value = "/posttest",produces = {"applicaiton/json;charset=utf-8"},method = RequestMethod.POST)
        public String PostTest(String tmp){
            System.out.println("tmp =" + tmp);
            return "success";
        }
    
    	/**
         * form-data中param的方式
         * @param name
         * @param age
         * @return
         */
        @PostMapping("/posttestparam")
        public String PostTest(@RequestParam(name="name",required = true) String name, @RequestParam(name = "age",required = false) Integer age){
            return "name : " + name + " and age= " + age;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    以上可以处理最简单的get/post了

    实体类

    如果在处理post时,遇到对象/json时,往往要进行封装

    package com.example.apiserver;
    public class OrderUnity {
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getUserId() {
            return userId;
        }
    
        public void setUserId(String userId) {
            this.userId = userId;
        }
    
        public String getMoney() {
            return money;
        }
    
        public void setMoney(String money) {
            this.money = money;
        }
    
        public String getRes1() {
            return res1;
        }
    
        public void setRes1(String res1) {
            this.res1 = res1;
        }
    
        public String getRes2() {
            return res2;
        }
    
        public void setRes2(String res2) {
            this.res2 = res2;
        }
    
        public String getRes3() {
            return res3;
        }
    
        public void setRes3(String res3) {
            this.res3 = res3;
        }
        private String name;
        private String userId;
        private String money;
        private String res1;
        private String res2;
        private String res3;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    controller类做对象处理

     /**
         * form-data中param的方式+后台对象的方式
         * @param ou
         * @return
         */
        @PostMapping("/postobject")
        public String PostTest(OrderUnity ou){
            return "obj.name= " + ou.getName();
        }
    
     /**
         * 采用前台Json,后台对象的方式+sqk语句进行数据插入
         * @param ou
         * @return
         */
        @PostMapping("/postjson")
        public String PostJson(@RequestBody OrderUnity ou){
            System.out.println(ou.getName());
            System.out.println(ou.getUserId());
            return "obj.name= " + ou.getName();
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    坑一:

    如果在新建项目时选择了数据库相关的,但是仅在逻辑层做以上的处理,会运行不起来,因为程序会自动找数据连接的信息,找不到相关配置就报错,两种解决方法:

    一、在主方法当中,加上排除自动装载

    //在 SpringBoot 应用程序启动时,排除 jdbc 的自动装配机制即可,在程序入口文件中新增配置注解
    //否则,若不配置数据库,会报错failed to configure a DataSource: 'url' attribute is not specified
    //@SpringBootApplication(exclude= DataSourceAutoConfiguration.class)
    @SpringBootApplication
    public class ApiServerApplication {
     public static void main(String[] args) {
            SpringApplication.run(ApiServerApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、增加数据库配置,详情见下。

    数据库连接

    增加数据库的配置

    在application.properties文件当中,加入
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url= jdbc:mysql://101.33.207.96:3306/seven?serverTimezone=UTC
    spring.datasource.username =seven
    spring.datasource.password =xxxx

    坑二:

    此时,需要在本机用navicat去先测试一下数据库的连接了,我的数据库放在了一个云服务器上,通过宝塔安装完成mysql,给mysql建一个实例,配置用户名和密码。

    然后在navicat上做测试连接,发现失败,原因是云服务器防火墙要把端口打开。(宝塔的防火墙不是云服务器的防火墙,不要以为关闭宝塔就可以了,此处是个小坑)

    真正的大坑是我在宝塔里,把数据库密码复制下来之后,通过navicat打开没问题,但放在配置文件里时,居然报了一个access denied的错误,紧接着给了一个 seven@某ip 的报错,但是那个某ip不是我在配置文件当中指定的ip,这个错误让我非常不理解,不知道是不是哪里网关出了问题。检查到最后,发现是我太大意了,我在宝塔里直接用了数据库密码的复制按钮,但到了配置文件上时,居然意外多了个字符,直到我在宝塔里把密码显示出明文对比,才发现这个问题,这事耽误了好久时间,还被提示带跑了思路。

    使用数据

    1. 在controller类中,加入预置类
    @RestController
    public class APIController {
    
        //虽然报错,但是不影响执行,是idea的问题
        //更新了idea版本之后,在使用autowired注解都爆了错,不影响使用
        @Autowired
        JdbcTemplate jdbcTemplate;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 控制器中使用
    //通过sql语句进行数据插入,注意字段左右的符号
            String sql = "INSERT INTO SpringBootServer(`name`) VALUE (?)";
            jdbcTemplate.update(sql,new Object[]{ou.getName()});
    
    • 1
    • 2
    • 3

    关于打包

    项目开发完毕后会将前后端应用打包,然后部署到服务器上运行。Java Web应用在Spring Boot之前,通常是打包成war包,结合Tomcat来完成部署。而对于SpringBoot,官方的建议是将Spring Boot应用打包成一个fat jar(SpringBoot默认打包方式),即项目的依赖jar包也会被包含在Spring Boot项目的jar包当中,这个fat jar会把Tomcat内置进来,所以部署时也不需要单独配置Tomcat。这样部署一个SpringBoot应用就非常简单,无需预装任何服务器,只需要上传jar包即可。

    看了上文,知道原来打包也不用war了,好吧,jar就jar吧,我直接用ide来做了。

    在这里插入图片描述

    在这里插入图片描述
    如下4步
    在这里插入图片描述
    在这里插入图片描述
    他会自动找到主方法,然后点击ok,再ok

    最后一步:点开右侧maven,双击clean,双击package
    在这里插入图片描述

    在target中就有了最终的jar在这里插入图片描述

    关于部署

    1. 宝塔上不能下载jdk,所以就用动吧。
      核心命令:yum install -y java-1.8.0-openjdk
      具体可以看:https://blog.csdn.net/weixin_45853881/article/details/123402891

    2. 进入命令行,然后来一个终极的

     java -jar APIServer-0.0.1-SNAPSHOT.jar 
    
    • 1

    即可看到正常运行了,在指定端口启动了。

    然后我上了宝塔看了一下,这个jar没有被解压,所以源码没法改,所以。。。。。上传之前要把数据库ip改好。

    当然,这时访问很有可能出现502,然后发现还是防火墙没有把8080打开,打开就可以使用了。

    不过我发现他还报了错,但不是我自动发的请求导致的,莫非上来就被攻击了?

    是啥错我先不处理了,这个程序也很有可能用不上,就是满足一下我的好奇心就好了。后面如果用的话再处理也来得及,或者读者知道的话,把处理方式同步一下。

    在这里插入图片描述

    最后感谢前人写的一些笔记,帮我快速实现了乞丐版本。

  • 相关阅读:
    Sql-拉链法
    OSPF基础
    关于电脑一天24小时多少度电电脑的一天用电量计算
    http状态,cookie、session、token的对比
    解决Invalid bound statement (not found)错误~
    Java基础17~26总结
    5-RabbitMQ工作模式-Publish/Subscribe发布与订阅模式
    2001-2022年上市公司供应链研究数据大全
    Adobe Premiere Pro 引入AI提升对话音质;Stable Diffusion:AI图像生成简介
    mybatis踩坑
  • 原文地址:https://blog.csdn.net/angus_17/article/details/126304238