最も少ない可動部品が必要な場合
最もシンプルなミナムプログラム(以下のコードサンプルを参照):
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 ();
}
}このWebフレームワーク「Minum」は、Webアプリケーションのためのフルパワーのミニマリストの基礎を提供します。 TDDの場合、TDD。
make test_coverage )make mutation_test )ミナムは5000行のコードです - 「ミニマリスト」の競合他社は、依存関係を考慮すると40万から700,000行の範囲です。同様のプロジェクトは見つかりませんでした。
ミニマリストのアプローチを適用することで、デバッグ、保守性、全体的なコストを削減できます。ほとんどのフレームワークは、より高い総合コストのためにより速いスタートアップを取引します。持続可能な品質が必要な場合は、ソフトウェアを適切にテストし、最初から文書化する必要があります。例として、このプロジェクトがこのような高いテストカバレッジを達成する能力は、ミニマリズムのパラダイムによって大幅に可能になりました。
クイックスタートがあります、またはもう少し時間がある場合は、チュートリアルを試すことを検討してください
< dependency >
< groupId >com.renomad</ groupId >
< artifactId >minum</ artifactId >
< version >8.0.5</ version >
</ dependency >コンパイルされたサイズ:200キロバイト。
生産コードの行(必要な依存関係を含む)
| ミナム | ジャバリン | スプリングブート |
|---|---|---|
| 5,335 | 141,048 | 1,085,405 |
詳細を参照してください
フレームワークのパフォーマンス比較を参照してください
このフレームワークを使用するサンプルプロジェクトについては、次のリンクを参照してください。
最小のもの
このプロジェクトは、作成できる最小限のアプリケーションを確認するのに役立ちます。これは、新しいプロジェクトでミナムを使用するための良い出発点かもしれません。
例
これは、さまざまな機能を備えた基本プロジェクトを見るための良い例です。ミナムフレームワークの典型的なユースケースの多くを示しています。
Memoriaプロジェクト
これは家族の木プロジェクトです。これは、このフレームワークが育成することを目的とした種類のアプローチを示しています。
新しいデータベースのインスタンス化:
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" ));