eine Klasse mit speziellem Parameter aufrufen und verwenden

JensMander

Bekanntes Mitglied
Hallo Community,
ein frohes und gesundes Jahr wünsche ich euch allen!
Ich habe folgendes vor:
Über den Webbrowser wird eine JSP-Datei aufgerufen die eine Karte zeigt. Wird in die Karte geklickt so startet ein Java-Servlet, welches die Koordinaten übergeben bekommt und diese auch wieder zurückgibt und in Inputfelder schreibt. Das Funktioniert auch so wie es soll (ich weiss man könnte sie direkt über Javascript einfach in die Felder schreiben, ist aber nicht gewollt).

Im zweiten Schritt habe ich eine Java-Klasse geschrieben in der eine Verbindung zur Datenbank aufgebaut wird , eine Abfrage gestartet wird und die DB wieder geschlossen wird.(FUnktioniert mit einer statischen Abfrage traumhaft)

Nun möchte ich gerne diese Abfrage über das Servlet ansprechen und ihr eine spezielle Abfrage übergeben. Das Ergebnis soll dann an Stelle der Koordinaten auf der der *.jsp zu sehen sein.

Leider bekomme ich es nicht hin die Datenbankabfrage in das Servlet zu integrieren und die Abfrage somit zu übermitteln.

Servlet:
Java:
public class db_abfrage_koordinaten extends HttpServlet {
	
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		{
			String hochwert = request.getParameter("hochwert");
			String rechtswert = request.getParameter("rechtswert");
			String abfrage = "SELECT station,distance(PointFromText('POINT("+hochwert+"  "+rechtswert+")', 900913),transform(the_geom,900913)) as b FROM weatherstations order by b limit 1";
			
			//Aufrufen der Datenbank aus database.java ????
			String Wetterstation=null;//Wert an Wetterstation übergeben
			
			response.setContentType("text/xml");
			PrintWriter out = response.getWriter();
			out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
			out.println("<test xmlns=\"http://java.sun.com/xml/ns/j2ee\">");
			out.println("<tag>");
			out.println(Wetterstation);
			out.println("</tag>");
			out.println("<tag>");
			out.println(rechtswert);
			out.println("</tag>");
			out.println("</test>");
		}
	}

}
Datenbankabfrage:
Java:
public class database
{
  String     driver     = "org.postgresql.Driver";
 
  // --------------------------------------------------------------------------
 
  String     host       = "localhost";            // !!! anpassen !!!
 
  String     port       = "5432";                 // !!! anpassen !!!
 
  String     database   = "postgis";             // !!! anpassen !!!
 
  String     user       = "post";                  // !!! anpassen !!!
 
  String     password   = "post";                  // !!! anpassen !!!
 
  // --------------------------------------------------------------------------
 
  Connection connection = null;
 
 
  /**
   * close the connection
   */
  private void closeConnection ()
  {
    try
    {
      connection.close ();
    }
    catch (SQLException e)
    {
      e.printStackTrace ();
      System.exit (1);
    }
 
    System.out.println ("\nconnection closed");
  }

  /**
   * @return Url-string for postgreSQL-database connection
   */
  private String getUrl ()
  {
    // PostgreSQL takes one of the following url-forms:
    // ================================================
    // jdbc:postgresql:database
    // jdbc:postgresql://host/database
    // jdbc:postgresql://host:port/database
 
    return ("jdbc:postgresql:" + (host != null ? ("//" + host) + (port != null ? ":" + port : "") + "/" : "") + database);
  }

  /**
   * loading the JDBC driver
   */
  private void loadJdbcDriver ()
  {
    try
    {
      Class.forName (driver);
    }
    catch (ClassNotFoundException e)
    {
      e.printStackTrace ();
      System.exit (1);
    }
 
    System.out.println ("driver loaded");
  }

  /**
   * opening the connection
   */
  private void openConnection ()
  {
    try
    {
      connection = DriverManager.getConnection (getUrl (),
                                                user,
                                                password);
    }
    catch (SQLException e)
    {
      e.printStackTrace ();
      System.exit (1);
    }
 
    System.out.println ("connection opened");
  }
  
  /**
   * show the weatherstation next to the coordinats
   */
  private String Wetterstation (String abfrage)
  {
	String wetterstation = null;
    try
    {
      Statement statement = connection.createStatement ();
      ResultSet resultSet = statement.executeQuery (abfrage);
      ResultSetMetaData resultSetMetaData = resultSet.getMetaData ();
      while (resultSet.next ())
      {
    	  wetterstation = resultSet.getString (1);
      }
      resultSet.close ();
      statement.close ();
    }
    catch (SQLException e)
    {
      e.printStackTrace ();
      System.exit (1);
    }
	return  wetterstation;
  }
  /**
   * Constructor
   */
  public void database (String abfrage)
  {
    loadJdbcDriver ();
    openConnection ();
    String Wetter = Wetterstation (abfrage);
    System.out.print(Wetter);
    closeConnection ();
  }
 
  public static void  main(String[] args)
  {
    EventQueue.invokeLater (new Runnable ()
    {
      public void run ()
      {
        database database = new database ();
 
        System.exit (0);
      }
    });
  }
}
 
Zuletzt bearbeitet von einem Moderator:
Java:
            //Aufrufen der Datenbank aus database.java ????
            String Wetterstation=null;//Wert an Wetterstation übergeben


na auf vollkommen normalen Wege wie man jede Methode irgendeiner beliebigen Klasse aufruft?
Java:
            database d = new database();
            // evtl. d.init(username, passwort) usw. oder auch im Konstruktor oder den Standard lassen
            String wetterstation= d.Wetterstation("select .."); // oder wie auch immer das zu bedienen ist
            // wetterstation verwenden

die Methode Wetterstation ist bisher private, vielleicht auch besser database(String abfrage) aufrufen,
dann nur dafür sorgen dass diese Methode am Ende den String zurückgibt,


sehr wichtig: Variablen + Methoden klein schreiben, Klassen groß!
und keine Methoden so nennen wie die Klasse!
es ist doch leicht sinnvolle Namen auszudenken, z.B. executeQuery(String query),
in diesem Fall nicht sehr originell da so ja auch die Methode von Statement heißt, aber besser gut geklaut als unverständliches hinzuschreiben 😉
 
Zuletzt bearbeitet von einem Moderator:
Hi vielen Dank, das wäre ja doch ziemlich einfach gewesen, ich hatte es auch schon so ähnlich ausprobiert, doch manchmal sind es eben winzige details.
Nun habe ich das ganze ineinander eingearbeitet, doch es funktioniert nicht.

Hier der Part mit der Einarbeitung:
Code:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		{
			String hochwert = request.getParameter("hochwert");
			String rechtswert = request.getParameter("rechtswert");
			String abfrage = "SELECT station,distance(PointFromText('POINT("+hochwert+"  "+rechtswert+")', 900913),transform(the_geom,900913)) as b FROM weatherstations order by b limit 1";
			
			//Aufrufen der Datenbank
			database d = new database();
			String wetterstation = d.database(abfrage);
			
			response.setContentType("text/xml");
			PrintWriter out = response.getWriter();
			out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
			out.println("<test xmlns=\"http://java.sun.com/xml/ns/j2ee\">");
			out.println("<tag>");
			out.println(hochwert);
			out.println("</tag>");
			out.println("<tag>");
			out.println(rechtswert);
			out.println("</tag>");
			out.println("</test>");
			
		}

In der database habe ich prinzipiell nichts geändert ausser der ein oder anderen Bezeichnung sowie des privat auf public gesetz.(Den Zugriff habe ich von einer auf die andere Klasse "trocken" getestet)

Hier mein Javascriptcode der das ganze aufruft:

Code:
function wetterstation(hochwert,rechtswert) {
    	var http = null; 
        http = new XMLHttpRequest();
        var dateiaufruf ='db_abfrage_wetterstation?hochwert='+hochwert+'&rechtswert='+rechtswert;
        http.open('GET',dateiaufruf,true);
        http.onreadystatechange = function()
              {
               if (http.readyState == 4)
               {
            	   document.getElementById("wetterstationen").value=http.responseXML.getElementsByTagName('tag')[0].firstChild.nodeValue;
                   //document.getElementById("hochwert").value=http.responseXML.getElementsByTagName('tag')[0].firstChild.nodeValue;
                   //document.getElementById("rechtswert").value=http.responseXML.getElementsByTagName('tag')[1].firstChild.nodeValue;
               }
              }
              http.send(null);
         }

