# JSF-Validierung



## abdollah (11. Nov 2013)

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 
	
	
	
	





```
<f:validateLength maximum=10>
```
 bekomme ich den Text, der sich in der Datei Messages.properties befindet.


```
<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. (24. Nov 2013)

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="http://primefaces.org/ui">

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

							<hutputText 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" />

	            		</hanelGrid>
	            		<p:commandButton type="submit" value="Submit" action="#{registerService.addUser}" ajax="false" update="panel" validateClient="true" />
					</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:


```
@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:


```
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.


----------



## abdollah (26. Nov 2013)

Hi,

ich danke dir meine Freund. Das hat gut funktioniert, wie du es mir erklärt hast.


----------

