minum
v8.0.5
当您需要最少的活动部件时
最简单的小程序(请参见下面的更多代码示例):
public class Main {
public static void main ( String [] args ) {
var minum = FullSystem . initialize ();
var wf = minum . getWebFramework ();
wf . registerPath ( GET , "" ,
r -> Response . htmlOk ( "<p>Hi there world!</p>" ));
minum . block ();
}
}该网络框架“ Minum”为Web应用程序提供了全功率的极简主义基础。对于TDD,由TDD。
make test_coverage )make mutation_test )Minum是五千行代码 - “极简主义”竞争对手在占其依赖性时从40万到700,000行不等。我还没有找到类似的项目。
采用极简主义方法可以更轻松地调试,可维护性和降低总成本。大多数框架以更高的总体成本交易速度。如果您需要可持续的质量,则必须从一开始就经过良好的测试和记录。例如,这个项目的实现如此高的测试覆盖范围的能力是极简主义范式实现的。
有一个快速的开始,或者如果您有更多时间,请考虑尝试本教程
< dependency >
< groupId >com.renomad</ groupId >
< artifactId >minum</ artifactId >
< version >8.0.5</ version >
</ dependency >编译尺寸:200千元。
生产代码线(包括所需的依赖项)
| 很小 | Javalin | 春季引导 |
|---|---|---|
| 5,335 | 141,048 | 1,085,405 |
请参阅详细信息
请参阅框架性能比较
有关使用此框架的示例项目,请参见以下链接。
最小的可能
该项目可以看到可以制定的最小可能的应用程序很有价值。这可能是在新项目中使用Minum的好起点。
例子
这是一个很好的例子,可以看到具有各种功能的基本项目。它显示了微小框架的许多典型用例。
纪念项目
这是一个家庭树项目。它证明了该框架旨在培养的方法。
实例化新数据库:
var db = new Db <>( foosDirectory , context , new Foo ());将新对象添加到数据库中:
var foo = new Foo ( 0L , 42 , "blue" );
db . write ( foo ); 在数据库中更新对象:
foo . setColor ( "orange" );
db . write ( foo ); 从数据库中删除:
db . delete ( foo ); 编写日志语句:
logger . logDebug (() -> "hello" );解析HTML文档:
List < HtmlParseNode > results = new HtmlParser (). parse ( "<p></p>" );在解析图中搜索元素:
HtmlParseNode node ;
List < HtmlParseNode > results = node . search ( TagName . P , Map . of ());创建一个新的Web处理程序(可以处理HTTP请求并返回响应的函数):
public Response myHandler ( Request r ) {
return Response . htmlOk ( "<p>Hi world!</p>" );
}注册该端点:
webFramework . registerPath ( GET , "formentry" , sd :: formEntry );构建和渲染模板:
TemplateProcessor foo = TemplateProcessor . buildProcessor ( "hello {{ name }}" );
String rendered = foo . renderTemplate ( Map . of ( "name" , "world" ));从请求获取查询参数:
String id = r . requestLine (). queryString (). get ( "id" );从请求中获取身体参数,作为字符串:
String personId = request . body (). asString ( "person_id" );从请求获取路径参数作为字符串:
Pattern requestRegex = Pattern . compile ( ".well-known/acme-challenge/(?<challengeValue>.*$)" );
final var challengeMatcher = requestRegex . matcher ( request . requestLine (). getPathDetails (). isolatedPath ());
// When the find command is run, it changes state so we can search by matching group
if (! challengeMatcher . find ()) {
return new Response ( StatusLine . StatusCode . CODE_400_BAD_REQUEST );
}
String tokenFileName = challengeMatcher . group ( "challengeValue" );从请求获取身体参数,作为字节数组:
byte [] photoBytes = body . asBytes ( "image_uploads" );在测试过程中检查日志消息:
assertTrue ( logger . doesMessageExist ( "Bad path requested at readFile: ../testingreadfile.txt" ));