# Problem / Fehler beim Einbinden einer Klasse in ein JSP



## Anuschka85 (5. Jan 2007)

Hallo zusammen,

bevor ich hier poste saß ich 2 Stunden an google, aber die Lösungsvorschläge bringen mich da leider auch nicht weiter. Vielleicht hat einer von euch eine Idee.

Hier mein Problem.
Ich möchte ganz einfach *gg* eine Klasse in ein JSP einbinden. 
Das das ganze funktioniert und ich keine Fehler in der Klasse habe, weiss ich weil wenn ich die Klasse in das JSP schreibe das ganze einwandfrei funktioniert. Dazu mein Beispielquelloce:

```
<%@ page import="java.util.*"%> 
 <%! 
 public class NewClass { 
    String uebergabe = ""; 
     /** Creates a new instance of NewClass */ 
     public NewClass() { 
     } 
     public void setName(String X) 
     { 
         uebergabe = X; 
     } 
       public String getName() 
     { 
           uebergabe = uebergabe + " kommt dazu "; 
         return uebergabe; 
     } 
      
 } 
 %> 
 <%String wert = request.getParameter("wichtig");%> 
 <% 
 Date myDate = new Date(); 
 NewClass nett = new NewClass(); 
 nett.setName(wert); 
 wert = nett.getName(); 
 out.println("Das ist der uebergebene Wert: " + wert +"
"); 
 %> 
 Das heutige Datum ist: <%= myDate%>
```

Da ich modular programmieren möchte, möchte ich meine Klasse auslagern.

```
public class NewClass { 
    String uebergabe = ""; 
     /** Creates a new instance of NewClass */ 
     public NewClass() { 
     } 
     public void setName(String X) 
     { 
         uebergabe = X; 
     } 
       public String getName() 
     { 
           uebergabe = uebergabe + " kommt dazu "; 
         return uebergabe; 
     } 
      
 }
```
Habe den oben stehenden Code in die NewClass.java gepackt und kompiliert.
Wie binde ich jetzt diese Klasse in mein JSP ein  und wo muss die Klasse liegen bei Tomcat 5.5.
Ich habe das Einbinden schon mit <%page import="" %> und mit <% include file=""%> getestet. Leider ohne Ergebnis.


```
<%@ page import="java.util.*"%> 
 <%!   WAS KOMMT HIER REIN ????                      %> 
 <%String wert = request.getParameter("wichtig");%> 
 <% 
 Date myDate = new Date(); 
 NewClass nett = new NewClass(); 
 nett.setName(wert); 
 wert = nett.getName(); 
 out.println("Das ist der uebergebene Wert: " + wert +"
"); 
 %> 
 Das heutige Datum ist: <%= myDate%>
```
Die Klasse habe ich dabei in den 
C:\Program Files (x86)\Apache Software Foundation\Tomcat 5.5\webapps\ROOT\WEB-INF\classes\
 Ordner gelegt.
Habe es aber auch in anderen Ordner probiert.

Leider komme ich an dieser Stelle nicht weiter.

Wäre lieb, wenn ihr mir den entscheidenen Tipp geben könntet.

LG Anuschka


----------



## SlaterB (5. Jan 2007)

> Habe es aber auch in anderen Ordner probiert. 

wie kannst du es überhaupt probieren, wenn du nicht weißt, was du als import schreiben musst?
ohne import wird es doch offensichtlich gar nicht funktionieren,
wenn selbst java.util.irgendwas importiert werden muss,

also:
die Klasse liegt in einem package mypackage,
dann lautet der import
import mypackage.*;
oder
import mypackage.MyClass;

ganz analog,
(also mit <%@ page, ohne Semikolon usw)
---------

die Klasse im richtigen Unterordner (zum package) im classes-Verzeichnis,
ganz normal wie alle Servlets usw (siehe Tutorials die Servlet-Klassen verwenden)
-------

wichtig: zu importierende Klassen müssen immer in einem package liegen,
in Java ist es nicht möglich, Klassen aus dem default-package (ohne package) zu importieren oder sonst wie anzusprechen


----------



## The_S (5. Jan 2007)

SlaterB hat gesagt.:
			
		

> also:
> die Klasse liegt in einem package mypackage,
> dann lautet der import
> import mypackage.*;
> ...



Kleine Anmerkung, da das imho unter Umständen missverständlich ist. importiert wird so:


```
<%@ page import="java.util.*, mypackage.*, java.text.DecimalFormat"%>
```

Um mal ein konkretes Beispiel in den Raum zu werfen  . Der Pfad zum package muss sich natürlich im Classpath befinden.


----------



## Anuschka85 (5. Jan 2007)

Erstmal danke für die Antworten leider hilft mir das nicht weiter.
Ich möchte meine Java Klasse NewClass.class einbinden.

wie mache ich das ? und in welches Verzeichnis beim Tomcat 5.5 muss ich die Klasse legen ?
Das ich Klassen mit import page einfüge war mir vorher auch schon klar, steht auch oben in meinem Post, dass ich es damit probiert habe.

Leider kann ich deiner Zeile nicht entnehmen, wie und wo ich meine eigene Klasse einbinden muss.
[/quote]


----------



## HLX (5. Jan 2007)

Wo du deine Klasse einbindest hängt nicht vom Tomcat ab. Deine Klassen gehören in deine Web-Anwendung. Die Struktur ist dabei immer gleich - für jede ServletEngine bzw. jeden AppServer.

Hier die Verzeichnisstruktur im Tomcat:

- CATALINA_HOME
-- webapps
--- <deineWebanwendung>
---- <deinJspOrdner>
----- test.jsp
---- WEB-INF
----- classes
------ <packageDerKlasse>
------- NewClass.class
----- <lib>
----- web.xml

Alternativ kannst du deine Klasse auch in ein JAR-Archiv packen und in den Ordner WEB-INF/lib legen.


----------



## Anuschka85 (5. Jan 2007)

Danke für die ausführliche Antwort.
Genauso habe ich es probiert aber leider funktioniert es nicht.

Kann es vielleicht an nichtgesetzen Umgebungsvariablen liegen ?

ich kann http://localhost:8080 aufrufen und das funktioniert auch genauso wie das Aufrufen der JSPs. aber kann es vielleicht sein, dass ich den Compiler oder ähnliches manuell  noch einstellen muss ?


----------



## HLX (5. Jan 2007)

Welche Fehlermeldung wird in der Tomact-Konsole bzw. in der Log-Datei angegeben?

Log-Datei 'catalina_log.<datum>.txt' liegt in CATATLINA_HOME\logs.


----------



## Anuschka85 (5. Jan 2007)

Die Dateien (Klassen) liegen 
a) im Ordner /Common/
b) webapps/ROOT/classes/
c) webapps/ROOT/WEBINF/classes/

Beim Aufrufen des JSPs bekomme ich folgende Fehlermeldung
Folgenden Code rufe ich auf - das was in der Klasse stehen soll:

```
<%@ page import="java.util.*"%> 
 <%@ page import="NewClass.class"%> 
 <%String wert = request.getParameter("wichtig");%> 
 <% 
 Date myDate = new Date(); 
 NewClass nett = new NewClass(); 
 nett.setName(wert); 
 wert = nett.getName(); 
 out.println("Das ist der uebergebene Wert: " + wert +"
"); 
 %> 
 Das heutige Datum ist: <%= myDate%>
```

Folgende Fehlermeldung steht dann da:

```
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP

Generated servlet error:
Syntax error on token "class", Identifier expected

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type


	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

org.apache.jasper.JasperException: Unable to compile class for JSP

Generated servlet error:
Syntax error on token "class", Identifier expected

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type


	org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
	org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
	org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:414)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.
```


----------



## HLX (5. Jan 2007)

> ```
> <%@ page import="NewClass.class"%>
> ```



Wie schon oben beschrieben wurde: das funktioniert so nicht! Die JSP-Datei ist fehlerhaft und kann nicht zu einem Servlet kompiliert werden: org.apache.jasper.JasperException: Unable to compile class for JSP

Das 'class' muss hinten weg und die Klasse muss in ein Package!


```
<%@ page import="neuesVonDirErstelltesPackage.NewClass"%>
```


----------



## Anuschka85 (5. Jan 2007)

so jetzt nochmal, so wie du es beschrieben hast: ;-)