Bei Eclipse bekomme ich jedoch folgende Fehlermeldung:
Code:
04.01.2011 12:14:04 org.apache.catalina.core.AprLifecycleListener init
INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Java\jdk1.6.0_18\jre\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Java/jre6/bin/client;C:/Java/jre6/bin;C:\PW;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;
04.01.2011 12:14:04 org.apache.coyote.http11.Http11BaseProtocol init
INFO: Initializing Coyote HTTP/1.1 on http-8081
04.01.2011 12:14:04 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 609 ms
04.01.2011 12:14:04 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
04.01.2011 12:14:04 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/5.5.29
04.01.2011 12:14:04 org.apache.catalina.core.StandardHost start
INFO: XML validation disabled
04.01.2011 12:14:04 org.apache.coyote.http11.Http11BaseProtocol start
INFO: Starting Coyote HTTP/1.1 on http-8081
04.01.2011 12:14:04 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8010
04.01.2011 12:14:04 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/62  config=null
04.01.2011 12:14:04 org.apache.catalina.storeconfig.StoreLoader load
INFO: Find registry server-registry.xml at classpath resource
04.01.2011 12:14:04 org.apache.catalina.startup.Catalina start
INFO: Server startup in 702 ms
java.lang.ClassNotFoundException: org.postgresql.Driver
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1438)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1284)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:169)
	at servlets.database.loadJdbcDriver(database.java:82)
	at servlets.database.database(database.java:156)
	at servlets.db_abfrage_wetterstation.doGet(db_abfrage_wetterstation.java:37)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:627)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:619)


Was hat es damit auf sich ich teste jetzt schon seit einiger Zeit, doch es hilft nichts*G*

vielen dank
 
der JDBC-Treiber ist eine separate Library, die sich im ClassPath der Ausführung befinden muss,
z.B. im lib-Verzeichnis eines WebServers,

ziemlich kompliziert solche Details hier im Forum zu klären, das ist was Richtung sauberen Setup,
hast du da lokale Unterstützung von irgendwem?
 
nein, ich habe die bei mir in meinem jdbc-ordner von postgres, aber soetwas habe ich mir schon gedacht, ich werde versuchen das in das lib-verzeichniss zu kopieren, mal schauen ob es dann funktioniert.
nein, habe keine echte Unterstützung hier-aber ich denke ich werde nach und nach besser, ist halt das erstemal das ich ein solch komplexes(aus meiner sicht) thema bearbeite und es scheint ab und an wirklich an deteils zu liegen, das ich scheitere.
vielen dank

p.s. hoffentlich feiert hansa dieses jahr die herbstmeisterschaft der zweiten liga
 
Hi,
ich habe nun alles soweit hinbekommen. Nun möchte ich gerne eine DB-Abfrage direkt auf einer JSP-Seite ausführen, sprich das Ergebniss soll gleich zu sehen sein.
Ich hatte mir das in etwa so gedacht:
Code:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%
String abfrage = "Select station from weatherstations";
database d = new database();
String wetterstation = d.database(abfrage);

%>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
</head>
<body>

</body>
</html>

Jedoch kann database d = new database() so nicht aufgerufen werden (database cannot be resolved to a type)

Das Ergebnis wollte ich eigentlich in einem Inputfeld anzeigen lassen, was muss ich tun damit mein Vorhaben funktioniert?

vielen Dank
 
JSP- Java Server Pages
Beispiel für die Verwendung:
Import
<%@ page import=“java.utils.* , mypackage.class“ %>
oder xml
<jsp:directive.page import=“java.utils.* , mypackage.class“ />

ich rate aber dringend davon ab, in JSPs irgendwelchen vermeidbaren Java-Code einzubauen,
Java gehört in ein Servlet, dieses stellt Daten aus beliebigen Quellen zusammen, übergibt sie strukturiert in Listen/ Beans/ sonstigen Objekten als Request-Attribute an die JSP,
diese kümmert sich allein um deren Anzeige, wenn möglich mit Tags & Co, notfalls mit minimalen Java-Code für Schleifendurchläufe usw.

aber das sind Grundsatzthemen für lange Bücher
 
Hi SlaterB,
mein Problem ist ich möchte gerne eine Select-Liste ausgeben. Der anzuzeigene INhalt befindet sich jedoch in einer Datenbank. Mit PHP habe ich das bereits gelöst, es ist aber eine JSP gewünscht. Ich weiß leider nicht wie ich ein Servlet ereignislos (button etc) starte.
Wenn ich die Select-Liste später nachlade ist das nicht ganz so kompliziert(eben über einen button),mir wäre es nur lieb, wenn diese Liste gleich von anfang an vorhanden wäre, ohne das etwas zusätzlich gestartet werden müsste.
mfg jens
 
jeder Request, ob nach Button oder von Bookmark oder in URL-Zeile eingetippt kann grundsätzlich bei einer JSP oder vorher in einem Servlet landen,
wenn man nicht gerade ein Framework hat welches dabei beschränkt ist (JSF)

aber auch das sind Grundsatzthemen,
deine Frage zum Import ist ja beantwortet, oder?
 

Zurück
Oben