|
||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Apache Struts (4) - formuláře, modul ValidatorProjdeme všechny typy formulářů a ukážeme si základní použití modulu Validator, který provádí kontrolu vstupních dat od uživatelů
Formuláře typu ActionForm
Téměř každá webová aplikace potřebuje získávat vstupy od uživatelů, např. uživatelská jména a hesla, uživatelské nastavení apod. HTML pro tyto potřeby poskytuje
odpovídající prvky - textové pole, tlačítka, checkboxy a další. Struts všechen uživatelský vstup mapuje do vlastních formulářů, které
jsou vždy podtřídou
Jelikož Struts formuláře recyklují (pokud existuje stávající volná instance objektu, použije se), musí formulář definovat metodu package cz.linuxsoft.web.struts.shop.forms; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.*; import java.text.Format; import java.text.NumberFormat; public class LoginForm extends ActionForm { private String username = null; private String password = null; public void reset(ActionMapping mapping, HttpServletRequest request) { this.username = null; this.password = null; } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); if (username == null || username.length() < 1) errors.add("username", new ActionMessage("errors.required", "User name")); if (password == null || password.length() < 1) errors.add("password", new ActionMessage("errors.required", "Password")); else if (password.length() < 7) errors.add("password", new ActionMessage("errors.minlength", "Password", "6")); else { try { Format format = NumberFormat.getNumberInstance(); format.parseObject(password); } catch (Exception ex) { //heslo nelze převést na číslo errors.add("password", new ActionMessage("errors.number", "Password")); } } return errors; } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public String getUsername() { return this.username; } public String getPassword() { return this.password; } }
Třída errors.minlength={0} can not be less than {1} characters. errors.required={0} is required. errors.number={0} must be a number.
A k tomu ještě odpovídající konfigurační soubor Struts, pokud bychom ve formuláři nedefinovali metodu <form-beans> <form-bean name="loginForm" type="cz.linuxsoft.web.struts.shop.forms.LoginForm" /> </form-beans> <action-mappings> <action path="/login" type="cz.linuxsoft.web.struts.shop.actions.LoginAction" name="loginForm" scope="request" input="/pages/login.jsp" validate="true"> <forward name="success" path="/pages/welcome.jsp" /> </action> </action-mappings> Formuláře typu DynaActionForm
Přes výhody, které nám přináší definování ActionFormů, existují i značné nevýhody tohoto řešení. Především v projektu vzniká značný počet jednoduchých tříd,
které jenom kopírují DTO objekty. Dalším neduhem je, že ActionForm je svázán s HTML stránkou, jakákoliv její změna se tedy musí projevit i v
této třídě. Proto se ve Struts v1.1 objevuje nový formulář dynamického typu, a to třída <form-beans> <form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="username" type="java.lang.String" /> <form-property name="password" type="java.lang.Integer" /> </form-bean> </form-beans> Formuláře typu LazyValidatorForm
Speciálním typem formuláře, který se objevuje od Struts v1.2.6 (zatím pouze development verze), je <form-beans> <form-bean name="loginForm" type="org.apache.struts.validator.LazyValidatorForm" /> </form-beans> Modul Validator
Jak jsme si již mohli všimnout, kontrolu uživatelských vstupů můžeme provádět přímo v potomcích ActionFormu. Tato možnost má však dost nevýhod,
především dochází k silné opakovatelnosti kódu. Proto vznikl modul Validator, jenž přesouvá veškerou kontrolní logiku do speciálních xml souborů,
přičemž přichází se spoustou již vytvořených standartních pravidel kontroly a zároveň nám dává možnost vytvořit vlastní pravidla založené na regulárních
výrazech. Pokud chceme tento modul použít, musíme ho uvést do konfigurace Struts v části plugin. Následně všechny formuláře typu <form-beans> <form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm"> <form-property name="username" type="java.lang.String" /> <form-property name="password" type="java.lang.String" /> </form-bean> </form-beans> <plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /> </plug-in>
Soubor <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN" "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd"> <form-validation> <formset> <!-- jméno formuláře z konfigurace Struts --> <form name="loginForm"> <!-- člen username je vyžadován --> <field property="username" depends="required"> <!-- klíč z MessageResources --> <arg0 key="login.username"/> </field> <!-- člen password je vyžadován, musí to být číslo a mít minimální délku --> <field property="password" depends="required,integer,minlength"> <!-- klíč z MessageResources --> <arg0 key="login.password"/> <!-- minimální délka, bere se z proměnných --> <arg1 name="minlength" key="${var:minlength}" resource="false"/> <!-- definice proměnných --> <var> <!-- proměnná pro minimální délku --> <var-name>minlength</var-name> <var-value>5</var-value> </var> </field> </form> </formset> </form-validation>
Vidíme, že musíme definovat jednotlivé položky ve formuláři, přičemž pro každou položku je definován seznam pravidel parametrem depends.
Argumenty zprávy jsou předávány podobně jako u ActionFormu, my pouze definujeme argumenty, které budou předány do hodnoty klíče. Pro položku
můžeme definovat i seznam proměnných, v našem případě se jednalo o definici minimální délky řetězce. Validaci uživatelských vstupů můžeme rozdělit
na validaci dat na serveru, což je standartní postup, a na kontrolu javascriptem, což je další možnost tohoto modulu. Pro standartní serverovou
validaci není třeba nijak upravovat stávající jsp soubory, avšak při použití javascriptu je potřeba provést drobné změny. Nejprve si vytvoříme
stránku <%@ taglib uri="/tags/struts-html" prefix="html" %> <html:javascript dynamicJavascript="false" staticJavascript="true" />
Následuje upravený soubor <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <%@ page contentType="text/html" %> <%@ page pageEncoding="UTF-8" %> <%@ taglib uri="/tags/struts-bean" prefix="bean" %> <%@ taglib uri="/tags/struts-html" prefix="html" %> <%@ taglib uri="/tags/struts-logic" prefix="logic" %> <html:xhtml /> <html:html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title><bean:message key="login.title" /></title> <link rel="stylesheet" type="text/css" href="<html:rewrite page="/theme/style.css" />"> <html:javascript formName="loginForm" dynamicJavascript="true" staticJavascript="false" cdata="false"/> <script type="text/javascript" src="<html:rewrite page="/javascript/static.jsp" />"> </script> </head> <body> <h1><bean:message key="login.title" /></h1> <div class="errors"> <html:errors /> <br /><br /> </div> <html:form action="/login" method="post" onsubmit="return validateLoginForm(this);"> <table> <tr> <td><bean:message key="login.username" /></td> <td>:</td> <td><html:text property="username" value="" /></td> </tr> <tr> <td><bean:message key="login.password" /></td> <td>:</td> <td><html:password property="password" value="" /></td> </tr> </table> <p> <html:submit> <bean:message key="login.submit" /> </html:submit> </p> </html:form> </body> </html:html> PříštěTímto jsme si probrali základní typy formulářů používaných ve Struts a seznámili se s velice užitečným modulem Validator. Příště probereme jeho rozšířené možnosti včetně definice vlastních kontrolních pravidel.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |