Zum Inhalt springen

JSP: Java-Class einbinden und benutzen


Empfohlene Beiträge

Geschrieben

Hi Leutz.

Also, ich hab n kleines Problem, das auch googlen nicht lösen konnte. In meiner JSP-Datei möchte ich nun auch obj.-or. programmieren und dafür Klassen einbinden. Leider funktioniert das nicht so, wie ich es gerne hätte.

Folgend erstmal die JSP-Datei. Über den Nutzen brauchen wir uns nicht streiten.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Marci.de | Startseite</title>

</head>

<body>

<%@ page import = "Klassen.*" %>


	Willkommen auf meiner Seite

<%

	Testing test = new Testing();

	test.print();

%>

</body>

</html>
Und um sie euch nicht vorzubehalten natürlich auch noch die ominöse Testing Klasse:
package Klassen;


public class Testing 

{

 public void print()

 {

	 System.out.println("Es funktioniert");

 }

}

Wie ihr merkt, ist Testing mehr als wörtlich zu nehmen.

In der JSP-Datei hatte ich auch bei Import bereits Klassen.Testing versucht, jedoch gibt er mir folgende Exception:

Only a type can be imported. Klassen.Testing resolves to a package

Auch das Umwandeln der print()-Methode in eine static Mehtode mit folgenden Aufruf Testing.print(); hat nicht funktioniert.

Ich danke euch, wenn ihr mir helfen könnt. Wenn nicht, dann trotzdem danke für eure Mühen.

P.S.:

System:

Windows XP Prof. SP3

frisch aktualisierte Eclipse-version

Tomcat 6.0.18 (nach meinen Einschätzungen richtig konfiguriert ;) )

Geschrieben

Also Script-Blöcke in einer JSP solltest Du auf jeden Fall vermeiden. Verwende hier besser im einfachsten Fall ein vorgeschaltetes Servlet und verweise aus diesem heraus auf Deine JSP. Das Servlet macht die Logik, die JSP zeigt die Ergebnisse an (Model2 Architektur).

An Deinem Beispiel kann ich auf den ersten Blick nichts falsches erkennen. Was ist denn der Fehler? Wenn Du erwartest, dass Deine Klasse etwas in das Ergebnis schreibt, musst Du sie ändern, denn sie loggt nur in den Standardausgabestrom.

Peter

Geschrieben (bearbeitet)

Danke für die schnelle Antwort.

Hab die Methode eben umgestellt, wieder nur zu Testzwecken. Danke für den Tipp mit den Servlets, hatte schon daran gearbeitet.

Der Fehler sieht wie folgt aus:

HTTP Status 500 -


type Exception report


message


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


exception


[B]org.apache.jasper.JasperException: Unable to compile class for JSP: [/B]


An error occurred at line: 6 in the generated java file

[B]Only a type can be imported. Klassen.Testing resolves to a package[/B]


An error occurred at line: 14 in the jsp file: /start.jsp

Testing cannot be resolved to a type

11: 

12: Willkommen auf meiner Seite

13: <%

14: 	Testing test = new Testing();

15: 	test.print();

16: %>

17: </body>



An error occurred at line: 14 in the jsp file: /start.jsp

Testing cannot be resolved to a type

11: 

12: Willkommen auf meiner Seite

13: <%

14: 	Testing test = new Testing();

15: 	test.print();

16: %>

17: </body>



Stacktrace:

	org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)

	org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)

	org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:423)

	org.apache.jasper.compiler.Compiler.compile(Compiler.java:317)

	org.apache.jasper.compiler.Compiler.compile(Compiler.java:295)

	org.apache.jasper.compiler.Compiler.compile(Compiler.java:282)

	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)

	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)

	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)

	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)

	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


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

Hab's mal nicht gekürzt, vllt. überseh ich einfach was... habe die zeilen markiert, welchen ich besondere Beachtung geschenkt habe.

btw: Methode printed nicht mehr, sondern returned einfach den String.. dann mach ich das über out.println(test.print());

Info: Die Klasse liegt im package Klassen, daher die markierte Zeile. Google meinte, mit import etc. kann das package direkt angesprochen werden, daher verwirrt mich die Exception.

Wie gesagt, ist alles sehr spartanisch, weil ich erst nach der Lösung anfange den eigentlichen Code zu schreiben. Muss halt nur auf andere Klassen zugreifen können.

Danke nochmal und ich hoffe, man kann mir helfen. :)

Marcel

Bearbeitet von Vandahil
Geschrieben

Ergänzung:

Die vorliegende Fehlermeldung wird von Mozilla ausgespuckt.

Wenn ich den Server und die index.jsp mit Eclipse starte, funktioniert das Script und liefert mir den return-wert.

Jedoch scheint dies nicht für den Browser zu gelten.

Geschrieben

Hmm, so ganz schlüssig ist mir Deine Beschreibung nicht.

Mozilla gibt Dir diesen Fehler zwar zurück, aber auftreten tut er in Deinem Servlet Container. Welchen verwendest Du denn hier (der Stacktrace sieht nach Tomcat aus)?

Kann es sein, dass Du neben der Klasse "Testing" auch ein Package "Testing" hast? Ist zwar sehr unwahrscheinlich, aber so hört es sich für mich in der Fehlermeldung an.

Du sagst, in Eclipse klappt es? Wie meinst Du das? Du startest die Servlet Engine aus Eclipse heraus und öffnest die Seite über den integrierten Browser?