```
<%@ page import="java.util.*"%>
<%@ page import="NewClass"%>
<%String wert = request.getParameter("wichtig");%>
<%
Date myDate = new Date();
NewClass nett = new NewClass();
nett.setName(wert);
wert = nett.getName();
out.println("Das ist der uebergebene Wert:" + wert +"
");
%>
Das heutige Datum ist: <%= myDate%>
```

Und nun nochmal die Fehlermeldung die er mir dann bringt


```
description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP

Generated servlet error:
The import NewClass cannot be resolved

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type


	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

org.apache.jasper.JasperException: Unable to compile class for JSP

Generated servlet error:
The import NewClass cannot be resolved

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type


	org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
	org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
	org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:414)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
```


----------



## HLX (5. Jan 2007)

Anuschka85 hat gesagt.:
			
		

> so jetzt nochmal, so wie du es beschrieben hast: ;-)
> 
> 
> ```
> ...



So hab ich´s sicher nicht beschrieben.  :noe: 

Dir bereitet das Package Schwierigkeiten?  :wink:  
Ganz einfach:
1. Klasse in einen Ordner packen
2. Klasse öffnen und package deklarieren mit

```
package <ordnername>;
```
3. Page-Import in der JSP-Datei anpassen
4. fertig


----------



## Anuschka85 (5. Jan 2007)

danke. verstehe zwar nicht warum es unbedingt in nem package sein muss aber okay.
ich habs jetzt so gemacht:

class:

```
package date;
/**
 *
 * @author Administrator
 */
public class NewClass {
   String uebergabe = "";
    /** Creates a new instance of NewClass */
    public NewClass() {
    }
    public void setName(String X)
    {
        uebergabe = X;
    }
      public String getName()
    {
          uebergabe = uebergabe + " kommt dazu ";
        return uebergabe;
    }
    
}
```

jsp

```
<%@ page import="java.util.*"%>
<%@ page import="date.NewClass"%>
<%String wert = request.getParameter("wichtig");%>
<%
Date myDate = new Date();
NewClass nett = new NewClass();
nett.setName(wert);
wert = nett.getName();
out.println("Das ist der uebergebene Wert:" + wert +"
");
%>
Das heutige Datum ist: <%= myDate%>
```

jetzt bekomm ich zwar ne andere fehlermeldung aber eben immer noch eine:

```
description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP

Generated servlet error:
Only a type can be imported. date.NewClass resolves to a package

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type


	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

org.apache.jasper.JasperException: Unable to compile class for JSP

Generated servlet error:
Only a type can be imported. date.NewClass resolves to a package

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type

An error occurred at line: 4 in the jsp file: /date.jsp
Generated servlet error:
NewClass cannot be resolved to a type


	org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
	org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
	org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:414)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
