# JDBC und JSP



## rorton (11. Mai 2011)

Hallo Leute,

ich bin dabei einen kleines projekt umzusetzen.

Ich habe eine JSP-Seite mit einem Suchformular, wo man nach Filmtiteln suchen kann. Wenn man ins Formular einen Titel eingibt, wird in der Datenbank(Postgres) gesucht und die entsprechenden Ergebnisse werden in einer JSP dargestellt. Das funktioniert alles schon soweit. 

Nun ist es aber so, das jeder Filmtitel in einer JSP dargestellt werden kann, so ähnlich wie ein Profil auf Facebook. Also Titel, Schauspieler, u.u.u. 
Ich möchte das mit meiner Suche verbinden. Das heißt wenn ich wie oben beschrieben einen Titel eingebe und ein Ergebnis erscheint, dass sich mit Klick auf den Titel die jeweilige JSP des Filmes aufbaut. 
Kann mir von euch jemand den Ablauf erklären wie ich da am besten vorgehe??

DANKE! 

LG


----------



## SlaterB (12. Mai 2011)

was immer du in der Übersicht, in der Ergebnisliste oder wo auch immer auf der Welt als HTML darstellst,
kann als Bild oder Text direkt mit einem Link unterlegt werden, notfalls ein Button daneben, der Link z.B. mit der Id des Films
-> eine neue Seite wird geöffnet, ein neuer Request den der Server genau so verarbeitet dass das richtige dargestellt wird

diese Sätze gelten im Grunde für alles in Webanwendungen, für beliebige Frameworks, so könnte man auch in PHP antworten,
das hat kaum was mit Java, JSP, schon gar nicht mit Datenbank zu tun,

schaue dir Lehrbücher, Tutorials, Beispielanwendungen zu Webprogrammen an, um dafür ein Gefühl zu entwickeln,
das kann in einem Forum nicht komplett aufgezählt werden

zwei Tipps:
- keinerlei Logik/ Java-Code in JSPs, dafür gibts Servlet oder je nach Framework andere echte Java-Klassen
- verzichte zunächst auf die Datenbank, arbeite mit Dummy-Daten, mit einer statischen Liste/ Map an vorgegebenen Film-Objekten,
die du per for-Schleife durchläufst und mit der gesuchten Id oder Namen ganz normal vergleichst
(==, equals, contains)


----------



## rorton (14. Mai 2011)

Erstmal danke für die Antwort, hat mich schon sehr viel weiter gebracht! 

Ich möchte aber auf deine Antwort mit Snippets von mir eingehen, wo vielleicht Verbesserungsbedarf besteht:

Also, ich komme von meinem Suchformular, wo ich einen Filmtitel eingebe, zu einem Servelt. Das Servlet leitet den Suchbegriff an eine Java-Klasse weiter, die sich um die JDBC-Verbindung und den SQL-Query kümmert:

Query.java

```
public void findTitle()
	  {
	    try
	    {
	      Statement statement = connection.createStatement ();
	 
	      ResultSet resultSet = statement.executeQuery ("select * from movies where title = " + "'" + searchPattern + "'");
	      
	      if (resultSet.next()) {  
	    	  do { 
	    		StringBuilder builder = new StringBuilder();
		    	builder.append(resultSet.getString("title"));
		    	builder.append(" ");
		    	builder.append(resultSet.getString("id"));
		    	queryCollection.add(builder.toString());//ArrayList zum Speichern der Daten
		      } while (resultSet.next()); 
	      } 
	      else {  
			  String s = "Sorry, no matches found!";
	    	  queryCollection.add(s);
	      }
	      
	      resultSet.close ();
	      statement.close ();
	    }
	    catch (SQLException e)
	    {
	      e.printStackTrace ();
	      System.exit (1);
	    }
	  }

//gibt die gesamten Querydaten zurück
public List<String> getQueryCollection() {
		return queryCollection;
	}
```

Das Servlet leitet die gefundenen Werte mit Hilfe der getQueryCollection() weiter:

SearchServlet.java

```
//ArrayList im Servlet holt sich die Collection der SQL Klasse
            queryCollection = query.getQueryCollection();
		
            //für das JSP
	    request.setAttribute("query", queryCollection);
	    RequestDispatcher view = request.getRequestDispatcher("result.jsp");
	    view.forward(request, response);
```

Im JSP schauts derzeit so aus, wo ich aber das Problem habe, das ich die ganzen Daten auf einen Haufen rausschreibe.. Ich möchte aber jeden Titel einzeln als Link inklusive Value die ID des Titels haben...

result.jsp

```
<p><%
List<String> queryCollection = (List<String>) request.getAttribute("query");
Iterator<String> iterator = queryCollection.iterator();
while(iterator.hasNext()) {
	out.print(iterator.next() + " " + "<br/>");
}
%>
</p>
```