Zeig doch mal bitte die komplette JSP und die komplette Java-Datei, die der Tomcat erzeugt (liegt im work-Verzeichnis, musst ein bisschen suchen).

Peter

Geschrieben (bearbeitet)

Ok, versuche das nochmal schlüssig zu erklären: :)

Benutze wie gesagt Tomcat 6.0.18

Wenn ich den tomcat "normal" mit der startup.bat starte, spreche ich die Seite in Mozilla über localhost:8080/Marci/ an und komme dort auf die index.jsp

Diese spuckt mir sofort die obige Exception aus.

Die Exception wird im dortigen iframe angezeigt, in der die start.jsp aufgerufen wird. Also wird der fehler nicht von der index.jsp verursacht, falls der gedanke aufkommen sollte. ^^

Wenn ich den Tomcat nicht mit der bat starte, sondern stattdessen die index.jsp über den Compilieren-Knopf von Eclipse starte, zeigt mir der interne Browser die Seite richtig an und printed mir auch den return-Wert der Funktion.

Eine Testing-package existiert nicht. ;)

Weiß nicht, ob ich noch was ergänzen soll, wenn noch was fehlt dann frag ruhig. =)

Folgende Dateien liegen in \work\Catalina\localhost\Marci\org\apache\jsp\

body_jsp.java

index_jsp.java

start_jsp.java

body_jsp.class

index_jsp.class

Wie mir auffällt, fehlt die start_jsp.class. Dies ist auch die JSP-Datei, welche den Fehler verursacht. Vermutlich ist dies auch auf den Fehler zurückzuführen.

Inhalt der start_jsp.java (Die restlichen jsp's funktionieren ja.. kann ich bei Bedarf auch posten)

package org.apache.jsp;


import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;


public final class start_jsp extends org.apache.jasper.runtime.HttpJspBase

    implements org.apache.jasper.runtime.JspSourceDependent {


  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();


  private static java.util.List _jspx_dependants;


  private javax.el.ExpressionFactory _el_expressionfactory;

  private org.apache.AnnotationProcessor _jsp_annotationprocessor;


  public Object getDependants() {

    return _jspx_dependants;

  }


  public void _jspInit() {

    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();

    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());

  }


  public void _jspDestroy() {

  }


  public void _jspService(HttpServletRequest request, HttpServletResponse response)

        throws java.io.IOException, ServletException {


    PageContext pageContext = null;

    HttpSession session = null;

    ServletContext application = null;

    ServletConfig config = null;

    JspWriter out = null;

    Object page = this;

    JspWriter _jspx_out = null;

    PageContext _jspx_page_context = null;



    try {

      response.setContentType("text/html; charset=ISO-8859-1");

      pageContext = _jspxFactory.getPageContext(this, request, response,

      			null, true, 8192, true);

      _jspx_page_context = pageContext;

      application = pageContext.getServletContext();

      config = pageContext.getServletConfig();

      session = pageContext.getSession();

      out = pageContext.getOut();

      _jspx_out = out;


      out.write("\r\n");

      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");

      out.write("<html>\r\n");

      out.write("<head>\r\n");

      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n");

      out.write("<title>Marci.de | Startseite</title>\r\n");

      out.write("</head>\r\n");

      out.write("<body>\r\n");

      out.write("\r\n");

      out.write("Willkommen auf meiner Seite\r\n");


	Klassen.Testing test = new Klassen.Testing();

	out.println(test.print());


      out.write("\r\n");

      out.write("</body>\r\n");

      out.write("</html>");

    } catch (Throwable t) {

      if (!(t instanceof SkipPageException)){

        out = _jspx_out;

        if (out != null && out.getBufferSize() != 0)

          try { out.clearBuffer(); } catch (java.io.IOException e) {}

        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);

      }

    } finally {

      _jspxFactory.releasePageContext(_jspx_page_context);

    }

  }

}

Hoffe, das ist das, was du meintest.

Danke für deine Hilfe.

Bearbeitet von Vandahil
Geschrieben

So, ich habe das jetzt selbst mal ausprobiert. Bei mir funktioniert es. Allerdings fühle ich mich jetzt nach der Codierung von Skriptcode in der JSP ziemlich schmutzig und möchte gerne duschen. :)

Wie deployst Du denn Deine Anwendung? Hast Du ein WAR und steckt in diesem WAR auch Deine kompilierte Klasse "Testing" im korrekten Package? Der Aufbau sollte so sein:


WAR

  start.jsp

  WEB-INF

    classes

      Klassen

        Testing.class

Und das es keine start.class gibt ist klar, weil er ja beim Compile rumzickt. Die von dir gepostete Klasse sieht übrigens nicht nach der aus, die er anmeckert, weil dort die Zeile 6 leer ist. Laut Stacktrace soll hier aber der Fehler stecken.

Peter

Geschrieben

So, bei mir funktioniert es jetzt auch.

Manchmal sieht man den Wald vor lauter Bäumen nicht...

Hab auch als *.war deployed and it works...

Vorher hab ich's über die Pfadangabe in Server.xml versucht... wie man sieht ohne Erfolg ^^'

Danke dir aber auf jeden für deine Hilfe.

Kriegst n Knutscher

:D

Grüße, Marcel

PS: Sorry, dass du wegen mir duschen musstest ;D

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...