# Problem der Parameterübergabe aus Iframe



## Phenix (5. Jun 2009)

Hallo, ich habe ein (zumindest für mich) kniffliges Problem, auf dessen Lösung ich nicht komme. 
Also ich habe in einer JSP (SearchEmployee.jsp) ein Scriptlet, das mir alle Mitarbeiter ausgibt(mithilfe eines Gateways und einer Bean), die zu einem gesuchten Kriterium passen. Die Ergebnisse sollen in einem Iframe ausgegeben werden, da somit ein Scrollen möglich ist, ohne das Design zu verhunzen. 
Hinter jedem gefundenen Mitarbeiter soll ein Radiobutton erscheinen, der nach anwahl und zusätzlichem drücken eines submit-buttons eine EmployeeBean an ein weiteres Servlet übergibt. Diese EmployeeBean soll allerdings die Bean sein, zu der halt der entsprechende Radiobutton gehört. Etwas doof zu erklären. Vielleicht ist der Code ja halbwegs selbsterklärend. Ich denke, man muss das mit nem requestDispatcher lösen, allerdings habe ich nicht ganz verstanden, wie ich diesen Einsetze:

```
<!--- Code der SearchEmployee.jsp -->

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="nl.fontys.prj22.gateway.EmployeeGateway"%>
<%@page import="nl.fontys.prj22.bean.EmployeeBean"%>
<%@page import="java.util.*"%>
<%@page import="nl.fontys.prj22.predefine.DesignMenu" %>
<%@page import="nl.fontys.prj22.interfaces.Links" %>
<%@page import="nl.fontys.prj22.interfaces.Abstract" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%!
ArrayList<EmployeeBean> list=new ArrayList<EmployeeBean>();
%>

<%

String message="<br>";
if(request.getParameter("name")!=null){
    message += "Suchergebnis:<br>";
    EmployeeGateway gateway = new EmployeeGateway();
    list = gateway.searchBy(request.getParameter("attribute"),request.getParameter("name"),request.getParameter("order"));
    for (int i = 0; i < list.size(); i++) {
    message += list.get(i).getFirstname()+" "+list.get(i).getName()+" ("+list.get(i).getGender()+")<br>"
            +list.get(i).getBirthday()+"."+list.get(i).getBirthmonth()+"."+list.get(i).getBirthyear()+"<br>"
            +list.get(i).getStreet()+" "+list.get(i).getHousenumber()+" - "+list.get(i).getZip()+" "+list.get(i).getCity()+"<br>"
            +"Arbeitsbeginn: "+list.get(i).getStartday()+"."+list.get(i).getStartmonth()+"."+list.get(i).getStartyear()+"<br>"
            +list.get(i).getRank()+": "+list.get(i).getWorkshift()+"<br>"
            +"|"+list.get(i).getComment()+"|<br> <form action=\"SearchResults.jsp\">"+
            "<input type=\"radio\" name=\"searchlist\" value=\""+i+"\"></form><br>"
            +"________________________________________<br><br>";
    }
    session.setAttribute("searchResult", message);
}
%>


        <%=DesignMenu.printHtmlHead()%>
        <%=DesignMenu.printInnerMenue()%>
        <%=DesignMenu.printLogo()%>
        <%=DesignMenu.printDate()%>
     <div id="Content">
     <form method="post" action="SearchEmployee.jsp">
     <input type="text" name="name" value=""><input type="submit" value="Suche"><br>
         search by:<br>
     <input type="radio" name="attribute" value="EMP_LASTNAME" checked>Nachname <br>  
     <input type="radio" name="attribute" value="EMP_FIRSTNAME">Vorname <br>
     <input type="radio" name="attribute" value="EMP_RANK">Arbeitsstatus <br>  
     <input type="radio" name="attribute" value="EMP_WORKSHIFT">Arbeitszeit<br>
         order by:<br>
     <input type="radio" name="order" value="EMP_LASTNAME" checked>Nachname <br>  
     <input type="radio" name="order" value="EMP_FIRSTNAME">Vorname <br>
     <%-- <input type="radio" name="order" value="EMP_RANK">Arbeitsstatus <br>  
     <input type="radio" name="order" value="EMP_WORKSHIFT">Arbeitszeit<br> --%>
     </form>
     <br>

         <! --- Hier soll der Button hin. Der Teil ist nicht vollständig -->
         <% if(!list.isEmpty()){
            //EmployeeBean emb=list.get(Integer.parseInt(request.getParameter("searchlist")));
            String s=request.getParameter("searchlist");
            session.setAttribute("employee", s);
            }
          %>
             
         <iframe scrolling="auto" height="520px" width="800px" frameborder="0" src="<%=Links.SEARCHRESULTS%>"/>
         <br>


     </div>
    </body>
</html> 




<! --- Hier sollen die Ergebnisse angezeigt werden -->

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="nl.fontys.prj22.gateway.EmployeeGateway"%>
<%@page import="nl.fontys.prj22.bean.EmployeeBean"%>
<%@page import="java.util.*"%>
<%@page import="nl.fontys.prj22.predefine.DesignMenu" %>
<%@page import="nl.fontys.prj22.interfaces.Links" %>
<%@page import="nl.fontys.prj22.interfaces.Abstract" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%=DesignMenu.printHtmlHead()%>

        <%=session.getAttribute("searchResult")%>

    </body>
</html>
```


