2009-06-23 5 views
52

Ich versuche, ein Servlet zu erstellen, die eine JSP-Seite ähnlich der folgenden Anrufe:Wie kann ich ein Servlet "root" zuordnen, sodass andere Skripts noch ausgeführt werden können?

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws IOException, ServletException { 
    req.getRequestDispatcher("/WEB-INF/main.jsp").forward(req, resp); 
} 

ich dieses Servlets müssen die Domäne des Root (zB: http://example.com/) reagieren, so dass ich mit dem folgenden Mapping in der web.xml:

<servlet-mapping> 
    <servlet-name>MainServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Das Problem ist, ich habe, dass dies alles passt, so dass, wenn die Dispatcher nach vorne „/WEB-INF/main.jsp“ dies entspricht dem uRL-Muster, so dass die Servlet wird wieder ausgeführt. Dies führt zu einer Schleife, die läuft, bis sie mit einem java.lang.StackOverflowError endet.

Wie kann ich den Stamm anpassen, ohne zu verhindern, dass andere Skripts ausgeführt werden können?

+0

Sie werden nicht in der Lage sein zu tun, dass Sie Hacks verwenden müssen, versuchte ich die sa mich auf appengine sehen hier http://stackoverflow.com/questions/870150/how-to-access-static-resources-when-using-default-servlet aber funktioniert nicht –

+3

Vielleicht Zeit für eine angenommene Antwort? – Jeb

Antwort

4

Sie können eine Willkommensdatei mit dem Namen index.jsp im Stammverzeichnis mit dem folgenden Code mithilfe von JSTL oder auf andere Weise erstellen.

<c:redirect url="/main"/> 

So in der Datei web.xml haben Sie dies:

<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file>   
</welcome-file-list> 

So jemand die Wurzel beantragt wird, zu/main weitergeleitet. Jetzt kann Ihr Servlet auf main gemappt werden.

<servlet-mapping> 
    <servlet-name>MainServlet</servlet-name> 
    <url-pattern>/main</url-pattern> 
</servlet-mapping> 
+2

Ok, ich verstehe, dass das funktionieren würde, aber es fällt wie ein solcher Hack. Ist es wirklich nicht möglich, dass ein Servlet eigenständig mit dem Root arbeitet? –

+0

Sorry für das Abstimmen, aber es gibt eine bessere Lösung - http://stackoverflow.com/questions/1030302/how-can-i-map-a-root-servlet-so-that-other-scripts-are-still- runnable/4443581 # 4443581 –

+0

Diese Lösung hat den Vorteil, dass sie nicht in jedem Verzeichnis ein Mapping erzeugt, wie es Welcome-Dateien tun. Also habe ich es benutzt (obwohl mit klarem% Scriptlet, kein Tag) und ich stimme es ab. –

0

Sie können nicht zu WEB-INF umleiten. Ein Servlet-Container wird niemals Anforderungen für Dokumente in diesem Ordner liefern.

Wenn Sie möchten, dass Ihre Anwendung (nicht nur ein Servlet, sondern die gesamte Anwendung) im Stammkontext ("/" von "http://www.domainname.com/") verfügbar ist, müssen Sie dafür einen Kontexteintrag einrichten - kein Servlet-Mapping.

Mit Tomcat fügen Sie ein neues (in einem von ungefähr 3 verschiedenen möglichen Plätzen) hinzu.

+1

Ich mache keine Redirect, ich mache einen Forward. Das ist intern, also ist es egal, ob sie öffentlich sichtbar sind, oder? Wie auch immer, es hat nicht geholfen, sie aus dem WEB-INF zu entfernen. Ich benutze nicht Tomcat, aber ich werde in Kontext-Mapping, danke. –

+0

Der Container versorgt Ressourcen unter WEB-INFs, wenn die Anfrage weitergeleitet wird. Es ist ein gültiges und nützliches Seitenstruktur-Paradigma. –

+0

@fiXedd Sie sind richtig, ich missverstanden –

0

Haben Sie das unten versucht? (Beachten Sie die fehlende *, die eine Wild Card und ist der Grund dafür, dass Ihre Konfiguration alles fängt.)

<servlet-mapping> 
     <servlet-name>MainServlet</servlet-name> 
     <url-pattern>/index.jsp</url-pattern> 
</servlet-mapping> 

(Herausgegeben als pro Kommentare von nur /.)

+0

Ich tat ... es hatte genau das gleiche Ergebnis. Ich hätte erwähnen sollen, dass ich das auf App Engine mache. Ich fange an zu denken, dass sie Mapping ist, äh, wackelig. –

+0

OK, versuchen Sie index.jsp dann? –

1

Versuchen Sie einfach zu entfernen ‚*‘ von dem Muster, das heißt

<url-pattern>/</url-pattern> 
+0

@fiXedd hat das anscheinend versucht und es funktioniert nicht. (Siehe die Bearbeitungsgeschichte meiner Antwort.) Vielleicht etwas mit dem Ausführen von App Engine zu tun ... –

+0

Dies funktioniert auf Jetty und Tomcat- – chrismarx

7

Die ursprüngliche Frage erwähnt nicht, dass sie versuchen, ein Stamm-Servlet in App Engine zuzuordnen - Tomcat (und andere Servlet-Container, soweit ich weiß) ist einfach, aber App Engine ist kein normaler Servlet-Container.

Meine normale Methode zum Erstellen einer Webanwendung mit Servlets besteht darin, HttpServlet zu erweitern, ein "Seiten" -Objekt mit Titel, Inhalt, Fehlern, Nachrichten usw. hinzuzufügen und an eine JSP-Vorlage weiterzuleiten. Dies war ein absoluter Alptraum, der in App Engine funktioniert.

  • JSP-Dateien können am Anfang nicht ohne ein "/" benannt werden.
  • JSP-Dateien können nicht in einem Unterverzeichnis
  • Servlets sein können mit einem „/“ url-pattern

Hier ist meine web.xml (edited der Kürze halber nicht an die Wurzel der Anwendung abgebildet werden) was endlich funktioniert hat.

<web-app> 
    <servlet> 
    <!-- this servlet needs to redirect to a NamedDispatcher 
     called "template" --> 
    <servlet-name>Home</servlet-name> 
    <servlet-class>my.domain.HomeSv</servlet-class> 
    </servlet> 
    <servlet> 
    <!-- jsp file must apparently be in root directory and have "/" at 
     start of path --> 
    <servlet-name>template</servlet-name> 
    <jsp-file>/template.jsp</jsp-file> 
    </servlet> 
    <servlet-mapping> 
    <!-- map your home servlet to somewhere other than "/" --> 
    <servlet-name>Home</servlet-name> 
    <url-pattern>/home</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
    <!-- make your Home servlet the welcome file --> 
    <welcome-file>home</welcome-file> 
    </welcome-file-list> 
</web-app> 

Ich habe nicht besonders wissenschaftlich gewesen über all diese Validierung - aber es scheint jetzt, für mich zu arbeiten, und ich bin ziemlich glücklich darüber.

+1

Auf dem Dev-Server scheint es, dass das Hinzufügen eines Fallbacks index.html dazu führt, dass index.html Vorrang vor Ihrem Servlet hat, falls es existiert, selbst wenn es _nach dem_ angegeben ist home. – hraban

29

Die Verwendung der Welcome-Datei Element von web.xml arbeitete für mich, auf App Engine. Hier ist meins:

<web-app> 
    <servlet> 
     <servlet-name>RootServlet</servlet-name> 
     <servlet-class>com.foo.RootServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>RootServlet</servlet-name> 
     <url-pattern>/foo</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>foo</welcome-file> 
    </welcome-file-list> 
</web-app> 
+1

Das funktioniert super.Beachten Sie, dass der 'Servlet-Name' nicht der 'Willkommen-Datei' entsprechen kann. – nunaxe

+0

Scheint für mich auf Jetty oder Tomcat nicht zu funktionieren. Nur wenn die Willkommensdatei eine tatsächliche Datei ist, wird sie korrekt geöffnet. – Jus12

+0

Funktioniert wie ein Zauber in Apache Tomcat, obwohl die von @ nilskp angebotene Lösung etwas leichter ist. – user3856210

41

Verwenden Sie ein leeres Muster, z.

<servlet-mapping> 
    <servlet-name>MainServlet</servlet-name> 
    <url-pattern></url-pattern> 
</servlet-mapping> 

Die Servlet 3.0-Spezifikation diese geklärt ist:

die leere Zeichenkette ("") ist ein spezielles URL-Muster, das genau abbildet Kontext root Anwendung

es also sollte mindestens auf einem 3.0-Container arbeiten, und ich habe überprüft, dass es auf Jetty 8 funktioniert

+0

Funktioniert nicht mit Jboss 5.1 (Servlet-Spezifikation 2.5) –

+2

Funktionierte nicht in WebSphere 8.5 (Servlet 3.0) – Cypher

+0

Einen Fehlerbericht erstellen. – nilskp

Verwandte Themen