가장 적은 움직이는 부품이 필요할 때
가장 간단한 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 )Minum은 5,000 줄의 코드입니다. "미니멀리스트"경쟁자는 종속성을 설명 할 때 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 |
세부 사항을 참조하십시오
프레임 워크 성능 비교를 참조하십시오
이 프레임 워크를 사용하는 샘플 프로젝트에 대한 다음 링크를 참조하십시오.
가장 작은 것
이 프로젝트는 최소한의 최소한의 응용 프로그램을 볼 수 있습니다. 이것은 새로운 프로젝트에서 Minum을 사용하기에 좋은 출발점 일 수 있습니다.
예
이것은 다양한 기능을 갖춘 기본 프로젝트를 보는 좋은 예입니다. 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 ());새 웹 핸들러 생성 (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" ));