wie bekomme die Daten der Abfrage alle einzeln als Link in die JSP.. Ich glaub mein Ansatz oben ist sehr steif und kompliziert!


----------



## SlaterB (14. Mai 2011)

schau dir irgenwelche Beispiele auf der Welt an, allein den Quellcode einer Seite dieses Forums hier um zu lernen was die Sprache HMTL ausmacht,
suche z.B. nach SQLException, denn dieser Text wird in deinem Posting als Link dargestellt

ein Link hat einen anzuzeigenden Text, aber auch einen <a href >-Tag, eine URL, in welche die Id als Parameter gehört usw.,
das kann man mit entsprechenden Aufwand alles manuell zusammenbauen (evt. im Servlet vorbereiten, in der JSP nur ausgeben)
oder man nutzt Hilfsmittel für JSP wie JSTL,
all das lernt man aber über Monate in Büchern mit 100 bis 4.2 Mio. Seiten, ich nenne keine weiteren Details


----------



## rorton (14. Mai 2011)

Alles klar, danke für die Hilfestellung. 
Ich hänge derzeit bei dem für dich sicher einfachen Problem! Ich bekomme die JasperException nicht weg! Was mache ich falsch?

Servlet.java

```
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String s = request.getParameter("query");
		
		databaseConnection.loadJdbcDriver();
		connection = databaseConnection.openConnection();
		
		try
	    {
	      Statement statement = connection.createStatement ();
	 
	      ResultSet resultSet = statement.executeQuery ("select * from movies where title = " + "'" + s + "'");
	      
	      beanList = new ArrayList<MovieBean>();
	      
	      if (resultSet.next()) {  
	    	  do { 
	    		bean = new MovieBean();
		    	bean.setTitle(resultSet.getString("title"));
		    	beanList.add(bean);
		      } while (resultSet.next()); 
	      } 
	      else {  
			 resultSet.close ();
			 statement.close (); 
	      }
	      
	      
	    }
	    catch (SQLException e)
	    {
	      e.printStackTrace ();
	      System.exit (1);
	    }
	    
	    databaseConnection.closeConnection();
		
	    request.setAttribute("beanList", beanList);
	    
	    RequestDispatcher view = request.getRequestDispatcher("result.jsp");
	    view.forward(request, response);
	}
```

result.jsp

```
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
......

</p>

<c:forEach var="bean" items="beanList">
 <c:out value="${bean.title}"/>
</c:forEach>   
<p>
```


MovieBean.java

```
public class UserBean implements Serializable {
	
	private static final long serialVersionUID = 1L;
	private String title;
	
	public MovieBean() {}
	
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}
```


----------



## SlaterB (14. Mai 2011)

ich wüßte zu keiner JasperException der Welt etwas zu sagen,
vielleicht wenn du sie komplett postest, da wird doch wohl nicht
[c]JasperException[/c]
stehen, sondern

```
JasperException: x ist wrong in y weil z und folgende 30 Informationen sind auch alle wichtig, 
falls du jemand anders von mir erzählst
```
?!

------

edit:
> public MovieBean() {}
in einer Klasse, die nicht MovieBean heißt, ist natürlich Blödsinn,
das wird dir aber hoffentlich ein Java-Compiler direkt sagen, nicht irgendeine komplizierte Web-Anwendung


----------



## rorton (14. Mai 2011)

die Exception verweißt auf Zeile 157, ich wüßte aber nicht was dabei nicht stimmt!


```
org.apache.jasper.JasperException: An exception occurred processing JSP page /searchresult.jsp at line 157

154: <p>                           
155: </p>
156: <c:forEach var="bean" items="beanList">
157:  <c:out value="${bean.lastname}"/>
158: </c:forEach>   
159: <p><br /></p>
160: <p><br /></p>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:519)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:428)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at.fhj.controller.QuickSearchServlet.doPost(QuickSearchServlet.java:93)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause

javax.el.PropertyNotFoundException: Property 'lastname' not found on type java.lang.String
	javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:214)
	javax.el.BeanELResolver$BeanProperties.access$400(BeanELResolver.java:191)
	javax.el.BeanELResolver.property(BeanELResolver.java:300)
	javax.el.BeanELResolver.getValue(BeanELResolver.java:81)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	org.apache.el.parser.AstValue.getValue(AstValue.java:123)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:938)
	org.apache.jsp.searchresult_jsp._jspx_meth_c_005fout_005f0(searchresult_jsp.java:331)
	org.apache.jsp.searchresult_jsp._jspx_meth_c_005fforEach_005f0(searchresult_jsp.java:300)
	org.apache.jsp.searchresult_jsp._jspService(searchresult_jsp.java:217)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at.fhj.controller.QuickSearchServlet.doPost(QuickSearchServlet.java:93)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
```


----------



## mvitz (14. Mai 2011)

Versuche anstelle von "beanList" mal "${beanList}"


----------



## rorton (14. Mai 2011)

genau das wars, danke! :toll:


----------

