# Probleme mit <jsp:include page=""/> und Laufzeit



## badewanne (23. Jun 2009)

Hallo,
ich habe noch keine Erfahrung mit JSPs und Servlets und folgendes Problem:

Ich habe eine JSP Seite "index.jsp" die drei andere Teile, "header.jsp", "footer.jsp" sowie ein Servlet "servlet/Show_all"einbindet.
Die Seite "index.jsp" besteht lediglich aus 3 include Befehlen:

```
<jsp:include page="modules/header.jsp"/>
<jsp:include page="servlet/Show_all"/>
<jsp:include page="modules/footer.jsp"/>
```

Das Problem ist dass das Servlet in diesem Fall immer nach dem Footer eingebunden wird, bzw. der Footer in einem <div class="inhalt"> steht der von dem Servlet erzeugt wird. Ich denke es hat etwas mit der Laufzeit zu tuen bzw. damit das ich den include-Befehl und wie ich wo, was, wie einbinden bzw. aufrufen kann noch nicht so ganz  verstehe.
Außerdem betreffen die icludes <jsp:include page="modules/header.jsp"/> und <jsp:include page="modules/footer.jsp"/>
ja andere jsp Seiten und mit <jsp:include page="servlet/Show_all"/> wird ja ein Servlet aufgerufen dessen Inhalt erst noch berechnet werden muss...

Kann mir vielleicht einer einen Hinweis geben, wie ich das Ergebnis des Servlet richtig einbinden kann?

Zur Vollständigkeit hier nocheinmal der Code der Seiten die included werden:


modules/header.jsp:

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
     "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>ilovestreams</title>
	<style type="text/css" media="all">
		@import "love.css";
	</style>
</head>
<body>
 <div id="header">
   <div id="user_status_aussen">
      <div id="user_status_innen">
      <a href="login.jsp">Log In</a> | <a href="signup.jsp">Sign Up</a>
         <div id="db_kontrollfeld">
	   <jsp:useBean id="dbKontrollfeld" class="sulobeans.DBcheck"/>
	   <% 
	      out.println(dbKontrollfeld.getDBTreiber());
              out.println(dbKontrollfeld.getDBConnection());	  	        
	      out.println(dbKontrollfeld.lookforTables()); 
	   %>       
	 </div>
       </div>   
       <div id="logo"><a href="http://myron.mt.haw-hamburg.de/~p23/index_ils2.jsp"><img src="img/ilovestreams_logo.gif"></a></div>
   </div>
 </div>
```

modules/footer.jsp:

```
<div id="footer">
<br><a href="http://myron.mt.haw-hamburg.de/~p23">zum index</a>
</div>
</body>
</html>
```

servlet/Show_all:

```
import java.util.*;
import java.io.*;
import java.sql.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.servlet.*;
import javax.servlet.http.*;


public class Show_all extends HttpServlet{

