Cuando necesite la menor cantidad de partes móviles
El programa minum más simple (ver más muestras de código a continuación):
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 ();
}
}Este marco web, "minum", proporciona una base minimalista de potencia completa para una aplicación web. Para TDD, por TDD.
make test_coverage )make mutation_test )Minum es cinco mil líneas de código: los competidores "minimalistas" varían de 400,000 a 700,000 líneas al tener en cuenta sus dependencias. No he encontrado un proyecto similar.
La aplicación de un enfoque minimalista permite una depuración más fácil, mantenimiento y un menor costo general. La mayoría de los marcos comercian más rápido por un costo total más alto. Si necesita una calidad sostenible, el software debe ser bien probado y documentado desde el inicio. Como ejemplo, la capacidad de este proyecto para lograr una cobertura de prueba tan alta fue muy habilitada por el paradigma del minimalismo.
Hay un comienzo rápido, o si tiene un poco más de tiempo, considere probar el tutorial
< dependency >
< groupId >com.renomad</ groupId >
< artifactId >minum</ artifactId >
< version >8.0.5</ version >
</ dependency >Tamaño compilado: 200 kilobytes.
Líneas de código de producción (incluidas las dependencias requeridas)
| Mínimo | Javalín | Arranque de primavera |
|---|---|---|
| 5.335 | 141,048 | 1.085.405 |
Ver detalles
Ver Comparación de rendimiento del marco
Consulte los siguientes enlaces para proyectos de muestra que usen este marco.
Más pequeño-posible
Este proyecto es valioso para ver la aplicación mínima posible que se puede hacer. Este podría ser un buen punto de partida para el uso de Minum en un nuevo proyecto.
Ejemplo
Este es un buen ejemplo para ver un proyecto básico con diversas funcionalidades. Muestra muchos de los casos de uso típicos del marco Minum.
Proyecto Memoria
Este es un proyecto de árbol familiar. Demuestra el tipo de enfoque que este marco está destinado a fomentar.
Instanciación de una nueva base de datos:
var db = new Db <>( foosDirectory , context , new Foo ());Agregar un nuevo objeto a una base de datos:
var foo = new Foo ( 0L , 42 , "blue" );
db . write ( foo ); Actualización de un objeto en una base de datos:
foo . setColor ( "orange" );
db . write ( foo ); Eliminar de una base de datos:
db . delete ( foo ); Escribir una declaración de registro:
logger . logDebug (() -> "hello" );Analizar un documento HTML:
List < HtmlParseNode > results = new HtmlParser (). parse ( "<p></p>" );Buscando un elemento en el gráfico analizado:
HtmlParseNode node ;
List < HtmlParseNode > results = node . search ( TagName . P , Map . of ());Creación de un nuevo manejador web (una función que maneja una solicitud HTTP y devuelve una respuesta):
public Response myHandler ( Request r ) {
return Response . htmlOk ( "<p>Hi world!</p>" );
}Registrando ese punto final:
webFramework . registerPath ( GET , "formentry" , sd :: formEntry );Construir y presentar una plantilla:
TemplateProcessor foo = TemplateProcessor . buildProcessor ( "hello {{ name }}" );
String rendered = foo . renderTemplate ( Map . of ( "name" , "world" ));Obtener un parámetro de consulta de una solicitud:
String id = r . requestLine (). queryString (). get ( "id" );Obtener un parámetro corporal de una solicitud, como una cadena:
String personId = request . body (). asString ( "person_id" );Obtenga un parámetro de ruta de una solicitud como una cadena:
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" );Obtener un parámetro corporal de una solicitud, como una matriz de bytes:
byte [] photoBytes = body . asBytes ( "image_uploads" );Verificar un mensaje de registro durante las pruebas:
assertTrue ( logger . doesMessageExist ( "Bad path requested at readFile: ../testingreadfile.txt" ));