----------



## Phenix (5. Jun 2009)

Keiner ne Idee oder habe ich das Problem nicht genau genug geschildert? Wäre für jede Hilfe dankbar


----------



## HLX (5. Jun 2009)

Zunächst mal hast du keine Code-Tags verwendet, so dass dein ganzer Code durch die fehlende Formatierung unleserlich ist. Dann verwendest du Scriptlets anstelle von JSP- bzw. JSTL-Tags und das auch noch recht chaotisch. Da macht das Lesen deines Post wirklich keine Freude.

Was mir auf jeden Fall schonmal auffällt: Du brauchst, so wie es aussieht nicht mehrere, sondern nur ein einizges Formular. Jeder Radiobutton hat den gleichen Namen aber einen unterschiedlichen Wert. So kannst du nach dem Absenden des Formulars den angeklickten Wert über request.getParameter("buttonName") herausfinden und deine Bean zuordnen.


----------



## Phenix (5. Jun 2009)

Jep, genau so war das auch gedacht. Das Problem ist, wie komme ich in der Parent-Seite auf die Werte des ausgewählten Radiobuttons in dem iframe?

Sorry für die unleserlichkeit. Der Code wurde von 2 Leuten zusammengeschustert und ich habe das dann übernommen und hier reingeschrieben.
Wie mach ich denn das highlighting hier an? Iwie überseh ich das scheinbar.

Danke schonmal


----------



## HLX (5. Jun 2009)

Ich kann in dem Chaos keinen Workflow erkennen, da du alles in einer JSP-Datei abfackelst. Möglicherweise gibt es ein Problem mit der Reihenfolge.

Du solltest unbedingt die Logik in ein Servlet auslagern. Der Submit-Aufruf des Formulars spricht dabei dieses Servlet an. Hier werden zunächst die Ergebnisse als Session-Attribut gesetzt. Anschließend verweist du per RequestDispatcher wieder auf die JSP-Seite. Dann sollte die JSP-Datei aus dem IFrame auf die gespeicherten Ergebnisse zugreifen können.


----------



## Phenix (6. Jun 2009)

Also ich habe die Logik jetzt in ein separates Servlet kopiert und zwar in die ProcessRequest Methode. Man kommt also zuerst auf die SearchEmployee.jsp. Das form dort schickt dann die daten an das Servlet. Dieses sollte das dann verarbeiten hoffe ich und die Daten sollen dann in dem Ifram angezeigt werden. 

Habs so versucht, funzt aber leider nicht:


```
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        ArrayList<EmployeeBean> list = new ArrayList<EmployeeBean>();
        String message = "<br>";
        if (request.getParameter("name") != null) {
            message += "Suchergebnis:<br>";
            EmployeeGateway gateway = new EmployeeGateway();
            list = //Logik
        }
```

Und in dem Iframe dann folgendes:

