MyFaces - walidacja
syllepsa - 22-11-2006 01:18
MyFaces - walidacja
Przejrzalem sobie sposoby walidacji danych dostepnych dla JSF: http://www-128.ibm.com/developerwork...ibrary/j-jsf3/
Jednak brakuje mi tu jednej rzeczy, a mianowicie chcialbym uzyskac cos na ksztalt:
<h:inputText id="firstName" value="#{UserRegistration.user.firstName}"> <f:validateLength minimum="2" maximum="25" /> </h:inputText>
Jednak validateLength wraz z parametrami chcialbym wrzucic do jakiegos xmla najlepiej faces-config.xml. Dodatkowo chcialbym w tym pliku przechowywac lancuch tekstowy wyswietlany na wypadek niepomyslnej walidacji. Nie chodzi mi tu o implementacje ManagedBeana . No chyba, ze bylby on tworzony dynamicznie, wylacznie na podstawie wpisu w faces-config. Ponizej zamieszczam pseudo kod"
<managed-bean> <managed-bean-name>ValidatorBean</managed-bean-name> <managed-bean-class>validators.ValidatorBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>validateLengthMinimum</property-name> <value>3</value> </managed-property> <managed-property> <property-name>validateLengthMaximum</property-name> <value>12</value></managed-property> </managed-property> <errorMessage>Imie musi sie skladac maksymalnie z 12 liter</errorMessage> </managed-bean>
Chcialbym odseparowac walidacje od kodu widoku. Bez zbednego w tym wypadku jawnego tworzenia klasy implementujacej javax.faces.validator.Validator. Czy jest to mozliwe?
Pozdrawiam
Mariusz
Jacek Laskowski - 23-11-2006 00:13
syllepsa wrote:
> Jednak brakuje mi tu jednej rzeczy, a mianowicie chcialbym uzyskac cos na > ksztalt: > > <h:inputText id="firstName" value="#{UserRegistration.user.firstName}"> > <f:validateLength minimum="2" maximum="25" /> > </h:inputText> > > Jednak validateLength wraz z parametrami chcialbym wrzucic do jakiegos xmla > najlepiej faces-config.xml. Dodatkowo chcialbym w tym pliku przechowywac > lancuch tekstowy wyswietlany na wypadek niepomyslnej walidacji. Nie chodzi > mi tu o implementacje ManagedBeana . No chyba, ze bylby on tworzony > dynamicznie, wylacznie na podstawie wpisu w faces-config. Ponizej > zamieszczam pseudo kod" > > <managed-bean> > <managed-bean-name>ValidatorBean</managed-bean-name> > <managed-bean-class>validators.ValidatorBean</managed-bean-class> > <managed-bean-scope>request</managed-bean-scope> > <managed-property> > <property-name>validateLengthMinimum</property-name> > <value>3</value> > </managed-property> > <managed-property> > <property-name>validateLengthMaximum</property-name> > <value>12</value></managed-property> > </managed-property> > <errorMessage>Imie musi sie skladac maksymalnie z 12 liter</errorMessage> > </managed-bean> > > Chcialbym odseparowac walidacje od kodu widoku. Bez zbednego w tym wypadku > jawnego tworzenia klasy implementujacej javax.faces.validator.Validator. Czy > jest to mozliwe?
Może coś takiego?
Strona index.jsp:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view> <html> <body> <h:form> <h:messages layout="table" style="color: red" /> <hr> <h:inputText id="imie" value="Jacek" validator="#{formularz.sprawdzImie}" /> <h:message for="imie" errorStyle="color: red" /> <br> <h:commandButton value="Submit" /> </h:form> </body> </html> </f:view>
faces-config.xml:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> <faces-config> <managed-bean> <managed-bean-name>formularz</managed-bean-name> <managed-bean-class>pclj.Formularz</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>errorText</property-name> <value>error</value> </managed-property> <managed-property> <property-name>errorMessageDetail</property-name> <value>Prosze o imie inne niz {0}</value> </managed-property> <managed-property> <property-name>errorMessageSummary</property-name> <value>Nieprawidlowe imie</value> </managed-property> </managed-bean> </faces-config>
i w końcu pclj.Formularz:
package pclj;
import java.text.MessageFormat;
import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext;
public class Formularz { private String errorText;
private String errorMessageSummary;
private String errorMessageDetail;
public void sprawdzImie(FacesContext ctx, UIComponent comp, Object obj) { String str = (String) obj; if (str == null || str.equalsIgnoreCase(this.errorText)) { FacesMessage msg = new FacesMessage(); msg.setSeverity(FacesMessage.SEVERITY_ERROR); msg.setSummary(MessageFormat.format(this.errorMess ageSummary, new Object[] {this.errorText})); msg.setDetail(MessageFormat.format(this.errorMessa geDetail, new Object[] {this.errorText})); ctx.addMessage(comp.getClientId(ctx), msg); } else { System.out.println("Nic się nie dzieje - nuda. Wpisz \"" + this.errorText + "\" a Twoje życie się odmieni!"); } }
public void setErrorMessageDetail(String errorMessageDetail) { this.errorMessageDetail = errorMessageDetail; }
public void setErrorMessageSummary(String errorMessageSummary) { this.errorMessageSummary = errorMessageSummary; }
public void setErrorText(String errorText) { this.errorText = errorText; } }
Jacek
-- Jacek Laskowski http://www.jaceklaskowski.pl
syllepsa@wp.pl - 24-11-2006 00:42
Jacek Laskowski wrote: > syllepsa wrote: > > > Jednak brakuje mi tu jednej rzeczy, a mianowicie chcialbym uzyskac cos na > > ksztalt: > > > > <h:inputText id="firstName" value="#{UserRegistration.user.firstName}"> > > <f:validateLength minimum="2" maximum="25" /> > > </h:inputText> > > > > Jednak validateLength wraz z parametrami chcialbym wrzucic do jakiegos xmla > > najlepiej faces-config.xml. Dodatkowo chcialbym w tym pliku przechowywac > > lancuch tekstowy wyswietlany na wypadek niepomyslnej walidacji. Nie chodzi > > mi tu o implementacje ManagedBeana . No chyba, ze bylby on tworzony > > dynamicznie, wylacznie na podstawie wpisu w faces-config. Ponizej > > zamieszczam pseudo kod" > > > > <managed-bean> > > <managed-bean-name>ValidatorBean</managed-bean-name> > > <managed-bean-class>validators.ValidatorBean</managed-bean-class> > > <managed-bean-scope>request</managed-bean-scope> > > <managed-property> > > <property-name>validateLengthMinimum</property-name> > > <value>3</value> > > </managed-property> > > <managed-property> > > <property-name>validateLengthMaximum</property-name> > > <value>12</value></managed-property> > > </managed-property> > > <errorMessage>Imie musi sie skladac maksymalnie z 12 liter</errorMessage> > > </managed-bean> > > > > Chcialbym odseparowac walidacje od kodu widoku. Bez zbednego w tym wypadku > > jawnego tworzenia klasy implementujacej javax.faces.validator.Validator.. Czy > > jest to mozliwe? > > Może coś takiego? > > Strona index.jsp: > > <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> > <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> > > <f:view> > <html> > <body> > <h:form> > <h:messages layout="table" style="color: red" /> > <hr> > <h:inputText id="imie" value="Jacek" > validator="#{formularz.sprawdzImie}" /> > <h:message for="imie" errorStyle="color: red" /> > <br> > <h:commandButton value="Submit" /> > </h:form> > </body> > </html> > </f:view> > > faces-config.xml: > > <?xml version='1.0' encoding='UTF-8'?> > > <!DOCTYPE faces-config PUBLIC > "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" > "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"> > <faces-config> > <managed-bean> > <managed-bean-name>formularz</managed-bean-name> > <managed-bean-class>pclj.Formularz</managed-bean-class> > <managed-bean-scope>request</managed-bean-scope> > <managed-property> > <property-name>errorText</property-name> > <value>error</value> > </managed-property> > <managed-property> > <property-name>errorMessageDetail</property-name> > <value>Prosze o imie inne niz {0}</value> > </managed-property> > <managed-property> > <property-name>errorMessageSummary</property-name> > <value>Nieprawidlowe imie</value> > </managed-property> > </managed-bean> > </faces-config> > > i w końcu pclj.Formularz: > > package pclj; > > import java.text.MessageFormat; > > import javax.faces.application.FacesMessage; > import javax.faces.component.UIComponent; > import javax.faces.context.FacesContext; > > public class Formularz { > private String errorText; > > private String errorMessageSummary; > > private String errorMessageDetail; > > public void sprawdzImie(FacesContext ctx, UIComponent comp, Object obj) { > String str = (String) obj; > if (str == null || str.equalsIgnoreCase(this.errorText)) { > FacesMessage msg = new FacesMessage(); > msg.setSeverity(FacesMessage.SEVERITY_ERROR); > msg.setSummary(MessageFormat.format(this.errorMess ageSummary, new > Object[] {this.errorText})); > msg.setDetail(MessageFormat.format(this.errorMessa geDetail, new > Object[] {this.errorText})); > ctx.addMessage(comp.getClientId(ctx), msg); > } else { > System.out.println("Nic się nie dzieje - nuda. Wpisz \"" + > this.errorText + "\" a Twoje życie się odmieni!"); > } > } > > public void setErrorMessageDetail(String errorMessageDetail) { > this.errorMessageDetail = errorMessageDetail; > } > > public void setErrorMessageSummary(String errorMessageSummary) { > this.errorMessageSummary = errorMessageSummary; > } > > public void setErrorText(String errorText) { > this.errorText = errorText; > } > } > > Jacek > > -- > Jacek Laskowski > http://www.jaceklaskowski.pl
Witam,
Dzieuje za obszerna odpowiedz. Prezentowane przez Ciebie rozwiazanie jest z pewnoscia jakims wysjciem, jednak jestem zdania, iz w tym prostym przypadku lepiej pozostac przy:
<h:outputText id="output1" value="Podaj imię" /> <h:inputText id="input1" value="#{addressBean.imie}" required="true"> <f:validateLength minimum="2" maximum="4" /> </h:inputText> <h:message style="color: red; text-decoration: overline" id="firstNameError" for="input1"/>
+<jakisCustomErrorMessage>
Gdyby nadmiernosc kodu zaczela irytowac, to zawsze mozna uzyc wzorca Composite View.
Pozdrawiam
Mariusz
Jacek Laskowski - 24-11-2006 00:42
syllepsa@wp.pl wrote:
> Dzieuje za obszerna odpowiedz. Prezentowane przez Ciebie rozwiazanie > jest z pewnoscia jakims wysjciem, jednak jestem zdania, iz w tym > prostym przypadku lepiej pozostac przy: > > <h:outputText id="output1" value="Podaj imię" /> > <h:inputText id="input1" value="#{addressBean.imie}" > required="true"> > <f:validateLength minimum="2" maximum="4" /> > </h:inputText> > <h:message > style="color: red; text-decoration: overline" > id="firstNameError" > for="input1"/>
A czym się to zatem różni od Twojej pierwotnej propozycji?! Wygląda jakbyś odpowiedział sam sobie propozycją, którą sam podałeś. Trochę zabawne, ale tak też można ;-)
I dodatkowo, gdzie przypisujesz własne komunikaty błędu? Chyba nie chcesz otrzymywać ich w języku angielskim i będącym tak ogólnym jak "Należy wprowadzić ciąg o długości od 2 do 4 znaków"?
Coś musiałem przegapić pierwszym razem i stąd takie kłopoty ze zrozumieniem ;-)
Jacek
-- Jacek Laskowski http://www.jaceklaskowski.pl
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
(plsql) walidacja danych za pomoca wyrażeń regularnych
Kilka pytań.
OT programowanie gier
Zapytanie o GIMP-a
[wykonam] Strony www w php za 30 zł.
Fachowiec do poprawienia oscommerce potrzebny
TOAD blad polaczenia z serwerem: ORA-01031 insufficient privileges
deseń_jak zrobić?
Oracle 8
Sekwencje w PostgreSQL
zanotowane.pldoc.pisz.plpdf.pisz.plabsolwenci.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|