Formio, lightweight knihovna pro snadnou tvorbu formulářů

Formuláře představují důležitou součást frontendů. Přes formuláře uživatelé vaši společnost kontaktují, svěřují jí důležitá data, uzavírají obchody, anebo také ne, pokud narazí na neintuitivní formulář, který jim hází klacky pod nohy nebo po nich požaduje zbytečně mnoho. Formuláře jsou vstupními branami do aplikací, které je také potřeba střežit proti možným útokům.

Problematika formulářů je komplexnější, než se na první pohled může zdát. Je třeba mít na paměti celou řadu best practices. Úkoly spojené s tvorbou formulářů je vhodné automatizovat a co nejvíce zjednodušit, namísto neustálého zápolení s opakujícími se problémy (např. ošetřováním uživatelských vstupů), které může často vést k zavlečení nechtěných chyb.

Formio API

Formio, lightweight knihovna pro zpracování formulářů v Javě, si klade za cíl, co nejvíce usnadnit tvorbu formulářů, a to pomocí API, které je snadno použitelné, konfigurovatelné a minimalizuje prostor pro případné chyby.

Knihovna je inspirována především tvorbou formulářů v Play! frameworku: Definice formuláře je immutable objektem, který lze "funkcionálním způsobem" snadno převést na formulář předvyplněný výchozími daty, nebo na formulář naplněný zvalidovanými daty z requestu.

Definice formuláře:

// Volitelne lze pouzit i introspekci vlastnosti pro 
// automaticke vytvoreni vsech formularovych poli:
private static final FormMapping<Person> personForm =
  Forms.automatic(Person.class, "person").build();

Formulářová pole je možné nadefinovat i manuálně jejich výčtem a specifikací jejich vlastností, nejen takto automaticky. Nebo lze oba přístupy kombinovat.

Předvyplnění formuláře daty:

FormData<Person> formData = new FormData<Person>(
  person, ValidationResult.empty);
FormMapping<Person> filledForm = personForm.fill(formData);
// predani naplneneho formulare do sablony, 
// pouziti vlastnosti formulare, ...

Naplnění formuláře daty z requestu (z odeslaného formuláře):

FormData<Person> formData = personForm.bind(
  new ServletRequestParams(request));
if (formData.isValid()) {
  // ulozeni osoby: formData.getData()
} else {
  // znovuzobrazeni formulare s chybovymi hlaskami: 
  // personForm.fill(formData) ...
}    

Dostupné v Maven Central

Jedná se o samostatnou open-source Java knihovnu, se zdrojovými kódy na GitHubu a artefakty dostupnými v Maven Central repozitáři. Knihovna je navržená tak, aby měla minimální počet závislostí (Apache Commons FileUpload, implementace bean validation API), a byla tak použitelná prakticky kdekoliv.

(Ne)jen servlety

Formio lze používat v servletovém prostředí (pro zpracování HttpServletRequestu), nebo i mimo servlety (zde je potřeba specificky implementovat rozhraní pro předzpracování vstupních parametrů). Knihovna tak může být snadno použita například i ve Swing aplikaci.

Výkonný data binding

Formio podporuje automatický obousměrný data binding: Automatické napojování dat z objektu do formuláře a zpět z requestu do objektu. Oproti Springu si nativně poradí s immutable objekty (vytvářenými pomocí konstruktoru s parametry, nebo pomocí statické factory metody). Data binding podporuje libovolně vnořené komplexní datové typy a také kolekce nebo pole primitivních nebo komplexních datových typů. Mohou být vytvářeny nové instance nebo použity vaše vlastní instance, které chcete naplnit daty z formuláře.

Reprezentace formuláře

Použití jednoduché definice formuláře, kterou jde snadno přeměnit na formulář naplněný daty, vám dává do ruky abstrakci formuláře, která obsahuje všechny informace potřebné pro to, abyste mohli formulář vyrenderovat ve vašem oblíbeném šablonovacím systému. Reprezentace formuláře obsahuje i automaticky odvozené názvy formulářových polí, případné specifikované typy polí (textarea, checkbox, ...), validovaná omezení vč. příznaků povinnosti a validační hlášky. Renderování formulářových polí podle takové definice se stává rutinní činností a jde snadno zautomatizovat pomocí helperů (tagů nebo jiných znovupoužitelných částí šablon/komponent UI).

Self-contained definici formuláře můžete použít i jako základ pro vaše specifické potřeby automatizování tvorby formulářů. To je rozdíl např. oproti Springu, kde podobnou objektovou reprezentaci formuláře dostupnou v jediném objektu nemáte.

Další užitečné featury

Knihovna vám dále nabídne především:

  • Podporu pro snadné zpracování uploadu souborů, kolekcí souborů (vč. parametrizace a validování max. velikosti requestu, max. velikosti jednoho souboru).
  • Validování editovaných objektů pomocí bean validation API.
  • Customizovatelné umístění message bundlu s překlady validačních hlášek. Při výchozím nastavení se hledá soubor odpovídající editované třídě s fallbackem na globální ValidationMessages.properties.
  • Možnost přidání vlastních konvertorů řetězců na vlastní datové typy a zpět (Formatterů).
  • Ochranu proti CSRF útokům (pomocí autorizačních tokenů), pokud ji chcete nechat na knihovně.
  • Automatické rozpoznání povinných polí z constraint anotací.
  • Tři stupně severity validačních hlášek a vlastní validátory.
  • Volnost ve skládání definice formuláře ze znovupoužitelných mapování.
  • Konfigurovatelnost implementací všech důležitých rozhraní a parametrů.

Pokud vás knihovna zaujala, nebo vám v ní naopak něco chybí, budu rád, když se  o své názory podělíte v komentářích. Vaše požadavky rád uvítám také ve formě issues na GitHubu. Pokud se chcete dozvědět více, na stránkách http://www.formio.net naleznete Get Started tutoriál, dokumentaci a live demo, které má zdrojové kódy rovněž na GitHubu.

Článek obsahuje 0 komentářů