```
<%request.getRequestDispatcher("SearchServlet").forward(request,response);%>
<%=request.getAttribute("results")%>
```
Leider zeigt der mir aber nichts an. Was ist falsch? Ich habe den Requestdispatcher so verstanden, das der sich aus einer Quelle (Servlet) den dispatcher holt und mit forward halt in sein eigenes Request schreibt. Stimmt das? Zu dem Prolbem mit dem RadioButton komm ich gar nicht erst. :-( Session findet er in meinem Servlet gar  nicht.


----------



## maki (6. Jun 2009)

```
<%request.getRequestDispatcher("SearchServlet").forward(request,response);%>
<%=request.getAttribute("results")%>
```
Du machst einen forward, die zweite Zeile wird nie mehr ausgeführt...

Finde die Lösung mit dem iFrame nicht gut, Framesets sollten auf jedenfall nicht mehr verwendet, iFrame nur wenn es nicht anders geht.
Jeder (i)Frame ist eine neue Seite, hat nix mit denen "aussenrum" zu tun, macht die Sache unnötig komplex... würde dass ohne machen an deiner Stelle.


----------



## Phenix (6. Jun 2009)

Ok, und wenn ich das ohne mache, wie mache ich das dann, das für den Fall das viele Ergebnisse gefunden werden die Seite nicht extrem lang wird? Iframe hätte halt den Vorteil eines Scrollbalkens.

Aber danke schonmal  auch für das highlighten


----------



## maki (6. Jun 2009)

Stichwort Pagging.

Man zeigt eine bestimmte Anzahl von Ergebnissen pr Seite an, bietet aber die Möglichkeit, mehere Ergebnisseiten anzuzeigen, hast du sicher schon mal gesehen 
Im übrigen ist es keine gute Idee alle Ergebnissen anzuzeigen, der User könnte ja auf die Idee kommen ziemlich alles zu suchen, selten bringen aber alle Ergebnisse dem User einen Vorteil


----------



## Phenix (7. Jun 2009)

Die Idee hatte ich auch schon. Leider weiss ich nicht, wie ich so etwas umsetzen kann. Ich kann ja zB mit Modulo prüfen, ob beispielsweise mehr als 2 Ergebnisse auf der Seite sind. Allerings muss ich dann ja dynamisch einen Link erstellen und zusätzlich eine neue Seite, die halt die nächsten 2 ergebnisse anzeigt. Nur wie?

So sieht das jetzt halt aus, wenn der alle ergebnisse ausgibt. Habe die Logik jetzt ums mir einfacher zu machen erstmal vom servlet wieder in die jsp verlagert.

```
<%
        if(request.getParameter("name")!=null){%>
        <%=message%>
        <%}%>
```


----------



## HLX (7. Jun 2009)

Phenix hat gesagt.:


> ```
> protected void processRequest(HttpServletRequest request, HttpServletResponse response)
> throws ServletException, IOException {
> response.setContentType("text/html;charset=UTF-8");
> ...


Überschreibe nicht die ProcessRequest-Methode, sondern doGet(request,response) oder doPost(request,response).

Im *Servlet* must du das Session-Attribut setzen und über RequestDispatcher.findForward(...) auf die JSP-Seite mit dem IFrame verweisen. Sonst bekommst du nur eine weiße Seite angezeigt, da dein Servlet keine HTML-Ausgaben enthält. Nach der Weiterleitung auf die JSP-Seite sollte dann dort das Session-Attribut zur Verfügung stehen.


----------



## Phenix (7. Jun 2009)

Ok, klingt soweit logisch 

Also in meiner JSP verweise ich nun mit dem Form auf das Servlet:


```
<div id="Content">
         <form method="post" action="SearchServlet">
     <input type="text" name="name" value=""><input type="submit" value="Suche"><br>
         search by:<br>
     <input type="radio" name="attribute" value="EMP_LASTNAME" checked>Nachname <br>  
     <input type="radio" name="attribute" value="EMP_FIRSTNAME">Vorname <br>
     <input type="radio" name="attribute" value="EMP_RANK">Arbeitsstatus <br>  
     <input type="radio" name="attribute" value="EMP_WORKSHIFT">Arbeitszeit<br>
         order by:<br>
     <input type="radio" name="order" value="EMP_LASTNAME" checked>Nachname <br>  
     <input type="radio" name="order" value="EMP_FIRSTNAME">Vorname <br>
     <%-- <input type="radio" name="order" value="EMP_RANK">Arbeitsstatus <br>  
     <input type="radio" name="order" value="EMP_WORKSHIFT">Arbeitszeit<br> --%>
     </form>
     <br>
        

         <iframe scrolling="auto" height="520px" width="800px" frameborder="0" src="SearchResults.jsp"/>
```

Die Methode ProcessRequest ist unverändert. Also mit dem Auskommentiertem outputStream.
In der doPost Methode im Servlet habe ich dann folgendes gemacht:


```
@Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
        
        
        ArrayList<EmployeeBean> list=new ArrayList<EmployeeBean>();
        String message = "<br>";
        if (request.getParameter("name") != null) {
            message += "Suchergebnis:<br>";
            EmployeeGateway gateway = new EmployeeGateway();
            list = gateway.searchBy(request.getParameter("attribute"), request.getParameter("name"), request.getParameter("order"));
            for (int i = 0; i < list.size(); i++) {
                message += list.get(i).getFirstname() + " " + list.get(i).getName() + " (" + list.get(i).getGender() +
                        ")<br>" + list.get(i).getBirthday() + "." + list.get(i).getBirthmonth() + "." + list.get(i).getBirthyear() +
                        "<br>" + list.get(i).getStreet() + " " + list.get(i).getHousenumber() + " - " + list.get(i).getZip() + " " +
                        list.get(i).getCity() + "<br>" + "Arbeitsbeginn: " + list.get(i).getStartday() + "." + list.get(i).getStartmonth() +
                        "." + list.get(i).getStartyear() + "<br>" + list.get(i).getRank() + ": " + list.get(i).getWorkshift() + "<br>" + "|" +
                        list.get(i).getComment() + "|<br> <form action=\"SearchResults.jsp\"><input type=\"radio\" name=\"searchlist\" value=\"" + i + "\"></form><br>" +
                        "________________________________________<br><br>";}}
        HttpSession session=request.getSession();
        session.setAttribute("results", message);
        request.getRequestDispatcher("SearchEmployee.jsp").forward(request, response);
    }
