# JSP/JSF Inputtext rerender wenn Value geändert wird



## Guest (28. Apr 2008)

Hallo,

Ich arbeite erst seit kurzem in der JSF/JSP und Javawelt.
Momentan muss ich ein Webapplikation realisieren, die eingescannte Barcodes in die richtigen Inputtextfelder schreibt.
Mein bisheriges Vorgehen sieht wie folgt aus

Meine jsp enthällt mehrere Inputtextfelder. In einige davon können bestimmte Barcodes gescannt werden. Ein verstecktes Inputtext ist dafür, dass dort erstmal der gescannte Barcode eingetragen wird um dann weiterverarbeitet zu werden.
Ausserdem enthällt sie einen JavaScript welcher eingehende Barcodes in das scanField schreibt.
Durch das a4j:support wird der ValueChangeListener durch ein aufrufen des onchange im JavaScript aufgerufen sobald es eine Änderung im scanField gibt.


```
<script type="text/javascript" src="<%=request.getContextPath()%>/js/scanScript.js"></script>
....
<h:outputLabel value="BarcodeLabel1" ></h:outputLabel>
<h:inputText id="barcodeInputText1" value="#{scannerHandler.inputText_Barcode1}"></h:inputText>

<h:outputLabel value="BarcodeLabel2"></h:outputLabel>
<h:inputText id="barcodeInputText2" value="#{scannerHandler.inputText_Barcode2}"></h:inputText>	
					
<h:inputText id="scanField" value="#{scannerHandler.inputTextScanField}" valueChangeListener="#{scannerHandler.scancodeChanged}" style="visibility:hidden" >
		<a4j:support event="onchange" reRender="barcodeInputText1,barcodeInputText2"></a4j:support>
</h:inputText>
```

die Methode scancodeChanged, welche durch den valueChangeListener im scanField aufgerufen wird sieht im Moment wie folgt aus.


```
public void scancodeChanged(ValueChangeEvent vce) {
		if(vce.getNewValue().equals(" ") == false)
		{
			String newVal = vce.getNewValue().toString();
			if(newVal.startsWith("3"))
			{
				inputText_Barcode1= newVal;
			}
			else {		
				inputText_Barcode2 = newVal;
			}
		}
	}
```

Der Scancode kommt also schonmal in die richtige Variable für die bestimmten InputTextfelder.
Leider kommt das "reRedner" vom a4j:support wohl vorher und darum steht der Barcode erst im Feld sobald man z.B. in der Page vor und zurück springt.

Ich weiß im Moment nicht wie ich dieses Problem lösen kann. Gibt es Möglichkeiten Elemente aus der Bean raus zu rerendern, oder gibt es JSF-Komponenten, die selber merken wenn sich ihr Value ändert und sich dann neu rendern?

Würde mich sehr über ein paar Hilfestellungen freuen und solltet ihr allgemein noch Tipps haben wie ich das ganze besser umsetzen kann, sind diese bei mir auch sehr willkommen.

Danke schonmal für eure Hilfe.

Grüße,

Kami


----------



## Kamikatze (28. Apr 2008)

Hatte mich vergessen einzuloggen.
Der Beitrag ist von mir.

Grüße,

Kami


----------



## Kamikatze (28. Apr 2008)

Lösung gefunden. Ich hatte das wohl etwas komplizierter gemacht als es nötig war.
So funktioniert es jetzt.

JSP:

```
<h:inputText id="scanField" value="#{scannerHandler.inputTextScanField}" style="visibility:hidden">
		<a4j:support event="onchange" reRender="barcodeInputText1,barcodeInputText2" action="#{scannerHandler.scanCodeChanged}"></a4j:support>
</h:inputText>
```

Über die action kann man eine Methode im Bean aufrufen. Ich hatte das nur vorher nicht gemacht, da mir meine Methoden nicht per Autocompletion angezeigt wurden. Wird aber trotzdem aufgerufen und das reRender kommt dann erst sobald die Methode abgearbeitet wurde.

Grüße

Kami


----------

