Stripes

Z FI WIKI
Přejít na: navigace, hledání


Úvod

Stripes jsou nový populární rámec pro vývoj webových aplikací. Poučil se z chyb rámce Apache Struts, kde je nutné udržovat v konzistentním stavu několik konfiguračních souborů a každá akce zpracovávající data od prohlížeče musí být v samostatné třídě.

Stripes nepotřebuje žádné konfigurační soubory, využívá anotace, zavedené v Java 5.0, a konvence (princip convention-over-configuration, zavedený v Ruby-On-Rails).

ActionBeans

Ve Struts bylo nutné pro obsluhu jednoho formuláře mít

  • form bean držící data
  • třídu odvozenou od Action s metodou execute() (akci)
  • konfigurační záznam v struts-config.xml mapující URL na třídu a mapující výsledky na zobrazení JSP
  • obvykle záznam v tiles-defs.xml pro složení JSP stránky z více komponent

Ve Stripes je všechen kód pohromadě ve třídě, která implementuje interface ActionBean, tedy může dědit z libovolné třídy. Není nutné mít konfigurační soubor pro vazbu mezi URL a třídou, protože rámec sám najde všechny třídy, které implementují ActionBean, a vazbu na URL buď vytvoří implicitně z názvu třídy (cz.neco.action.bla.MujActionBean -> /bla/Muj.action) nebo ji vezme z anotace třídy @UrlBinding.

Metoda pro zpracování HTTP požadavku se nemusí jmenovat execute(), ale jakkoliv, jen musí být public a vracet typ Resolution. Takových metod může být v jednom ActionBeanu několik. Výsledkem metody není identifikátor, který se v konfiguračním souboru musí namapovat na další akci nebo nebo zobrazení JSP, ale objekt Resolution, který přímo určuje, kam se předá řízení, a jeho konkrétní podtyp specifikuje, zda se řízení předá vnitřně (ForwardResolution) nebo přesměrováním prohlížeče (RedirectResolution).

Stripes nepotřebuje samostatnou třídu ani pro data z formuláře (form bean), používá přímo ActionBean. Tedy ActionBean ve Stripes zastává dohromady funkce Action i form Bean ze Struts.

Stejný příklad jako je použit u Struts by se tedy zapsal tímto ActionBeanem:

 
import net.sourceforge.stripes.action.*;
import java.util.List;
 
@UrlBinding("/zbozi.action")
public class ZboziNaSkladeActionBean implements ActionBean {
 
    private ActionBeanContext ctx;
    public ActionBeanContext getContext() { return ctx; }
    public void setContext(ActionBeanContext ctx) { this.ctx = ctx; }
 
    public Resolution mameZbozi() {
        if (Sklad.mameNejakeZbozi()) {
            return new ForwardResolution("/seznamzbozi.jsp");
        } else {
            return new ForwardResolution("/zadneneni.jsp");
        }
    }
 
    public List getSeznamZbozi() {
        return Sklad.getZbozi();
    }
 
}

a stránka seznamzbozi.jsp by vypadala nějak takto:

 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="s" uri="http://stripes.sourceforge.net/stripes.tld" %>
 ...
 <s:useActionBean var="zb" binding="/zbozi.action" />
 <table>
 <c:forEach var="z" items="${zb.seznamZbozi}">
   <tr>
     <td><c:out value="${z.nazev}"/></td>
     <td><c:out value="${z.mnozstvi}"/></td>
   </tr>
 </c:forEach>
 </table>

Stripes lze integrovat s různými rámci pro generování stránek, pro použití s JSP je předpřipravena knihovna značek.

Validace dat

Při obsluze formulářů je možné mnohé věci ošetřit pomocí deklarativní definice anotacemi. Např.

 
public class Zaznam {
  private String jmeno;
  private int pocet;
  public void setJmeno(String jmeno) { this.jmeno = jmeno; }
  ...
}
...
@ValidateNestedProperties(
   value = {
     @Validate(on = {"pridej","uloz"}, field = "jmeno", required = true),
     @Validate(on = {"pridej","uloz"}, field = "pocet", required = true, minvalue = 1)
     }
 )
 private Zaznam zaznam;
 public Zaznam getZaznam() { return zaznam; }
 public void setZaznam(Zaznam zaznam) { this.zaznam = zaznam; }

využívá pro převzetí dat z formuláře property typu Zaznam, která má vnořené property jmeno a pocet typů řetězec a číslo, přičemž při vyvolání metod pridej() a uloz() musí být obě zadány, druhá musí být číslo větší než 1.

Složitější kontroly je možné dát do samostatných metod, způsob zobrazování lokalizovaných chybových hlášení je obdobný jako ve Struts:

 
@ValidationMethod(on = "pridej")
 public void kontrola(ValidationErrors errors) {
    if (zaznam.getJmeno().equals("diamanty")&&zaznam.getPocet()>10) {
        errors.add("diam", new LocalizableError("klic.chyby.moc"));
    }
 }

Layout Tags

Stripes obsahuje i vylepšený nástroj pro skládání stránek, ekvivalentní Struts Tiles.

Není třeba mít samostatný konfigurační soubor jako tiles-defs.xml. Stačí vytvořit JSP stránku se šablonou stránky, např:

 
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld" %>
 
<stripes:layout-definition>
 <html>
 <head>
   <title><f:message key="${klicTitulkuStranky}"/></title>
   <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/default.css"/>
 </head>
 <body>
  ... menu atd. ...
  <stripes:layout-component name="contents"/>
 </body>
</html>

a v JSP stránkách se lze na tuto šablonu odkazovat:

 
<%@ taglib prefix="s" uri="http://stripes.sourceforge.net/stripes.tld" %>
<s:layout-render name="/layout.jsp" klicTitulkuStranky="seznam">
  <s:layout-component name="contents">
      ... obsah stránky ...
  </s:layout-component>
</s:layout-render>

Všechny atributy tagu s:layout-render jsou předány šabloně jako atributy, která je může využít.

Typovaný přístup k atributům Session a ServletContext

ActionBeans jsou odstíněny od tříd Servlet API tím, že dostávají intanci třídy ActionBeanContext, přes kterou jsou přístupné objekty jako HttpServletRequest, HttpSession nebo ServletContext. To je výhodné pro testování.

Dá se to využít i k typovanému přístupu k atributům HttpSession a ServletContextu. Lze si vytvořit vlastního potomka třídy ActionBeanContext, který může mít metodu např:

 
public class MujBeanContext extends ActionBeanContext {
    @SuppressWarnings({"unchecked"})
    public MujTyp getMujTyp() {
        return (MujTyp) getServletContext().getAttribute("muj_typ");
    }
}

a v ActionBeanech odpadne neustálé přetypovávání atributů.

Ukázka kompletní aplikace je v článku Cvičení Stripes