Frage

Was ich versuche Karte Anfragen an das Servlet Wurzel zu tun ist (korrekte Terminologie?). Ich bin an dem Punkt, wo URLs korrekte Ansicht abgebildet werden aber alle statischen Inhalte - CSS, JavaScript, Bilder -., Die Teil der Seite ist nicht gefunden

Also in meinem web.xml meine Servlet-Tag sieht wie folgt aus

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

Meine Controller sieht etwa so aus:

@RequestMapping("/shop")
public class TheShopController extends MyBaseController {

    public static String VIEW = "Tile.Shop";

    @Override
    @RequestMapping(method = RequestMethod.GET)
    protected ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp) {
        ModelAndView mav = new ModelAndView(VIEW);
        return mav;
    }

}

MyBaseController ist sehr einfach. Es sieht wie folgt aus:

public abstract class MyBaseController extends AbstractController {

    protected Logger log = Logger.getLogger(getClass());

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) 
        throws Exception {

        ModelAndView mav = processRequest(req, resp);
        return mav;
    }

    protected abstract ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp);
}

Ich bin mit Fliesen aus meiner Sicht Schicht. Meine Konfiguration ist wie folgt:

    

           /WEB-INF/tiles-defs.xml         

Wie bereits erwähnt, werden die Ansichten gefunden, aber die statischen Ressourcen, die eine Portierung der Seite sind, können nicht gefunden werden. Hier einige typische Protokollierung heraus gesetzt:

  

2010-01-24 17: 25: 01.777 DEBUG [http-8080-7] servlet.DispatcherServlet   (DispatcherServlet.java:690) - DispatcherServlet mit dem Namen 'springapp'   Verarbeitung von GET-Anforderung für [/springapp/static/css/account.css]   2010-01-24 17: 25: 01.778 WARN [http-8080-4] servlet.DispatcherServlet   (DispatcherServlet.java:962) - Keine Zuordnung gefunden für HTTP-Anforderung mit   URI [/springapp/static/css/shop.css] in DispatcherServlet mit Namen   'Springapp' 2010-01-24 17: 25: 01.778 DEBUG [http-8080-6]   servlet.FrameworkServlet (FrameworkServlet.java:677) - Erfolgreich   abgeschlossene Anfrage 2010-01-24 17: 25: 01.778 WARN [http-8080-5]   servlet.DispatcherServlet (DispatcherServlet.java:962) - Keine Zuordnung   für HTTP-Anforderung mit URI gefunden [/springapp/static/css/offers.css] in   DispatcherServlet mit dem Namen 'springapp' 2010-01-24 17: 25: 01.778 WARN   [Http-8080-3] servlet.DispatcherServlet (DispatcherServlet.java:962) -   Keine Zuordnung gefunden für HTTP-Anforderung mit URI   [/Springapp/static/css/scrollable-buttons.css] in DispatcherServlet   mit dem Namen 'springapp'

Going to http: // localhost: 8080 / springapp / Shop funktioniert gut, aber die CSS und Bilder fehlen.

Ich denke, dass die Verwendung von Fliesen irgendwie Dinge zu verkomplizieren, aber ich "m nur ungern davon loszuwerden. Ich frage mich, wenn ich brauche, um meine Ansicht Auflösung Konfiguration Bedürfnisse anpassen irgendwie tweeked werden? Ansicht Resolvern Chaining vielleicht? Ich bin nur nicht so, dass dabei erlebt.

War es hilfreich?

Lösung

Das Problem ist, dass die Anforderungen für den statischen Inhalt auf die DispatcherServlet, weil es als <url-pattern>/</url-pattern> abgebildet wird. Es ist ein sehr häufiges Problem bei Anwendungen mit „RESTful“ URLs (die ohne Präfix in der DispatcherServlet Mapping ist).

Es gibt mehrere Möglichkeiten, dieses Problem zu lösen:


Seit dem Frühjahr die bevorzugte Art und Weise 3.x auf Zugang statischen Ressourcen, ist die Verwendung <mvc:resources>: web.xml:

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

Frühling config:

<!-- Handles GET requests for /resources/** by efficiently serving static content 
    in the ${webappRoot}/resources dir --> 
<mvc:resources mapping="/resources/**" location="/resources/" /> 

Siehe auch MVC Vereinfachungen im Frühjahr 3


1. Verwenden Sie URL-Rewrite-Filter
Siehe mvc-basic Beispiel hier

2. Setzen Sie einen Präfix für die default Servlet:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

Das heißt, Anfrage /static/images/image.png die Datei mit dem Namen /images/image.png zurückkehren Doch diese Art und Weise ist nicht kompatibel über verschiedene Servlet-Container (nicht Arbeit in Jetty), siehe Abhilfen hier

3. Set statische Inhalte Erweiterungen für das default Servlet:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

4. Nicht RESTful URLs verwenden, verwendet URLs mit dem Präfix:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping>

5. Nicht RESTful URLs verwenden, verwenden URLs mit der Erweiterung:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>

Andere Tipps

Hat man prüfen, mit diesen:

<!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource requests to the container's default Servlet -->
<mvc:default-servlet-handler/>

Hier ist die neueste Frühling docs darauf: http://static.springsource.org/spring/docs/3.1.2.RELEASE/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-default-servlet-handler

Als Alternative zu der vorgeschlagenen Lösung Nummer (2, Standard-Servlets, die Servlet-Container anders als Servlet-Container verhält), würde ich empfehlen, einen Blick in die Resource Servlets (org.springframework.js.resource.ResourceServlet) aus dem Frühjahr unter Webflow Projekt.

Für weitere Informationen schauen Sie bitte unter Wie statische Inhalte in Spring MVC?

Ich habe das gleiche Problem, sondern Feder zu verwenden, ich mysefl einen kleinen Filter, der Umleitung Wurzel zu meiner Startseite wie folgt aus:

    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String pageName = req.getServletPath();

    if(pageName.equals("/")) {
        res.sendRedirect( req.getContextPath() + "/start" );
    } else {
        chain.doFilter(request, response);
    }

Es ist vielleicht ein Trick, aber es aussieht wie mit einem kleinen Code funktioniert gut. Gehen Sie hier für weitere Filterinformationen http://www.oracle.com/technetwork/java /filters-137243.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top