```
Eine Methode findForward habe ich nicht gefunden.
und im Iframe dann folgendes:


```
<%=session.getAttribute("results")%>
```

Es wird mir aber trotzdem noch eine weiße Seite angezeigt.???:L


----------



## HLX (7. Jun 2009)

findForward war auch falsch. Da hab ich was mit Struts vermischt, sorry. Methode forward ist richtig.

Was macht die Methode processRequest?


----------



## Phenix (7. Jun 2009)

Im Moment macht sie eigentlich noch nichts. So wie sie halt default angelegt wird:


```
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet SearchServlet</title>");  
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet SearchServlet at " + request.getContextPath () + "</h1>");
            out.println("</body>");
            out.println("</html>");
            */

        } finally { 
            out.close();
        }
    }
```

Ich glaube ich hab den Sinn des RequestDispatchers in Verbindung mit der forward-Methode noch nicht verstanden sry. Also: Man holt sich den Request aus der Quelle (vorige Seite: JSP) oder? Das forward sorgt dann dafür, dass der weitergeleitet wird...aber wohin?


----------



## HLX (7. Jun 2009)

Es wird auf die JSP-Seite, die du in der Methode getRequestDispatcher angegeben hast weitergeleitet.

Mehr Infos:
Java 2 Platform EE v1.3: Interface RequestDispatcher

Die Methode processRequest brauchst du nicht, da die Erzeugung von HTML deine JSP-Ausgabeseite vornimmt. Du solltest sie entfernen.

Die action im Formular-Tag benötigt eine Angabe, welche Webanwendung auf dem Server (bzw. welcher ServletContext) angesprochen werden soll. Ändere dein Formular-Tag wiefolgt:

```
<form method="post" action="<%= request.getContextPath() %>/SearchServlet">
```


----------



## Phenix (15. Jun 2009)

Achja, sorry das ich so lange nicht geantwortet habe. Das Problem ist übrigens gelöst. Nochmal danke


----------

