# JSF mit Ajax?



## Stephan.Woebbeking (23. Sep 2014)

Hallo, ich versuche mit JSF einzusteigen und suchte eine Möglichkeit, auf einer bereits angezeigten Web Seite einen Chech durchzuführen (Sowas wie beim registrieren, ist der Nick noch verfügbar). Ich denke, AJAX wäre das richtige Stichwort, bin mir aber nicht sicher, wie ich das verbinden kann. Beim experimentieren bin ich auf viele nicht- und eine funktionierende Kombination gekommen:


```
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<f:loadBundle basename="messages" var="msg"/>

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:i="http://java.sun.com/jsf/core"      
      xmlns:j="http://java.sun.com/jsf/html">
	<head>
		<title>Register new user</title>
	</head>
	<body>
		<f:view>
...
			<h:form id="registerNewUserForm" onkeypress="enterForm()">
			(<h:outputText value="#{gameUser.counter}"/>)
...
				<h:outputText value="Nickname:"/>
				<h:inputText id="nickName" value="#{gameUser.nickName}" validator="#{gameUser.checkNickName}" required="true" immediate="true">
					<f:validateLength minimum="3" maximum="30"/>
				</h:inputText>
				<h:message for="nickName" style="color:darkred"/>
				<p></p>
				
				<h:commandButton action="register" value="#{msg.button_text}">
				</h:commandButton>
			</h:form>
		
		<h:form>
    	
    		<h:inputText id="name" value="#{gameUser.nickName}"></h:inputText>
    		<h:commandButton value="Welcome Me">
    			 <i:ajax execute="name" render="output" />
    		</h:commandButton>
    		
    		<h2><h:outputText id="output" value="#{gameUser.counter}" /></h2>
    		
    	</h:form>
		
		</f:view>
	</body>
</html>
```

Kann man das so überhaupt machen? Ich wundere mich, dass ich ganz oben die /html und /core zweimal einbinden muss, aber anders habe ich es nicht hinbekommen. Wie ist es denn mit zwei forms auf einer Seite, ist das ok? Wenn ich die Elemente alle in eine form ziehe, wird die Ausgabe nicht mehr komplett durchgeführt?!?

Vielleicht habt ihr ein paar Tips für mich, ich bin noch am rudern das Gesamtkonzept zu durchblicken, obwohl ich schon recht viel gelesen hab...

Danke,
Stephan

Achja, es geht ja sogar noch weiter: Wie ich gerade feststelle, wird der Code in dem gameUser nicht immer ausgeführt. Wenn ich den Button "Welcome Me" drücke, wird zwar etwas aktualisiert, aber der "gameUser.counter" zeigt einen konstanten Wert. Implementiert ist die so, dass der Counter hochzählen sollte, wie kommt das?


```
public int getCounter() { 							return counter++;					}
```


----------



## stg (23. Sep 2014)

Oben das sieht nach JSP aus. Verwende besser JSF (2.x) mit Facelets!

Mehrere Forms sind in JSF erlaubt, sie dürfen nur nicht verschachtelt sein.

Zum letzten Punkt: In getter-Methoden gehört (im JSF-Umfeld) keine Business-Logik


----------



## Stephan.Woebbeking (24. Sep 2014)

Hallo,

hmm, ich war überzeugt, dass das JSF wäre? Zumindest habe ich mich an entsprechenden Tutorials orientiert *seufz*. Wie würde das denn dann aussehen müssen?

Das mit der Business Logik ist mir klar, das ist nur der kurze Weg / Test um festzustellen, dass dieser Code nicht ausgeführt wird. Kannst du mir sagen, warum das so ist?

Danke,
Stephan


----------



## stg (25. Sep 2014)

Die obersten zwei Zeilen meinte ich mit "oben".

Und JSF und JSP ist kein Widerspruch. Man kann JSF basierend auf JSP als renderer benutzen. Das ist aber nicht zu empfehlen, sondern stattdessen sollte JSF 2.1/2.2 zusammen mit Facelets benutzt werden.

Das Grundgerüst deiner Seite sollte jedenfalls in etwa wie folgt aussehen:


```
<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    >
    <f:loadBundle basename="messages" var="msg"/>
    <h:head>
		<title>Register new user</title>
    </h:head>
    <body>
        <f:view>
            .....
       </f:view>
    </body>  
</html>
```


----------

