JSF-Validierung

abdollah

Mitglied
Hallo Leute,

ich wäre für denjenigen, der mir bei meinem Problem helfen könnte, sehr dankbar.
Mein Problem ist:
ich möchte die Komponente "SelectOneMenu" nach der Länge prüfen, ob sie gelich 10 ist.
Allerdings möchte ich einen eigenen Text ausgeben lassen.
Mit
Code:
<f:validateLength maximum=10>
bekomme ich den Text, der sich in der Datei Messages.properties befindet.

HTML:
<h:form id="eingabe_komponenten_1">
			<h:messages errorStyle="color:red;"></h:messages>
			<h:panelGrid columns="3">
				<h:inputText binding="#{verzeichnisController.verzeichnis_name}" value="#{verzeichnis.name}" />
				<h:commandButton image="/resources/images/search_bild.png" 
								 action="#{verzeichnisController.gebe_verzeichnis_aus}"
								 style="width: 20px; height: 20px;" />
				<h:selectOneMenu id="laufwerk" binding="#{verzeichnisController.laufwerk_name}" 
								 value="#{verzeichnis.speicher_ort}" style="margin-left: 5px;">
					<f:validateLength maximum="10" />
					<f:selectItems value="#{verzeichnisController.speicherOrt}" />
				</h:selectOneMenu>

Danke vielmals
 

Marc T.

Bekanntes Mitglied
Eine etwas umständliche aber funktionierende Lösung wäre, dir deinen
eigenen Validator zu schreiben. Hier mal ein Beispiel, das ich für mein
Projekt programmiert habe:

[XML]
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">

<h:body>
<ui:composition template="/templates/master.xhtml" >
<ui:define name="content">
<h:form>
<p:panel id="panel">
<h:panelGrid columns="3" cellpadding="5" >

<h:eek:utputText for="username" value="Username:" />
<p:inputText id="username" value="#{registerService.username}" >
<f:ajax event="keyup" execute="@this" render="m_username" />
<f:validator binding="#{usernameValidator}" />
</p:inputText>
<p:message id="m_username" for="username" />

</h:panelGrid>
<p:commandButton type="submit" value="Submit" action="#{registerService.addUser}" ajax="false" update="panel" validateClient="true" />
</p:panel>
</h:form>
</ui:define>
</ui:composition>
</h:body>
</html>
[/XML]

Wie du siehst findest du hier

[XML]
<f:validator binding="#{usernameValidator}" />
[/XML]

Das greift auf eine Bean zu:

Java:
@Named
@SessionScoped
public class UsernameValidator implements Validator, Serializable {
	@Inject
	DAO dao = null;

	public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
		String username = (String)value;
		FacesMessage message = null;
		
		User user = dao.findUserByUsername(username);
		
		if(user != null) {
			message = new FacesMessage ("Invalid username!", "Username Validation Error");
			message.setDetail("Username already exists!");
			message.setSeverity(FacesMessage.SEVERITY_ERROR);
			
			throw new ValidatorException(message);
		}
	}
}

In der ValidatorException kannst du nun jede Nachricht übergeben die du möchtest.
Mit solchen selbst geschriebenen Validatoren kannst sehr umfangreiche überprüfungen
vornehmen. In meinem Fall habe ich in der Datenbank nachgeguckt, ob der Username
schon vorhanden ist oder nicht. Es würde sich aber natürlich auch nachsehen lassen,
wie lange der value ist:

Java:
String temp = (String)value;

if(temp.length() > 10) {
    ....
    throw new ValidatorException("zu lang!");
}

Lass dich von dem ganzen anderen drumherum nicht verwirren, wichtig ist für dich nur
die Bean und das binden des Validators.
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben