# Selectbox Problem in JSP



## Athro (16. Mai 2008)

Hallo,
ich habe in einer JSP eine Selectbox , die eine Liste von Elemente Zeigen sollte.
Wenn der User ein Element  von der Liste auswählt, soll es eine Action auslösen.

```
<html:form styleClass="displayInline" method="get"
		action="/meinAction.do"
		onsubmit="if(returnTaste==1)return false;">
<logic:notEmpty name="MeinForm" property="MeineListe">
<html:select styleClass="aaaa" name="MeinForm"  property="meinProp" onchange="submit()">
<html:options styleClass="aaaa" name="meinForm" property="MeineListe" /> 
</html:select>
<html:hidden property='selected' value='meinWert' />
</logic:notEmpty>
<logic:empty name=" MeinForm " property=" MeineListe ">
<select class="aaaa" onclick="submit()" disabled>
</select>
</logic:empty>
</html:form>
```

Es funktioniert für alle Elemente der gezeigten Liste, aber beim klicken des ersten Attributes funktioniert es nicht.

Damit ich das erste Element auswählen kann, muss ich ein andres Attribut auswählen und dann das erste Attribut!

Hätte die Liste nur einen Element, wird kein (Event) erzeugt

Ich könnte das erste Element der Liste mit Lehrstring setzen, aber das möchte ich nicht :noe: , denn der User soll sehen, dass die Liste nicht Lehr ist.

Hat jemand eine Idee

Vielen Dank


----------



## HLX (16. Mai 2008)

Wozu sollte auch ein Event erzeugt werden, wenn der dargestellte Wert bereits der aktuelle ist. Der angezeigte Wert bezieht sich ja auf die bestehende Maske.

Wenn du bei jedem Anwählen eines Items einen Event erzeugen möchtest verwende onClick statt onChange.


----------



## Athro (20. Mai 2008)

Hallo HLX,

ich habe mit OnClick versucht, bekomme ich aber folgende  Fehler 



> Attribute onClick invalid for tag select according to TLD


----------



## HLX (20. Mai 2008)

Ok. 

Versuche oncklick (klein geschrieben).


----------



## Athro (20. Mai 2008)

immer noch Probleme:


> Attribute oncklick invalid for tag select according to TLD


----------



## dajos7 (20. Mai 2008)

versuch mal onchange

und für die vorinitialisierung sollte man im body tag das gewünschte Prozedere in onload einmal aufrufen.


----------



## Athro (20. Mai 2008)

Hallo dajos7,


			
				dajos7 hat gesagt.:
			
		

> versuch mal onchange


Es ist bei mir doch onchange sehe den Code oben !

Danke


----------



## HLX (20. Mai 2008)

Was für eine Tag-Library verwendest du?


----------



## Athro (20. Mai 2008)

ich benutzte Das Frame Work Struts und in der JSP include folgende Libs:


> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
> <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
> ...


----------



## HLX (20. Mai 2008)

onclick ist bei Struts für <html:select> erlaubt:
struts.apache.org/1.2.7/userGuide/struts-html.html#select

Überprüf das nochmal.


----------



## dajos7 (20. Mai 2008)

hallo, sorry wegen eben habs etwas falsch verstanden. Ich hab mir das jetzt mal angeschaut und es in einem Tomcat 6.0 mit java 1.6 und struts 1.3.8 nachgebildet.

onclick wird hier bei mir auch als valid angegeben. das problem, das ich allerding habe ist, dass er es nun bei jedem click direkt submitted, ohne dass ich in der lage bin andere values auszuwählen, also das onclick wird da glaub ich auch nicht wirklich die Lösung sein. Normal muss man den User zum auswählen Zwingen, was man wie schon erwähnt mit einem leeren Feld erreicht. Ist das so schlimm, wenn da steht "Bitte wählen"?



Der Code:
Ich habe es etwas abgeändert, damit es bei mir läuft. Ich habe allerdings den Verdacht, dass er meinForm in deinem options Tag  und MeinForm in deinem select Tag nicht wirklich auseinanderhalten kann, bei mir wirft er da eine Exception.

JSP

```
<%@ taglib uri="/WEB-INF/struts-html" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic" prefix="logic" %>


<html>
<head>
<title></title>
</head>
<body>

<html:form styleId="meinForm" method="get" action="/meinAction">
<logic:notEmpty name="meinForm" property="list">
<html:select name="meinForm"  property="selectedListItem" onchange="submit()">
<html:optionsCollection name="meinForm" property="list" />
</html:select>
<html:hidden property="selected" value="meinWert" />
</logic:notEmpty>
<logic:empty name="meinForm" property="list">
<select onclick="submit()" disabled>
</select>
</logic:empty>
</html:form>
</body>

</html>
```

Action

```
package de.server.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import de.server.struts.form.MeinForm;

public class MeinAction extends Action {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		MeinForm mf = (MeinForm)form;
		
		System.out.println("Called action "+mf.getSelected() + " "+mf.getSelectedListItem());
		
		return super.execute(mapping, form, request, response);
	}
}
```


Form

```
package de.server.struts.form;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.LabelValueBean;

public class MeinForm extends ActionForm {

	

	private static final long serialVersionUID = -6309808242870816258L;
	
	private String selectedListItem = "";
	private LabelValueBean[] list = new LabelValueBean[5];
	private String selected = "";


	@Override
	public void reset(ActionMapping mapping, HttpServletRequest request) {
		
		list[0] = new LabelValueBean("Test","test");
		list[1] = new LabelValueBean("Test1","test1");
		list[2] = new LabelValueBean("Test2","test2");
		list[3] = new LabelValueBean("Test3","test3");
		list[4] = new LabelValueBean("Test4","test4");
		
		
	}
	
	
	@Override
	public ActionErrors validate(ActionMapping mapping,
			HttpServletRequest request) {
		// TODO Auto-generated method stub
		return super.validate(mapping, request);
	}


	public LabelValueBean[] getList() {
		return list;
	}


	public void setList(LabelValueBean[] list) {
		this.list = list;
	}


	public String getSelected() {
		return selected;
	}


	public void setSelected(String selected) {
		this.selected = selected;
	}


	public String getSelectedListItem() {
		return selectedListItem;
	}


	public void setSelectedListItem(String selectedListItem) {
		this.selectedListItem = selectedListItem;
	}
	
}
```


----------



## Athro (21. Mai 2008)

Hallo dajos7


			
				dajos7 hat gesagt.:
			
		

> Normal muss man den User zum auswählen Zwingen, was man wie schon erwähnt mit einem leeren Feld erreicht. Ist das so schlimm, wenn da steht "Bitte wählen"?
> [/code]


Nein ist nicht so schlimm aber wie ich sagte ich finde es nicht schön.
Wenn keine andre Lösung gibt dann mache ich einfach so.

Danke noch mal


----------



## dajos7 (21. Mai 2008)

Vlt geht aber auch das hier ?

Ich habe es mal nur auf das Javascript beschränkt. Wenn Du einfach die size erhöhst? Dann sind die Elemente immer angezeigt und es ist nichts vorausgewählt. wenn man dann ein Element auswählt, führt er das javascript immer aus auch beim ersten mal. Ok es ist keine Combobox mehr, aber es geht 


```
<html>
<head>
<title></title>
</head>
<body>

<select id="select" size=6  onchange="javascript:alert(''+document.getElementById('select').options[document.getElementById('select').selectedIndex].value);">
<option value="1">lala</option>
<option value="2">lala2</option>
<option value="3">lala3</option>
<option value="4">lala4</option>
</select>


</body>

</html>
```


----------

