2010-12-08 4 views
0

Ich richte eine Web-App auf GlassFish ein und ich frage mich, ob es eine Möglichkeit gibt, Servlet-Mapping vom URL-Stamm zu konfigurieren, nur in Fällen anzuwenden, in denen eine Datei oder ein Verzeichnis nicht unter der angegebenen URL existiert. mein Frühling DispatcherServlet Mapping: Nur wenn eine Datei oder ein Verzeichnis nicht existiert?

Derzeit dieser Wille Weg alles durch:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
      version="3.0"> 
<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class> 
    org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 
<welcome-file-list> 
    <welcome-file> 
    /jsp/index.jsp 
    </welcome-file> 
</welcome-file-list> 
</web-app> 

Ist es irgendwie möglich, das oben beschriebene Verhalten zu erhalten, es sei denn eine Datei oder ein Verzeichnis zu einem bestimmten Pfad vorhanden ist? Versuche ich, dieses Problem am falschen Ort zu lösen?

UPDATE: Was ist mit URL-Rewriting? Bietet GlassFish eine gewisse Flexibilität wie Apache mit mod_rewrite? Auf diese Weise konnte ich Dinge abfangen, bevor es überhaupt die Servlet-Mapping-Stufe erreicht.

Antwort

1

Hacky, aber machbar: Karte als <error-page> auf einem <error-code> von 404.

Möglicherweise möchten Sie den Statuscode im Servlet ändern, wenn Sie eine "gültige" Antwort zurückgeben möchten.

Eine Alternative ist, das Spring-Servlet auf eine spezifischere url-pattern zu hören. Z.B. /pages/*. Sie könnten dann, wenn notwendig, eine Filter vor bringen (auf /*), die in etwa die folgenden tut:

if (new File(servletContext.getRealPath(request.getRequestURI())).exists()) { 
    chain.doFilter(request, response); 
} else { 
    request.getRequestDispatcher("/pages" + request.getRequestURI()).forward(request, response); 
} 

, so dass Sie nicht sehen,/müssen /pages in der URL.


aktualisieren: wie pro Ihre neue Frage:

UPDATE: Was ist das Umschreiben von URLs? Bietet GlassFish eine gewisse Flexibilität wie Apache mit mod_rewrite? Auf diese Weise konnte ich Dinge abfangen, bevor es überhaupt die Servlet-Mapping-Stufe erreicht.

Die JSP/Servlet Äquivalent mod_rewrite AddOn Apache HTTPD ist die Tuckey's UrlRewriteFilter.