meethigher-基于Netty的轻量级Web框架Jooby

  • Post author:
  • Post category:其他


Spring-Web的好处是,快速上手、快速成型,且成熟稳定无Bug。

但对于个人而言,这套框架太重了。由此探寻更好的轻量Web框架Jooby!

本文源码地址

meethigher/jooby-example: 基于Netty的轻量级Web框架Jooby使用示例



一、搭建项目

创建原生maven空项目,引入依赖

<dependency>
    <groupId>io.jooby</groupId>
    <artifactId>jooby-netty</artifactId>
    <version>2.16.1</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.12</version>
</dependency>

创建启动类

import io.jooby.Jooby;

public class Application extends Jooby {

    //构造函数快
    {
        get("/", ctx -> "Hello World");
    }

    public static void main(String[] args) {
        runApp(args, Application.class);
    }
}



二、配置文件

Jooby同样支持解析多种类型的配置文件,只记录常用的application.conf

Jooby读取配置文件优先级顺序

  1. 优先应用根目录下。即

    System.getProperty("user.dir")
  2. 其次类路径下,即resources下或者jar包内的。

resources添加application.conf

server.port = 8080
app.name = "内部"
database.url = "jdbc:mysql://localhost:3306/mydb"

示例接口

import io.jooby.Jooby;
import io.jooby.MediaType;

import java.nio.charset.StandardCharsets;

public class Application extends Jooby {

    //构造函数快
    {
        // use Decorator.
        decorator(next -> ctx -> {
            // get response content-type.
            final MediaType responseType = ctx.getResponseType();
            // if content-type is text-specific
            if(responseType.isTextual())
                // override response type with current media type and always use UTF-8 charset!
                ctx.setResponseType(responseType, StandardCharsets.UTF_8);
            // pipe next response procedure.
            return next.apply(ctx);
        });
        get("/", ctx -> {

            String appName = getConfig().getString("app.name");
            return "Welcome to " + appName;
        });

        get("/database", ctx -> {
            String dbUrl = getConfig().getString("database.url");
            return "Database URL: " + dbUrl;
        });
    }

    public static void main(String[] args) {
        runApp(args, Application.class);
    }
}



三、开发接口



3.1 Script API-仅支持简单路由

Script API 通常用于编写小型的、单一用途的路由处理器。

支持占位符路由规则,但是像拼参形式的就不支持。

import static io.jooby.Jooby.runApp;

public class ScriptAPIApplication {

    public static void main(String[] args) {
        //consumer函数式接口简写
        runApp(args, app -> {
            app.get("/param/{id}", ctx -> {
                String id = ctx.path("id").value();
                return id;
            });
            app.post("/param/{id}", ctx -> {
                return ctx.path("id").value();
            });
        });
    }
}



3.2 MVC API-支持复杂路由

添加依赖

<!-- MVC API 核心模块 -->
<dependency>
    <groupId>io.jooby</groupId>
    <artifactId>jooby-apt</artifactId>
    <version>2.16.1</version>
</dependency>
<!-- json模块 -->
<dependency>
    <groupId>io.jooby</groupId>
    <artifactId>jooby-gson</artifactId>
    <version>2.16.1</version>
</dependency>

创建controller

import io.jooby.MediaType;
import io.jooby.Multipart;
import io.jooby.annotations.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

@Path("/mvc")
public class Controller {

    @GET("/get")
    public String get() {
        return "Hello World";
    }

    @GET("/pathParam/{id}")
    public String pathParam(@PathParam String id) {
        return id;
    }

    @GET("/queryParam")
    public String queryParam(@QueryParam String id, @QueryParam String name) {
        return name + "--->" + id;
    }

    /**
     * form表单,支持两种形式
     * application/x-www-form-urlencoded,不支持文件
     * multipart/form-data,支持文件
     */
    @POST("/formParam")
    public String formParam(@FormParam String name, @FormParam String age, @FormParam Multipart file) {
        if (file != null) {
            try (InputStream is = file.file("file").stream(); FileOutputStream fos = new FileOutputStream("test.txt")) {
                int b;
                while ((b = is.read()) != -1) {
                    fos.write(b);
                }
                fos.flush();
            } catch (IOException e) {
            }
        }
        return name + "--->" + age;
    }


    @POST("/bodyParam")
    @Consumes(MediaType.JSON)//可省略
    @Produces(MediaType.JSON)//可省略
    public Object bodyParam(Object body) {
        return body;
    }

    @POST("/pageQuery")
    public String pageQuery(PageRequest req) {
        return req.toString();
    }
}

class PageRequest {
    private Integer pageIndex;
    private Integer pageSize;

    public Integer getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(Integer pageIndex) {
        this.pageIndex = pageIndex;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
}

注册controller

import io.jooby.json.GsonModule;
import top.meethigher.mvc.controller.Controller;

import static io.jooby.Jooby.runApp;

public class MVCApplication {
    public static void main(String[] args) {
        runApp(args, app -> {
            // 设置 JSON 支持
            app.install(new GsonModule());
            //注册控制器
            app.mvc(new Controller());
        });
    }
}



四、参考致谢


jooby:做更多! 更容易!


// 设置 JSON 支持

app.install(new GsonModule());

//注册控制器

app.mvc(new Controller());

});

}

}


[外链图片转存中...(img-mFU1u5le-1687016527518)]

# 四、参考致谢

[jooby:做更多! 更容易!](https://jooby.io/#introduction)



版权声明:本文为qq_30460361原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。