Когда вам нужно наименьшее движущееся части
Самая простая программа Minum (см. Больше образцов кода ниже):
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», предоставляет минималистскую основу для веб-приложения для веб-приложения. Для TDD, TDD.
make test_coverage )make mutation_test )Минум - пять тысяч строк кода - «минималистские» конкуренты варьируются от 400 000 до 700 000 строк при учете их зависимостей. Я не нашел подобный проект.
Применение минималистского подхода позволяет легче отладки, обслуживаемости и снижению общей стоимости. Большинство структур торгуют более быстрым запусками за более высокую общую стоимость. Если вам нужно устойчивое качество, программное обеспечение должно быть хорошо проверено и задокументировано с самого начала. Например, способность этого проекта достигать такого высокого тестового покрытия была значительно обеспечена парадигмой минимализма.
Есть быстрое начало, или если у вас есть немного больше времени, подумайте о том, чтобы попробовать учебник
< dependency >
< groupId >com.renomad</ groupId >
< artifactId >minum</ artifactId >
< version >8.0.5</ version >
</ dependency >Скомпилированный размер: 200 килобитов.
Линии производственного кода (включая необходимые зависимости)
| Мирум | Джавалин | Весенний ботинок |
|---|---|---|
| 5335 | 141,048 | 1 085 405 |
Смотрите детали
См. Сравнение производительности фреймворта
См. Следующие ссылки для образцов проектов, которые используют эту структуру.
Самый маленький
Этот проект полезен для того, чтобы увидеть минимально способное приложение, которое можно сделать. Это может быть хорошей отправной точкой для использования Minum в новом проекте.
Пример
Это хороший пример, чтобы увидеть базовый проект с различной функциональностью. Он показывает многие из типичных случаев использования структуры рубки.
Memoria Project
Это семейный проект. Это демонстрирует, какой подход эта структура предназначена для развития.
Создание новой базы данных:
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 ());Создание нового веб -обработчика (функция, которая обрабатывает 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" ));