2012-12-04 4 views
6

Wenn ich ein Spring MVC-Vorlagenprojekt mit der SpringSource-IDE erstelle, führe ich die Anwendung aus, und die Stamm-URL wird als letztes Wort des Standardpaketnamens festgelegt:SpringSource IDE verwendet den Projektnamen nicht als Stamm-URL für die Spring MVC-Anwendung

Zum Beispiel, wenn ich das Projekt erstellen, legte ich das Standardpaket als . Wenn ich die Anwendung starte, öffnet sie sich unter http://localhost:8080/myapp. Warum verwendet die Stamm-URL nicht stattdessen meinen Projektnamen MyProject?

Das ist ein Problem, weil ich alle URLs in meiner Anwendung zu /myapp/resources/css/mycss.css angeben muss, aber wenn ich ein WAR exportieren und es auf einen Tomcat-Server bereitstellen, erwartet Tomcat stattdessen den Projektnamen (den ich verwenden soll /MyProject/resources/css/mycss.css. Als Ergebnis sind alle meine Links gebrochen, als ich einsetzen (aber nicht, wenn ich laufe auf tomcat lokal innerhalb der IDE Spring ...)

jemand laufen in dieses Problem hat?


Beispiel für Kommentar Diskussion unten:

<bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties"> 
    <property name="service" 
     value="https://localhost:8443/MyProject/j_spring_cas_security_check" /> 
    <property name="sendRenew" value="false" /> 
</bean> 

Antwort

10

Es hängt davon ab, wie Sie Führen Sie die Anwendung aus. Ich nehme an, Sie wählten "Run on Server" aus der SpringSource IDE (STS)? Wenn Sie auf die Serverdefinition in STS doppelklicken, sehen Sie eine Registerkarte "Module". Von dort aus können Sie den "Pfad" bearbeiten und einstellen, was Sie wollen. Wenn Sie "Auf Server ausführen" auswählen, muss STS einen Kontextpfad definieren und es einfach auf das letzte Element des Standardpakets zurücksetzen. Wenn ich mich richtig erinnere, verwendet Tomcat standardmäßig den Dateinamen des gezippten oder explodierten .war. In beiden Fällen können Sie es übersteuern.

Hoffe, dass hilft.

+0

Ihre Annahme war richtig, und genau das habe ich gesucht. Vielen Dank! – littleK

+0

gute Antwort, löste mein Problem +1 – SpringLearner

0

Nicht sicher STS, aber der Krieg Dateinamen in pom-Datei festgelegt ist:

</dependencies>  
<build> 
<finalName>yourProject</finalName> 

(nur realisiert werden Sie nicht Maven angegeben haben, oh well)

3

Der erste Teil in der URL nach Host und Port wird Context-Pfad genannt. In Ihrem Fall myapp. In tomcat entspricht der Kontextpfad dem Namen der WAR-Datei. Wenn Sie die WAR-Datei ROOT.war benennen, wird kein Context-Pfad verwendet.

Wie bimsapi erwähnt, können Sie den Kontextpfad auch in STS ändern.

Aber: Sie können und sollten Ihre App unabhängig vom Kontextpfad machen. Wenn Sie JSP verwenden, dann bauen Verbindungen mit dem <c:url /> tag:

<c:url value="/resources/css/mycss.css" /> 

Dies gibt die korrekte URL einschließlich der tatsächlichen Kontext-Pfad. Oder Du kann es in einer Variablen speichern und später verwenden:

<c:url value="/items/index" var="cancel-url" /> 
<a href="${cancel-url}">Cancel</a> 

In Java-Code können Sie den Kontext-Pfad erhalten mit:

request.getContextPath() 

wo Anfrage ist das aktuelle HttpServletRequest Objekt. Dadurch wird Ihre App völlig unabhängig vom tatsächlichen Kontextpfad, was die Bereitstellung erheblich vereinfacht.

+0

Das war sehr informativ, danke. Ich fing an, auf eine Weise zu schauen, dass ich den Anwendungsnamen in meinen URLs nicht fest kodieren müsste, und das scheint, dass es den Trick tun wird! Vielen Dank! – littleK

+0

Florian, noch eine Frage. Ich habe auch einige URLs in meiner applicationContext-security.xml, in denen ich im Kontextpfad hardcodiere. Kennen Sie die empfohlene Vorgehensweise, um die URLs in den Bean-Definitionen relativ zu machen? – littleK

+0

Welche Art von URL ist das? Wenn es für Frühling-Sicherheit ist, dann geben Sie einfach die relative URL ohne Kontext-Pfad, wie folgt ein:

Verwandte Themen