    public void doGet(HttpServletRequest req, HttpServletResponse res)
       throws ServletException, IOException
       {
    	   res.setContentType("text/html");
    	   PrintWriter out = res.getWriter(); 
	   int i = 0;
	   

	   //DB-Treiber
    	   try
    	   {
    		   Class.forName("org.gjt.mm.mysql.Driver");
		
    	   }
    	   catch( ClassNotFoundException e)
    	   {
    		   out.println("servlet/Show_all: MySQL-Treiber nicht gefunden!");
    	   }
    	   
    	   //Ausgabe Tabelle erzeugen
    	   try
    	   {
    		   Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/p23","p23","k57o");
		   Statement st = con.createStatement();

    		   try
    		   {
    		      st.executeQuery("select * from streamlist");
    		   }
    		   catch(Exception e)
    		   {
    		      out.println("Tabelle 'streamlist' nicht gefunden!");
    		   } 
    		   		      
    		   //DB-ABFRAGE
                   ResultSet rs = st.executeQuery("select * from streamlist");    
		   out.println("<div class='inhalt'>"); 						//div-css-klasse 'inhalt'
		   out.println("<table border='0' witdth='100%'>");					//ergebnistablle anlegen
		   out.println("<th>Streamname</th><th>Kategorie</th><th>Genre</th><th>Link</th>");	//kopfzellen benennen
	 	   		 		
                while(rs.next())
    	        {
			   
			   
	        //Ausgabeparameter
    	        String streamname = rs.getString("streamname");
    	        String streamurl  = rs.getString("streamurl");
	        String kategorie  = rs.getString("kategorie");
	        String genre      = rs.getString("genre");

  	        String trclass  = "";
                
	  
	        //zum colorieren der Zeilen abwechselnd mit CSS-Klassen versehen
	        if(i == 0){
	           trclass = "<tr class='tr_hell'>";
      	        }
	           else{
		      trclass = "<tr class='tr_dunkel'>";
		   }

	        out.println(trclass);
			   
	        out.println("<td>"+streamname+"</td>"+"<td>"+kategorie+"</td>"+"<td>"+genre+"</td>"+"<td><a href='"+streamurl+"'><img src='img/audio.gif' height='11px'></a></td>");
	        out.println("</tr>");
 	        
	        if(i == 0){
	           i = 1;
	        }
	        else{ 
		   i = 0;
		}	
    	}

    	           st.close();
    		   con.close();
		   out.println("</div>");					//ende div-css-klasse 'inhalt'
		 
		   
    }
    	   
    catch(Exception e){
       out.println ("MYSQL Exception");
       out.println("<br>");
    }
	   
   }
}
```


----------



## HLX (23. Jun 2009)

HTML-Ausgaben im Servlet sind sehr unübersichtlich, was durch die Vermischung mit JSPs noch schlimmer wird.

Du solltest deine Anwendung klar trennen: die Anwendungslogik im Servlet ausführen oder anstoßen, die Darstellung der Ergebnisse in den JSP-Seiten vornehmen.

Dazu ruftst du im Browser statt der 'index.jsp' als erstes das Servlet auf. Im Servlet führst du die nötigen Datenbank-Operationen aus und bindest die dynamischen Ergebnisse zur Ausgabe in der JSP-Seite an Request-Attribute:

```
request.setAttribute("name",wert);
```
Anschließend leitest du über den RequestDispatcher vom Servlet an deine "index.jsp" zur Darstellung der Ergebnisse weiter:

```
request.getRequestDispatcher("index.jsp").forward(request, response);
```

In der JSP-Seite kannst du die Request-Attribute auswerten.


----------



## badewanne (23. Jun 2009)

Danke für die schnelle Antwort, jetzt weiß ich schonmal wo ich hin will 
Mir ist blos nicht ganz klar wie vom Browser aus als erstes das Servlet aufrufen kann?


----------



## mvitz (23. Jun 2009)

badewanne hat gesagt.:


> Danke für die schnelle Antwort, jetzt weiß ich schonmal wo ich hin will
> Mir ist blos nicht ganz klar wie vom Browser aus als erstes das Servlet aufrufen kann?



in der web.xml mapped man das servlet auf eine url. Gibt dann jemand diese URL ein, so wird er an das Servlet "weitergeleitet".


----------



## badewanne (23. Jun 2009)

Ok, das wird dann sowas hier sein:

```
<!DOCTYPE Listing_4_16 PUBLIC
'-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
'http://java.sun.com/dtd/web-app_2_3.dtd'>

<servlet>
<servlet-name>MeinServlet</servlet-name>
<servlet-class>BidServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MeinServlet</servlet-name>
<url-pattern>/Auktion</url-pattern>
</servlet-mapping>
```

Mein eigentliches Problem scheint aber ein ganz anderes zu sein, nämlich der Umgang mit dem RequestDispatcher bzw. erstmal wie ich Attribute zwischen JSP und Servlet hin und her reichen kann. 
Ich mach dazu mal ein neues Thema auf - bzw. schaue  erstmal nach was ich im Forum finde... 

Vielen Dank!


----------



## mvitz (23. Jun 2009)

Hat HLX ja schon gezeigt, wie du Sachen im Servlet für die JSP vorbereitest.

In der JSP kannst du dann per EL drauf zugreifen. z.B.


```
request.setAttribute("name", wert);
```
-->

```
${name}
```


----------



## badewanne (23. Jun 2009)

irgendwie bekomme ich es nicht hin, bitte noch einmal für dummies...

angenommen in meinem servlet steht folgendes:

```
//Att_test.java

import java.util.*;
import java.io.*;
import java.sql.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.servlet.*;
import javax.servlet.http.*;


public class Att_test extends HttpServlet{

    public void doGet(HttpServletRequest req, HttpServletResponse res)
       throws ServletException, IOException{
    	   
    	   try{
    		   Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/p23","p23","k57o");
		   Statement st = con.createStatement();   
		   st.close();
    		   con.close();

		   req.setAttribute("name", "egbert");

           }   	   
           catch(Exception e){
           req.setAttribute("mysqlException", "MySQL-Exception");
           }
	   
   }
}
```
danach kompiliere ich das servlet und verschiebe es in meinen class ordner meines servers damit es unter dem pfad "servlet/Att_test" erreichbar ist.
was muss dann in meiner jsp alles stehen damit ich im browser den namen "egbert" ausgeben kann ?


----------



## mvitz (23. Jun 2009)

```
public class AttTest extends HttpServlet {

  public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    try{
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/p23","p23","k57o");
      Statement st = con.createStatement();   
      st.close();
      con.close();

      req.setAttribute("name", "egbert");
    } catch(Exception e) {
      req.setAttribute("mysqlException", "MySQL-Exception");
    }
      req.getRequestDispatcher("test.jsp").forward(req, res);
  }
}
```


```
<html><body><p>
  ${name}<br />
  ${mysqlException}
</p></body></html>
```

Sollte so gehen.


----------