```

scheinbar steh ich irgendwie auf dem schlauch


----------



## HLX (5. Jan 2007)

Ok. Wie sieht aktuell Verzeichnisstruktur der Web-Anwendung aus?


----------



## Anuschka85 (5. Jan 2007)

die jsp datei liegt in folgenden Ordner:
C:\Program Files (x86)\Apache Software Foundation\Tomcat 5.5\webapps\ROOT\
date.jsp

und die klasse liegt in dem:
C:\Program Files (x86)\Apache Software Foundation\Tomcat 5.5\webapps\ROOT\WEB-INF\classes\date

ich hatte es vorher mit
C:\Program Files (x86)\Apache Software Foundation\Tomcat 5.5\webapps\ROOT\WEB-INF\date

probiert brachte aber auch eine fehlermeldung.


----------



## SlaterB (5. Jan 2007)

das sieht eigentlich alles richtig aus,
eine google-Suche bestätigte mich darin
http://www.myeclipseide.com/index.php?name=PNphpBB2&file=viewtopic&p=48978
http://archives.java.sun.com/cgi-bin/wa?A2=ind0507&L=jmx-forum&P=3912
(dort gleiches Problem, bei einem anderen läufts, nach Neuversuch/ Neuinstallation auch bei Fragestellern)


allgemeiner Tipp: nie sowas selber ausprobieren,
mit einem Tutorial und fertigen Klassen anfangen!
wenn die auch nicht gefunden werden, dann liegt es zumindest nicht an dir
(sondern an allgemeiner Konfiguration oder fehlerhafter Installation)

leider habe ich gerade keinen passenden Link und auch nix auf die Schnelle bei google gefunden, muss es aber doch geben,
zumindest dann Anleitungen zum selber erstellen,
wie gesagt: Servlets statt JSPs, Servlets sind normale Java-Dateien im classes-Ordner


----------



## HLX (5. Jan 2007)

Tja, da kann man nur noch raten/rumprobieren. Irgendwo ist ne Kleinigkeit nicht ok. Dies ist allerdings aus deinen Angaben nicht ersichtlich   

- Tomcat mal zwischenzeitlich neu gestartet?
- "versehentlich" auch die Dateiendung von der eigentlichen Klasse entfernt statt nur in der Import-Direktive?
...

Ich würde das Ganze mal als separate WebApp ausprobieren statt den vorhandenen ROOT-Ordner zu verwenden.

Viel Erfolg!


----------



## SlaterB (5. Jan 2007)

apropos vergessen: es muss eine kompilierte .class-Datei vorhanden sein, 
nicht der Quelltext (.java-Datei)


----------



## Anuschka85 (5. Jan 2007)

Hi danke für den Tipp.

ich habe Tomcat deinstalliert und neu installiert. aber leider kommt die Fehlermeldung immer noch.

Den Jasper.Compiler wird der mit Tomcat 5.5 automatisch installiert und müsste auch laufen ????

p.s. das ich die java datei vorher mit javac kompilieren muss ist mir klar ;-) aber danke nochmal für den hinweis


----------



## SlaterB (5. Jan 2007)

normale JSPs ohne import werden doch wohl kompiliert? 

wenn du es noch mal mit dem verschieben probieren willst:
kopiere das was in classen drin ist (also den obersten package-Ordner) dahin wo die JSP liegt,
und auch mal ins bin-Verzeichnis von Tomcat,
vielleicht werden die Klassen dort gefunden,




was kommen übrigens für Fehlermeldungen, wenn du

import sljsfdljdfs

und

import richtigesPackage.gddslkjfdhjl

versuchst?
die gleichen oder andere? das wäre ein Hinweis darauf, ob das package/ die Klasse gefunden und falsch interpretiert 
oder gar nicht erst gefunden wird
(die Fehlermeldung selber sagt ja nicht viel..)


----------



## Anuschka85 (5. Jan 2007)

Die Fehlermeldung ändert sich nicht egal ob ich

da date.NewClass oder date.NewClasses hinschreibe,

also vermute ich dass er die Klasse gar nicht erst findet

wenn ich es in dem selben ordner wie die jsp liegen habe, dann bringt er immer noch die Fehlermeldung
(ich habe den gesamten date ordner - also das package- zu der jsp gepackt)

wenn ich es in den bin Ordner von Tomcat lege, ändert es leider auch nichts.

Trotzdem danke für die Ideen


----------



## Anuschka85 (5. Jan 2007)

Also jetzt läuft es bei mir. Aber ne wirkliche Lösung habe ich auch nicht.

Ich kann nur posten was ich gemacht habe.

Also ich habe nochmal den Tomcat deinstalliert und neu installiert. Habe dann das package als erstes in den bin ordner vom Tomcat getan und dann den Tomcat gestartet.
Ich bekam wieder die Fehlermeldung.
Also Tomcat wieder ausgemacht, das Package dann in den ROOT Ordner, dort wo auch die JSP Datei liegt, gepackt,
Tomcat wieder gestartet. 
Wieder die Fehlermeldung.

Also Tomcat wieder ausgemacht, das Package in C:\Program Files (x86)\Apache Software Foundation\Tomcat 5.5\webapps\ROOT\WEB-INF\classes gelegt, Tomcat wieder neu gestartet 

Jetzt läuft es. Habe zur Sicherheit dass es nicht nur wieder sporadisch wie vorher ist, den Tomcat zwischendurch noch 3 mal neu gestartet, aber es läuft immer noch zuverlässig.

Verstehen tue ich es allerdings auch nicht wirklich. Weil wir es vorher ja auch schon so probiert haben.


----------

