Lassen sich Servlets aus JSPs heraus ausrufen?

MichiM

Mitglied
Hallo,

lassen sich Servlets aus JSPs heraus ausrufen?

Ich kann im Eclipse sowohl Servlets als auch JSPs anlegen, umwandeln und im Brower (http://localhost:8080/...) fehlerfrei betrachten.

Wie schaffe ich es nun, aus einer Java Server Page heraus ein eigenes Servlet aufzurufen? (Wenn das überhaupt geht, denn kein Beispiel dafür habe ich noch nicht gefunden und ich dachte mir, dass gerade das ja den Reiz ausmacht? :) )

<%= (new MyServlet... ) %>
reicht scheinbar noch nicht, wie ich beim Probieren festgestellt hab.

Meine Projektstruktur vom Projekt "MyFirstJSP" im Eclipse schaut so aus:

HelloJSP.jsp
WEB-INF/src/HalloServlet.java
WEB-INF/web.xml

Inhalte:


HelloJSP.jsp:
_______________________________________________________________________
<%@ page import="java.text.*" %>
<%@ page import="java.util.*" %>

<html>
Hallo, meine erste JSP-Seite meldet sich!<br>
<%= request.getRemoteHost() %>,
<%= (new SimpleDateFormat("yyyy-MM-dd, HH:mm:ss")).format(new Date()) + " h" %>
<%= (new HalloServlet()) %>
</html>
_______________________________________________________________________



WEB-INF/src/HalloServlet.java:
_______________________________________________________________________
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HalloServlet extends HttpServlet
{
public void doGet( HttpServletRequest requ, HttpServletResponse resp )
throws ServletException, IOException
{
resp.setContentType( "text/html" );
PrintWriter out = resp.getWriter();
out.println( "<html>" );
out.println( "Hallo, mein erstes Servlet meldet sich." );
out.println( "</html>" );
out.close();
}
}
_______________________________________________________________________



WEB-INF/web.xml:
_______________________________________________________________________
<!DOCTYPE web-app PUBLIC
'-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
<display-name>Mein erstes Servlet</display-name>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>HalloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
_______________________________________________________________________







Starte ich HelloJSP, krieg ich folgende Fehlermeldung:
_______________________________________________________________________

HTTP Status 500 -

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

An error occurred at line: 8 in the jsp file: /HelloJSP.jsp
Generated servlet error:
HalloServlet 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:409)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:288)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:267)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:255)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:293)
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.12 logs.
_______________________________________________________________________



Wie muss ich HalloServer.class also in HelloJSP.jsp einbinden (vorausgesetzt, es geht technisch ;) )?

Gruß Michi
 
Hi ihr,

da in J2EE-Umgebungen ein Request nötig ist, um ein Servlet aufzurufen wird Dein Unterfangen wohl schwierig werden. Das einzige was Du meiner Meinung nach machen könntest, ist entweder die Funktionalität des zweiten Servlets auszulagern in eine Helper-Klasse und diese dann zu nutzen (import nicht vergessen), oder Du setzt in der JSP einen HTML-Bereich ein, der den Browser dazu zwingt, einen neuen Request abzuschicken, also z.B. ein IFRAME oder Du schickst einfach per JavaScript einen XMLHTTPRequest ab und holst dann die Daten aus der Antwort und schreibst Sie per DOM ins HTML-Dokument, oder Du kriegst es hin, dass der Server eine GET-Anfrage an das Servlet an sich selbst stellt und die Antwort in die JSP schreibt (womit Du dann aber jegliches J2EE-Design-Pattern in Frage stellst)...

...da gibts eigentlich nicht wirklich mehr Möglichkeiten. Sowas wie Du hab ich auch mal versucht. Aber selbst mit Frameworks wie Struts oder ähnlichem ist das nicht möglich. Dazu sind Servlets auch nicht gedacht, denn wenn man mal nachdenkt und die Funktionsweise von JSP's versteht, dann weiß man, dass diese von der JSP-Engine auf dem Server (spätestens da!) zuerst in Servlets kompiliert werden (z.B. mit dem Jasper Compiler [u.a. im Tomcat]), dann werden die Servlets in Klassen kompiliert und erst dann sind sie auf dem Server eigentlich verfügbar. Deshalb dauert das erste Aufrufen eine etwas größeren Web-Anwendung mitunter auch schon mal einige Minuten, bevor man etwas sieht, wenn die JSP's noch nicht vorkompiliert wurden (was ich jedem anrate, denn da kriegt man dann schonmal viele Fehler zu Tage gefördert).

Aber zurück zum Thema: in J2EE-Umgebungen entspricht ein Servlet und/oder eine JSP der Behandlung eines bestimmten Requests und es ist eigentlich nicht vorgesehen, einen neuen Request in der JSP zu stellen (was letztendlich bedeutet, dass der Server sich selbst fragt, was eigentlich Aufgabe des Browsers ist). Die eigentliche Funktionalität ist eh außerhalb der Servlets zu schreiben...


...so, ich hoffe ich konnte trotz allem ein wenig weiterhelfen... :)

Gruß, C]-[aoZ
 
Zuletzt bearbeitet:
Hallo,
wenn du eigene Klassen in einer JSP verwenden willst, musst du sie auch importieren, ähnlich wie du auch schon java.util importiert hast. Dann wird das so gehen wie du es dir vorstellst.

Am generischsten und elegantesten lässt sich dies allerdings über eine eigene Taglibrary lösen. Dann kannst du auf <%= =%> verzichten (Webdesigner mögen sowas nicht ;-)) und arbeitest mit z.B. <helloServlet format="HH:mm:ss"/>

Das besondere an einem Servlet ist die Einbettung in einen Servletcontainer, der ausgelöst durch einen Request irgendwann die execute Methode des Servlets abarbeitet.
Durch deinen Aufruf wird der Konstruktor der Klasse aufgerufen. Dieser liefert jetzt keinen HTML Code zurück. Du könntest zwar die execute Methode innerhalb einer JSP aufrufen, wist aber Probleme mit den Parameter haben.

Schau dir mal Struts an.
 

Neue Beiträge

Zurück