# JSP: Inhalt von Dropdownfeld abhängig von anderem Dropdown



## slaytallicer (7. Jan 2009)

Hallo zusammen,

ich sitze an der Programmierung eines Webshops.
Die Artikel sollen in Rubriken und Unterrubriken eingeteilt werden.
Beim Anlegen des Artikels wähle ich sowohl Rubrik als auch Unterrubrik per Dropdownfeld in JSP aus.
Das unschöne daran ist, dass ich sämtliche Unterrubriken angezeigt bekomme, die in der Datenbank vorhanden sind. Ich möchte, dass nur die Unterrubriken ausgewählt werden, die zur ausgewählten Rubrik gehören.
In der MySQL-Datenbank verweist das Feld "RUBRIK_ID" in der Tabelle "UNTERRUBRIK" auf die zu jedem Eintrag in der Unterrubrik gehörende Rubrik. 
Leider weiß ich nicht, wie ich meinen Wunsch im Code JSP umsetzen muss und ob dies in der JSP oder in der JAVA-Klasse zur Anlage des Artikels oder im Objekt Unterrubrik implementiert werden muss. 

Hier der Codeausschnitt der JSP mit beiden DropDown-Feldern:

```
<%
	CmdCreateArtikel cmd = (CmdCreateArtikel) request.getAttribute(CmdCreateArtikel.NAME);
%>
<tr>
		<td>Rubrik:</td>
  <td> <select name="<%=CmdCreateArtikel.PARAM_RUBRIK%>">
  	
  	<%if (cmd.getArtikel() == null) { %>
   			<option value="Bitte auswählen"  selected=true>Bitte auswählen
   			</option>
   			<%} %>
  
  
   <%
   	for(Iterator<Rubrik> iter = cmd.getRubriken().listIterator(); iter.hasNext();) {
                  Rubrik rubrikauswahl = iter.next();
   %>
   <option value="<%=rubrikauswahl.getId()%>"
   <%if (cmd.getArtikel() != null && cmd.getArtikel().getRubrik() != null && rubrikauswahl.getId()==cmd.getArtikel().getRubrik().getId())%>selected=true<%;%>><%=rubrikauswahl.getRubriktext()%></option>
   <%
   	}
   %>  
   </select></td>
		
	</tr>
	
	<tr>
		<td>Unterrubrik:</td>
  <td> <select name="<%=CmdCreateArtikel.PARAM_UNTERRUBRIK%>">
   
   <%if (cmd.getArtikel() == null) { %>
   			<option value="Bitte auswählen"  selected=true>Bitte auswählen
   			</option>
   			<%} %>
   
   
   <%
   	for(Iterator<Unterrubrik> iter = cmd.getUnterrubriken().listIterator(); iter.hasNext();) {
               Unterrubrik unterrubrikauswahl = iter.next();
   %>
   <option value="<%=unterrubrikauswahl.getId()%>"<%if (cmd.getArtikel() != null && cmd.getArtikel().getUnterrubrik() != null && unterrubrikauswahl.getId()==cmd.getArtikel().getUnterrubrik().getId()) out.print(" selected");%>><%=unterrubrikauswahl.getUnterrubriktext()%></option>
   <%
   	}
   %>  
   </select></td>
		
	</tr>
```

Hier der Codeausschnitt des Objetktes Unterrubrik:

```
import java.util.List;



public class Unterrubrik {
private Long id;
private String unterrubriktext;
  private Rubrik Rubrik;

	
	
	
	public Rubrik getRubrik() {
	return Rubrik;
    }

    public void setRubrik(Rubrik Rubrik) {
	this.Rubrik = Rubrik;
    } 

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getUnterrubriktext() {
		return unterrubriktext;
	}

	public void setUnterrubriktext(String unterrubriktext) {
		this.unterrubriktext = unterrubriktext;
	}
	
	public static List<Unterrubrik> getUnterrubriken(org.hibernate.Session session)
	{
		return (List<Unterrubrik>) session.createCriteria(Unterrubrik.class).list();
	}
```


Hier die für die Dropdownfelder relevanten Codeschnipsel aus dem Command zur Anlage des Artikels:

```
import edu.ba.gruppe2.shop.model.Artikel;
import edu.ba.gruppe2.shop.model.Rubrik;
import edu.ba.gruppe2.shop.model.Unterrubrik;



public class CmdCreateArtikel extends AbstractCommand implements ICommand {
			
	
	
	private List <Rubrik> rubrikauswahl;
	
	private List <Unterrubrik> unterrubrikauswahl;
	
	
	public static final String NAME = "CmdCreateArtikel";
	
	
	public static final String JSP = "createArtikel.jsp";
	
	public static final String PARAM_RUBRIK = "rubrik";
	
	public static final String PARAM_UNTERRUBRIK = "unterrubrik";

		
	public static final String PARAM_SUBMIT = "submit";
	
	
	
	public CmdCreateArtikel(IModule pModule) {
		super(NAME, pModule);
	}
	
	
	public String process(HttpServletRequest request,
			HttpServletResponse response) throws IOException, ServletException {
		
		
		
		
		rubrikauswahl = Rubrik.getRubriken(getSession());
		unterrubrikauswahl = Unterrubrik.getUnterrubriken(getSession());
		
		
		
		
		Transaction tx = getSession().beginTransaction();
		
		if((request.getParameter(PARAM_SUBMIT) != null ) && (request.getParameter(PARAM_SUBMIT)).equals("Artikel anlegen")){
		
		Artikel artikel = new Artikel();
		
		artikel.setRubrik((Rubrik)getSession().get(Rubrik.class, Long.valueOf(request.getParameter(PARAM_RUBRIK))));
		artikel.setUnterrubrik((Unterrubrik)getSession().get(Unterrubrik.class, Long.valueOf(request.getParameter(PARAM_UNTERRUBRIK))));
		
		Long id = (Long) getSession().save(artikel);
		String msg = String.format("Ein Artikel mit der ID %s wurde erfolgreich angelegt.", id);
		logger.info(msg);
		
		request.setAttribute(IMessage.KEY_MESSAGE, new Message(msg));
		tx.commit();
		
		}

		return JSP;
	}
	
	
	public Artikel getArtikel(){
		return artikel;
	}
	
	public List<Rubrik> getRubriken() {
		return rubrikauswahl;
	}
	
	public List<Unterrubrik> getUnterrubriken() {
		return unterrubrikauswahl;
	}
```

Danke schon im Vorfeld für eure Hilfe!


----------



## HLX (8. Jan 2009)

Du solltest beim Ändern der Hauptrubrik die anzuzeigenden Daten neu vom Server anfordern.

Dazu kannst du ein JavaScript-Event am Select-Tag verwenden, mit dem du z.B. das Formular absendest:

```
<select ... onchange="document.meinFormular.submit()">
```


----------



## slaytallicer (8. Jan 2009)

Hi, danke schonmal.

Die anzuzeigenden Daten werden jetz bei onChange neu geladen:
	
	
	
	





```
<td> <select name="<%=CmdCreateArtikel.PARAM_RUBRIK%>" onchange="document.forms[0].submit()">
  	
  	<%if (request.getParameter(CmdCreateArtikel.PARAM_RUBRIK) == null) { %>
   			<option value="Bitte auswählen"  selected=true>Bitte auswählen
   			</option>
   			<%} %>
  
  
   <%
   	for(Iterator<Rubrik> iter1 = cmd.getRubriken().listIterator(); iter1.hasNext();) {
                  Rubrik rubrikauswahl = iter1.next();
   %>
   <option value="<%=rubrikauswahl.getId()%>"
   
   
   
   <%  
      if (
		   cmd.getArtikel() != null 
		&& cmd.getArtikel().getRubrik() != null 
		&& rubrikauswahl.getId()==cmd.getArtikel().getRubrik().getId()
		)
   {
   		%> selected=true <%
   }%> 
   ><%=rubrikauswahl.getRubriktext()%></option><%}%>  
   
       
   </select></td>
```

Die Frage ist jetzt nur, wie ich dem Auswahlfeld für Rubrik 2 beibringe, nur die passenden Werte auszulesen...


----------



## HLX (8. Jan 2009)

Der JSP sollten beim Neuladen der Seite ausschließlich die passenden Werte übermittelt werden. Deine serverseitige Formularverarbeitung (Servlet?) sollte das Ergebnis bereits einschränken.


----------

