Quando você precisa da menor parte móvel
O programa minum mais simples (veja mais amostras de código abaixo):
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 ();
}
}Essa estrutura da web, "Minum", fornece uma base minimalista de potência completa para um aplicativo da web. Para TDD, por TDD.
make test_coverage )make mutation_test )Minum são cinco mil linhas de código - os concorrentes "minimalistas" variam de 400.000 a 700.000 linhas ao considerar suas dependências. Eu não encontrei um projeto semelhante.
A aplicação de uma abordagem minimalista permite depuração mais fácil, manutenção e menor custo geral. A maioria das estruturas negocia mais rápido inicial por um custo geral mais alto. Se você precisar de qualidade sustentável, o software deve ser bem testado e documentado desde o início. Como exemplo, a capacidade deste projeto de atingir uma cobertura de teste tão alta foi bastante ativada pelo paradigma do minimalismo.
Há um começo rápido, ou se você tiver um pouco mais de tempo, considere tentar o tutorial
< dependency >
< groupId >com.renomad</ groupId >
< artifactId >minum</ artifactId >
< version >8.0.5</ version >
</ dependency >Tamanho compilado: 200 kilobytes.
Linhas de código de produção (incluindo dependências necessárias)
| Minum | Javalin | Botagem da primavera |
|---|---|---|
| 5.335 | 141.048 | 1.085.405 |
Veja detalhes
Veja a comparação de desempenho da estrutura
Consulte os links a seguir para projetos de amostra que usam essa estrutura.
Menor possível
Este projeto é valioso para ver o aplicativo mínimo possível que pode ser feito. Este pode ser um bom ponto de partida para o uso do minum em um novo projeto.
Exemplo
Este é um bom exemplo para ver um projeto básico com várias funcionalidades. Ele mostra muitos dos casos de uso típicos da estrutura minum.
Projeto Memoria
Este é um projeto de árvore familiar. Ele demonstra o tipo de abordagem que essa estrutura deve promover.
Instanciando um novo banco de dados:
var db = new Db <>( foosDirectory , context , new Foo ());Adicionando um novo objeto a um banco de dados:
var foo = new Foo ( 0L , 42 , "blue" );
db . write ( foo ); Atualizando um objeto em um banco de dados:
foo . setColor ( "orange" );
db . write ( foo ); Excluindo de um banco de dados:
db . delete ( foo ); Escrevendo uma declaração de log:
logger . logDebug (() -> "hello" );Analisando um documento HTML:
List < HtmlParseNode > results = new HtmlParser (). parse ( "<p></p>" );Procurando um elemento no gráfico analisado:
HtmlParseNode node ;
List < HtmlParseNode > results = node . search ( TagName . P , Map . of ());Criando um novo manipulador da web (uma função que lida com uma solicitação HTTP e retorna uma resposta):
public Response myHandler ( Request r ) {
return Response . htmlOk ( "<p>Hi world!</p>" );
}Registrando esse terminal:
webFramework . registerPath ( GET , "formentry" , sd :: formEntry );Construindo e renderizando um modelo:
TemplateProcessor foo = TemplateProcessor . buildProcessor ( "hello {{ name }}" );
String rendered = foo . renderTemplate ( Map . of ( "name" , "world" ));Obtendo um parâmetro de consulta de uma solicitação:
String id = r . requestLine (). queryString (). get ( "id" );Obtendo um parâmetro corporal de uma solicitação, como uma string:
String personId = request . body (). asString ( "person_id" );Obtenha um parâmetro de caminho de uma solicitação como uma string:
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" );Obtendo um parâmetro corporal de uma solicitação, como uma matriz de bytes:
byte [] photoBytes = body . asBytes ( "image_uploads" );Verificando uma mensagem de log durante os testes:
assertTrue ( logger . doesMessageExist ( "Bad path requested at readFile: ../testingreadfile.txt" ));