2012-04-08 6 views
1

Meine Controller sind derzeit so etwas wie http://example.com/fix.go zugeordnet, und natürlich denke ich, das ist idiotisch und will etwas Schöneres wie http://example.com/fix oder http://example.com/mmm/fix ohne Erweiterung. Wenn ich versuche, dies zu konfigurieren, kann ich es jedoch nicht zum Laufen bringen. Mir fehlt eindeutig ein Schlüssel zum Verständnis des gesamten Mappings. Ich verwende Spring 3.x, Tomcat und Anmerkungen für die Controller.Wie konfiguriere ich Spring Controller URLs, um keine Erweiterung zu haben?

Mein web.xml ist wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

    <servlet> 
     <servlet-name>BooBoo</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>BooBoo</servlet-name> 
     <url-pattern>*.*</url-pattern> <!-- was *.go when it worked --> 
    </servlet-mapping> 

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

</web-app> 

BooBoo-servlet.xml ist:

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="com.foofoo.booboo"/> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/jsp/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

</beans> 

Und einer meiner Controller als solche konfiguriert:

@Controller 
public class BangBangController extends BaseController { 

      // Used to be fix.go when it worked 
    @RequestMapping(value="fix", method=RequestMethod.GET) 
    public ModelAndView choose(
      HttpSession session, 
      @RequestParam(value="fixId", required=false, defaultValue="-1") Integer fixId, 
      @RequestParam(value="forkId", required=false, defaultValue="-1") Integer forkId 
    ) 
    throws Exception { ... } 
} 

Ich habe versucht, das Mapping in web.xml zu/mmm/* zu ändern, das erwartet, dass URLs wie http://example.com/mmm/fix funktionieren, aber das hat auch nicht funktioniert ed. Ich bekomme "fehlende Ressourcen" -Fehler, wenn ich die richtigen URLs im Browser eintrage.

Was vermassele ich hier? Welches kritische Verständnis fehlt mir? Ich habe versucht, die No-Extension-Sache an einem anderen Projekt bei der Arbeit arbeiten zu lassen und konnte es auch nicht dorthin bringen. Mir fehlt offensichtlich etwas.

Antwort

1

Das Problem ist, dass Ihr Dispatcher-Servlet alles mit einem "." drin.

ändern es zu

<url-pattern>/*</url-pattern> 

aber das ist auch schlecht, wie Sie nicht statische Inhalte dienen können.

Was sollten Sie wirklich tun, ist dies:

<url-pattern>/webapp/*</url-pattern> 

Wo "Webapp" einige Präfix ist. Allen URLs muss ein Präfix vorangestellt werden. Auf diese Weise können Sie jedoch weiterhin statische Inhalte bereitstellen.

+0

+1 für die Erklärung, warum/** ist keine gute Idee, ich habe auch nie das gesehen ** vor oder dokumentiert. Dies ist, wie ich dachte, es sollte mehr oder weniger funktionieren, aber leider funktioniert das nicht für mich: "Die angeforderte Ressource (/ booboo/webapp/fix) ist nicht verfügbar." – Marvo

+0

Ich wünschte, es gäbe einen Weg, auf dem ich die Entscheidungen des Dispatchers durchgehen könnte, wenn er entscheidet, welchen Controller er aufrufen wird (oder nicht aufrufen). Ich meine, kurz davor, Spring selbst zu bauen. – Marvo

+0

@Marvo Ich entschuldige mich, ich lag falsch mit der Syntax. Ich arbeitete aus dem Gedächtnis und ich verwechselte es mit einem anderen Mustervergleicher. Die obigen Änderungen sollten funktionieren. –

0

Die Antwort war, dass ich die spring-servlet.xml-Datei durchflubberte, indem ich nicht festlegte, dass ich Spring-MVC-Dateien verwendete. Ich schätze Chris 'Hilfe bei der Diagnose des Problems. Ich brauchte eine Bestätigung, dass einige der Dinge, die ich versuchte (aber aufgrund dieses Fehlers fehlschlug), korrekt waren.

Ich habe

xmlns:mvc="http://www.springframework.org/schema/mvc" 

und

<mvc:annotation-driven /> 

auf diese Datei, und boom, fing es an zu arbeiten. Was mich am Kopf kratzen lässt, ist: "Wie ist es ohne das gegangen?" Weil es für * .go Muster funktioniert hat.

Hier ist die resultierende Datei in voller Länge: (. Zumindest nicht in einer Entwickler-Umgebung)

<?xml version="1.0" encoding="UTF-8"?> 

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="com.barbar.foofoo"/> 

    <!-- Enables the Spring MVC @Controller programming model --> 
    <mvc:annotation-driven /> 

    <!-- 
    Declare View Resolver: when view 'view_name' is called (from the Controller), 
    the file '/jsp/view_name.jsp' will be used. 
    --> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/jsp/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

</beans> 
Verwandte Themen