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

news/2024/11/22 20:58:06/

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-specificif(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)

http://www.ppmy.cn/news/444358.html

相关文章

Vue中如何进行分布式日志管理与日志分析

Vue中如何进行分布式日志管理与日志分析 在现代应用程序中&#xff0c;日志是一项重要的功能&#xff0c;用于帮助开发人员和运维人员了解应用程序的行为并进行故障排除。随着应用程序的规模和复杂性的增加&#xff0c;日志管理和分析变得越来越困难。本文将介绍如何在Vue应用…

(AtCoder Beginner Contest 306)

A.直接模拟吧不解释了 import random import sys import os import math from collections import Counter, defaultdict, deque from functools import lru_cache, reduce from itertools import accumulate, combinations, permutations from heapq import nsmallest, nlarg…

C语言基础教程(动态内存分配)

文章目录 前言一、动态内存分配常用函数二、动态内存分配实战总结 前言 本篇文章来讲解C语言中的动态内存分配&#xff0c;在C语言中动态内存分配经常使用&#xff0c;合理的使用动态内存分配可以帮助我们节省代码空间&#xff0c;当然了不合理的使用可能导致程序的崩溃&#…

59、基于51单片机多机 NRF24L01 无线温湿度 DHT11报警系统设计(程序+原理图+PCB源文件+参考论文+开题报告+任务书+元器件清单等)

摘 要 温湿度在工农业生产中占有很重要的地位&#xff0c;是工农业生产的重要组成数据。温湿度过高会造成粮食发霉长芽&#xff0c;还会引起大棚蔬菜一系列的病害。因此对其适时准确的测量就显得尤为重要。而一般的测量过程较为复杂繁琐&#xff0c;误差还大。比如现在所使…

C++实验报告-1

C实验报告-1 实验题目1 【旱冰场围栏造价】有一个圆形的旱冰场地&#xff0c;围栏用帆布围成&#xff0c;每平方米造价M元&#xff0c;输入旱冰场半径和围栏高度&#xff0c;用程序计算出其造价。类的声明已给出&#xff0c;请完善成员函数的定义和主函数。 程序源代码 #inc…

电商行业线上活动方式有哪些优缺点(一)

电商行业线上活动方式有哪些优缺点&#xff08;一&#xff09; 如今电商行业发展的越来越快速&#xff0c;而且电商行业的线上活动营销方式也越来越多&#xff0c;商家们总能把握住各种节假日做营销活动。例如三月份的三八妇女节&#xff0c;传统的节假日&#xff0c;十一月份…

vgp虚拟路面_吉水县道路运输展示价格实惠

吉水县道路运输展示价格实惠 北京四度的道路运输展示&#xff0c;首先&#xff0c;我们要知道什么是数字展厅&#xff1f;其实&#xff0c;我们在生活中所听到的数字化展厅&#xff0c;以及多媒体数字化展厅都是指多媒体数字化展厅。多媒体数字化展厅主要是把多媒体和数字化的技…

seo名词术语解释网站优化名词术语

1、图解seo黑帽。什么是黑帽seo&#xff1f; 我们定义seo黑帽这个名词是一切 违背正常思路制作、宣传、推广、排名网站的行为都称为黑帽seo。 这里的seo黑帽也是作弊的概念。 黑帽seo手法侧重于搜索引擎单方面的计算特性&#xff0c;利用一个特点狠狠的用力&#xff0c;短期内达…