Il s'agit d'un framework Micro Web open source (Licence Apache) en Java, avec des dépendances minimales et une courbe d'apprentissage rapide.
L'objectif de ce projet est de créer un micro-framework Web en Java qui devrait être facile à utiliser et à pirater.
La taille de pippo-core n'est que de 140 Ko et la taille de pippo-controller (en option) n'est que de 45 Ko .
Nous devons d'abord créer une application et ajouter des itinéraires:
public class BasicApplication extends Application {
@ Override
protected void onInit () {
// send 'Hello World' as response
GET ( "/" , routeContext -> routeContext . send ( "Hello World" ));
// send a file as response
GET ( "/file" , routeContext -> routeContext . send ( new File ( "pom.xml" )));
// send a json as response
GET ( "/json" , routeContext -> {
Contact contact = createContact ();
routeContext . json (). send ( contact );
});
// send xml as response
GET ( "/xml" , routeContext -> {
Contact contact = createContact ();
routeContext . xml (). send ( contact );
});
// send an object and negotiate the Response content-type, default to XML
GET ( "/negotiate" , routeContext -> {
Contact contact = createContact ();
routeContext . xml (). negotiateContentType (). send ( contact );
});
// send a template with name "hello" as response
GET ( "/template" , routeContext -> {
routeContext . setLocal ( "greeting" , "Hello" );
routeContext . render ( "hello" );
});
}
private Contact createContact () {
return new Contact ()
. setId ( 12345 )
. setName ( "John" )
. setPhone ( "0733434435" )
. setAddress ( "Sunflower Street, No. 6" );
}
} où Contact est un simple pojo:
public class Contact {
private int id ;
private String name ;
private String phone ;
private String address ;
// getters and setters
} La deuxième étape consiste à choisir votre serveur, le moteur de modèle préféré et le moteur de type de contenu.
Par exemple, je choisirai Jetty comme serveur, Freemarker en tant que moteur de modèle, Jackson en tant que moteur JSON et JAXB en tant que moteur XML.
Mon maven pom.xml ressemble:
< dependency >
< groupId >ro.pippo</ groupId >
< artifactId >pippo-core</ artifactId >
< version >${pippo.version}</ version >
</ dependency >
< dependency >
< groupId >ro.pippo</ groupId >
< artifactId >pippo-jetty</ artifactId >
< version >${pippo.version}</ version >
</ dependency >
< dependency >
< groupId >ro.pippo</ groupId >
< artifactId >pippo-freemarker</ artifactId >
< version >${pippo.version}</ version >
</ dependency >
< dependency >
< groupId >ro.pippo</ groupId >
< artifactId >pippo-jackson</ artifactId >
< version >${pippo.version}</ version >
</ dependency >La dernière étape est de démarrer Pippo avec votre application comme paramètre:
public class BasicDemo {
public static void main ( String [] args ) {
Pippo pippo = new Pippo ( new BasicApplication ());
pippo . start ();
}
} Pippo lance le serveur Web intégré (trouvé dans votre ClassPath) et rend l'application disponible sur le port 8338 (valeur par défaut). Ouvrez votre navigateur Internet et vérifiez les itinéraires déclarés dans l'application:
http://localhost:8338http://localhost:8338/filehttp://localhost:8338/jsonhttp://localhost:8338/xmlhttp://localhost:8338/negotiatehttp://localhost:8338/templateDéfinir le (s) contrôleur (s):
@ Path ( "/contacts" )
@ Logging
public class ContactsController extends Controller {
private ContactService contactService ;
public ContactsController () {
contactService = new InMemoryContactService ();
}
@ GET
@ Named ( "index" )
// @Produces(Produces.HTML)
@ Metered
@ Logging
public void index () {
// inject "user" attribute in session
getRouteContext (). setSession ( "user" , "decebal" );
// send a template with name "contacts" as response
getResponse ()
. bind ( "contacts" , contactService . getContacts ())
. render ( "contacts" );
}
@ GET ( "/uriFor/{id: [0-9]+}" )
@ Named ( "uriFor" )
@ Produces ( Produces . TEXT )
@ Timed
public String uriFor ( @ Param int id , @ Header String host , @ Session String user ) {
System . out . println ( "id = " + id );
System . out . println ( "host = " + host );
System . out . println ( "user = " + user );
Map < String , Object > parameters = new HashMap <>();
parameters . put ( "id" , id );
String uri = getApplication (). getRouter (). uriFor ( "api.get" , parameters );
return "id = " + id + "; uri = " + uri ;
}
@ GET ( "/api" )
@ Named ( "api.getAll" )
@ Produces ( Produces . JSON )
@ NoCache
public List < Contact > getAll () {
return contactService . getContacts ();
}
@ GET ( "/api/{id: [0-9]+}" )
@ Named ( "api.get" )
@ Produces ( Produces . JSON )
public Contact get ( @ Param int id ) {
return contactService . getContact ( id );
}
} @ Path ( "/files" )
public class FilesController extends Controller {
@ GET
public void index () {
// send a template with name "files" as response
getRouteContext (). render ( "files" );
}
@ GET ( "/download" )
public File download () {
// send a file as response
return new File ( "pom.xml" );
}
@ POST ( "/upload" )
@ Produces ( Produces . TEXT )
public String upload ( FileItem file ) {
// send a text (the info about uploaded file) as response
// return file.toString();
return new StringBuilder ()
. append ( file . getName ()). append ( " n " )
. append ( file . getSubmittedFileName ()). append ( " n " )
. append ( file . getSize ()). append ( " n " )
. append ( file . getContentType ())
. toString ();
}
}Ajouter le (s) contrôleur (s) dans votre application:
public class BasicApplication extends ControllerApplication {
@ Override
protected void onInit () {
addControllers ( ContactsController . class ); // one instance for EACH request
// OR
addControllers ( new ContactsController ()); // one instance for ALL requests
addControllers ( FilesController . class );
}
} N'oubliez pas que le concept Controller est inclus dans le module pippo-controller , vous devez donc ajouter ce module comme dépendance dans votre projet.
La documentation est disponible sur Pippo.ro
Des applications de démonstration sont disponibles sur Pippo-Demo
Pour une application réelle construite avec Pippo, veuillez consulter la comptabilité Web - Pippo Demo