2013-05-16 15 views
24

Grundlegende Konfigurationsdateien sieht nicht intuitiv.Wie ordnen Sie Anfragen in HTML-Datei in Spring MVC?

Wenn ich schaffen einfache Hallo Welt Beispiel, und dann home.jsp zu home.html umbenennen und bearbeiten servlet-context.xml Datei von

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <beans:property name="prefix" value="/WEB-INF/views/" /> 
    <beans:property name="suffix" value=".jsp" /> 
</beans:bean> 

zu

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <beans:property name="prefix" value="/WEB-INF/views/" /> 
    <beans:property name="suffix" value=".html" /> 
</beans:bean> 

beginne ich einen Fehler zu bekommen

WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/myapp/WEB-INF/views/home.html] in DispatcherServlet with name 'appServlet' 

Warum? Was bedeutet suffix Eigentum?

UPDATE

Mein Controller folgt ist. Wie sehen Sie es nicht Dateierweiterung enthält

@Controller 
public class HomeController { 

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class); 

    /** 
    * Simply selects the home view to render by returning its name. 
    */ 
    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Locale locale, Model model) { 
     logger.info("Welcome home! The client locale is {}.", locale); 

     Date date = new Date(); 
     DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

     String formattedDate = dateFormat.format(date); 

     model.addAttribute("serverTime", formattedDate); 

     return "home"; 
    } 

} 
+0

Wenn es sich um eine statische Datei ist, dann müssen Sie Feder mvc statische Ressourcenzuordnung –

+0

Ex '' –

+0

und Sie können den 'InternalResourceViewResolver' entfernen, da keine Verarbeitung erforderlich ist –

Antwort

0

ich denke, die InternalResourceViewResolver Servlets und JSP-Dateien unterstützt. Das Suffix nach Spring's API javadocs ist das, das "beim Erstellen einer URL an Namen angehängt wird". Es ist nicht die Erweiterung der Datei, obwohl sie sehr irreführend ist. Ich überprüfte UrlBasedViewResolver setSuffix() Klasse.

Wahrscheinlich, wenn sie es als viewSuffix nennen, könnte es mehr Sinn machen, denke ich.

5

Die Resolver-Klasse wird zum Auflösen von Ressourcen einer Sichtklasse verwendet, die Sichtklasse wiederum, generiert die Ansichten von Ressourcen. Zum Beispiel mit einem typischen InternalResourceViewResolver wie folgt:

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
</beans:bean> 

Ein Blick Name „home“ als „/WEB-INT/views/home.jsp“ und dann übersetzt in eine JSP-Ansicht mit Blick Klasse InternalResourceView abgebildet werden (was für JSP ist). Wenn Sie den Suffix-Wert durch ".html" ersetzen, kann Spring die spezifische Ressource "/WEB-INT/views/home.html" abrufen, weiß aber nicht, wie sie generiert wird.

+6

SO, wie man es wissen lässt? –

+0

@SuzanCioc Sie brauchen eigentlich nicht InternalResourceViewResolver, es ist für JSP-Dateien. Sie müssen Ihre HTML-Seiten als statische Ressourcen festlegen. – zygimantus

4

Einfache .html-Dateien sind statisch und benötigen keinen speziellen ViewResolver. Sie sollten einen statischen Ordner für Ihre HTML-Seiten wie gezeigt here einrichten.

Zum Beispiel:

<mvc:resources mapping="/static/**" location="/static/" /> 
1

Spring MVC erlaubt Ihnen nicht, statische Ressourcen über Controller zu machen. Wie Arun sagte, sollte es über resources serviert werden.

Korrigieren Sie mich, wenn ich falsch liege, aber es scheint, dass Sie eine index.html als eine Titelseite wollen. Um dies zu erreichen, sollte ein Controller (zB IndexController) auf /index.html gelegt werden. Dann sollten Sie in Ihrem web.xml Ihre yo sagen, dass Ihre Willkommens-Datei index.html ist. Auf diese Weise sucht Ihr Container, wenn Sie auf den Stamm der Anwendung verweisen, nach "/index.html" und sucht dann nach dem Controller, der der URL /index.html zugeordnet ist.

So sollte Ihr Controller wie folgt aussehen:

@Controller 
@RequestMapping("/index.html") 
public class MyIndexController { 
    @RequestMapping(method=RequestMethod.GET) 
    protected String gotoIndex(Model model) throws Exception {  
     return "myLandingPage"; 
    } 
} 

Und in Ihrem Web.xml

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

Ich hoffe, dies hilft.

+0

Aber wie viele URLs usw., /,/index,/home zu einer statischen Seite zuordnen? – zygimantus

2

gut, es scheint, dass Sie nicht die Reihenfolge der Ansicht festgelegt haben.

zum Beispiel, wenn Ihr Projekt wie jsp, json, velocity, freemarker, etc. Sie alle verwenden können (vielleicht brauchen Sie eine neue Version von Frühling, 3.1+), aber wird nur eine Ansicht ausgewählt werden um an den Kunden zu rendern, hängt das von Ihrer Ansichtsreihenfolge ab, die niedrigere die Bestellung, die bevorzugen die Ansicht.

zum Beispiel, setzen Sie jsp Ansicht ‚s um 1 ist, und Freemarker Ansicht‘ s Auftrag ist 2, die beide ihre Ansicht Name ist ‚Heimat‘, wird die Quelle wählen view.jsp (wenn Sie Suffix gesetzt zu .jsp). Nun, wenn Ihr Ansichtsname "index" ist, kein index.jsp, aber index.ftl (nehmen Sie an, dass Sie die Ansicht von freemarker auf .ftl setzen), wählt spring den späteren aus.

der Beispielcode mit Spring 's Java Config, können Sie leicht in XML-Stil konvertieren.

@Bean 
public InternalResourceViewResolver jspViewResolver() { 
    InternalResourceViewResolver jsp = new InternalResourceViewResolver(); 
    jsp.setOrder(4); 
    jsp.setCache(true); 
    jsp.setViewClass(org.springframework.web.servlet.view.JstlView.class); 
    jsp.setPrefix("/WEB-INF/jsp/"); 
    jsp.setSuffix(".jsp"); 
    return jsp; 
} 

@Bean 
public FreeMarkerViewResolver freeMarkerViewResolver() { 
    FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver(); 
    viewResolver.setCache(true); 
    viewResolver.setPrefix(""); 
    viewResolver.setSuffix(".ftl"); 
    viewResolver.setContentType(ViewConstants.MEDIA_TYPE_HTML); 
    viewResolver.setRequestContextAttribute("request"); 
    viewResolver.setExposeSpringMacroHelpers(true); 
    viewResolver.setExposeRequestAttributes(true); 
    viewResolver.setExposeSessionAttributes(true); 
    viewResolver.setOrder(2); 
    return viewResolver; 
} 

finden Sie in der setOrder() Methode!

Die JSON, JSONP und andere Arten von Ansichten können OntentNegotiation verwenden, und Sie können es auf der Frühjahrsdokumente finden.

schließlich die HTML-Ansicht, meine ich, völlig statische Dateien, die nicht durch Feder Standard unterstützt wird. Ich nehme an, dass die statische Datei nicht mit Java rendern muss. Sie können die statische Zuordnung mit dem Code verwenden unter:

<mvc:resources mapping="/static/**" location="/static/" /> 

oder Java-config:

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    int cachePeriod = 3600 * 24 * 15; 
    registry.addResourceHandler("/static/**").addResourceLocations("/static/").setCachePeriod(cachePeriod); 
    registry.addResourceHandler("/favicon.ico").addResourceLocations("/").setCachePeriod(cachePeriod); 
    registry.addResourceHandler("/robots.txt").addResourceLocations("/").setCachePeriod(cachePeriod); 
} 

und in Ihrer @RequestMapping Methode, sollten Sie umleiten es!

gut, , wenn Sie don‘t Umleitung wollen, setzen Sie einfach die HTML-Ansicht auf eine dynamische Ansicht (Freemark, velecity, etc.), die in Ordnung sein!

hoffe es nützlich!

0

Sie haben dieses Problem, weil möglicherweise kein Servlet für das Mapping * .html registriert ist.
so endet der Aufruf mit dem "Standard-Servlet", das bei einem Servlet-Mapping von/welches wahrscheinlich Ihr DispatcherServlet ist.
Jetzt findet das Dispatcher-Servlet keinen Controller, der die Anfrage für home.html und damit die Nachricht, die Sie sehen, verarbeitet.
Um dieses Problem zu lösen, können Sie die Erweiterung * .html registrieren, die von JSPServlet verarbeitet werden soll, und dann sollte es sauber funktionieren.

27

Hintergrund des Problems

Das erste, was zu verstehen ist folgende: Es ist Frühling nicht, welche die jsp Dateien macht. Es ist JspServlet (org.apache.jasper.servlet.JspServlet), die es tut. Dieses Servlet kommt mit Tomcat (Jaspis Compiler) nicht mit Feder. Dieses JspServlet weiß, wie man die JSP-Seite kompiliert und sie als HTML-Text an den Client zurückgibt. Das JspServlet in tomcat verarbeitet standardmäßig nur Anforderungen, die zwei Mustern entsprechen: * .jsp und * .jspx.

Nun, wenn der Frühling die Ansicht mit InternalResourceView macht (oder JstlView), drei Dinge wirklich stattfindet:

  1. erhalten alle Modellparameter aus Modell (von dem Controller-Handler-Methode, dh "public ModelAndView doSomething() { return new ModelAndView("home") }" zurückgegeben)
  2. aussetzen Diese Modellparameter als Anforderungsattribute (so dass sie von JspServlet gelesen werden können)
  3. Weiterleiten von Anforderung an JspServlet. RequestDispatcher weiß, dass jeder * .jsp Anfrage an JspServlet weitergeleitet werden soll (da diese Standardkonfiguration des Katers ist)

Wenn Sie einfach den Namen home.html Kater Ansicht ändern nicht wissen, wie die Anfrage zu bearbeiten. Dies liegt daran, dass keine Servlet-Handling * .html-Anfragen vorliegen.

Lösung

wie diese zu lösen. Es gibt drei naheliegendste Lösung:

  1. die HTML als Datei
  2. Ressource setzen die JspServlet anweisen, auch handhaben * .html fordert
  3. Ihre eigenen Servlet schreiben (oder auf einen anderen bestehenden Servlet-Anforderungen werden an * .html).

Erstkonfiguration (nur Umgang mit jsp)

Zuerst nehmen wir an, wir Frühling ohne XML-Dateien (nur gründend auf @Configuration Anmerkung und Feder der WebApplicationInitializer Schnittstelle) konfigurieren.

Grundkonfiguration würde folgende

public class MyWebApplicationContext extends AnnotationConfigWebApplicationContext { 
    private static final String CONFIG_FILES_LOCATION = "my.application.root.config"; 

    public MyWebApplicationContext() { 
    super(); 
    setConfigLocation(CONFIG_FILES_LOCATION); 
    } 

} 

public class AppInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
    WebApplicationContext context = new MyWebApplicationContext(); 
    servletContext.addListener(new ContextLoaderListener(context)); 

    addSpringDispatcherServlet(servletContext, context); 

    } 

    private void addSpringDispatcherServlet(ServletContext servletContext, WebApplicationContext context) { 
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", 
     new DispatcherServlet(context)); 
    dispatcher.setLoadOnStartup(2); 
    dispatcher.addMapping("/"); 
    dispatcher.setInitParameter("throwExceptionIfNoHandlerFound", "true"); 
    } 
} 

package my.application.root.config 
// (...) 

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 
    @Autowired 
    @Qualifier("jstlViewResolver") 
    private ViewResolver jstlViewResolver; 

    @Bean 
    @DependsOn({ "jstlViewResolver" }) 
    public ViewResolver viewResolver() { 
    return jstlViewResolver; 
    } 

    @Bean(name = "jstlViewResolver") 
    public ViewResolver jstlViewResolver() { 
    UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 
    resolver.setPrefix("/WEB-INF/internal/"); 
    resolver.setViewClass(JstlView.class); 
    resolver.setSuffix(".jsp"); 
    return resolver; 
    } 

} 

Im obigen Beispiel ich mit Rückenansicht Klasse JstlView mit UrlBasedViewResolver, aber Sie können wie in Ihrem Beispiel verwenden InternalResourceViewResolver es keine Rolle spielt.

Das obige Beispiel konfiguriert die Anwendung mit nur einem Ansichtsresolver, der JSP-Dateien behandelt, die mit .jsp enden. HINWEIS: Wie bereits am Anfang erwähnt, verwendet JstlView Tomcat's RequestDispatcher, um die Anfrage an JspSevlet weiterzuleiten, um das JSP in HTML zu kompilieren.

Implementierung auf Lösung 1 - Setzen Sie die HTML als eine Ressource-Datei:

Wir haben die WebConfig-Klasse ändern, um neue Ressourcen Anpassung hinzuzufügen.Auch müssen wir die jstlViewResolver so modifizieren, dass es nicht weder Präfix noch Suffix nehmen:

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 
    @Autowired 
    @Qualifier("jstlViewResolver") 
    private ViewResolver jstlViewResolver; 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/someurl/resources/**").addResourceLocations("/resources/"); 

    } 

    @Bean 
    @DependsOn({ "jstlViewResolver" }) 
    public ViewResolver viewResolver() { 
    return jstlViewResolver; 
    } 

    @Bean(name = "jstlViewResolver") 
    public ViewResolver jstlViewResolver() { 
    UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 
    resolver.setPrefix(""); // NOTE: no preffix here 
    resolver.setViewClass(JstlView.class); 
    resolver.setSuffix(""); // NOTE: no suffix here 
    return resolver; 
    } 

// NOTE: you can use InternalResourceViewResolver it does not matter 
// @Bean(name = "internalResolver") 
// public ViewResolver internalViewResolver() { 
// InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
// resolver.setPrefix(""); 
// resolver.setSuffix(""); 
// return resolver; 
// } 
} 

Damit fügen wir sagen, dass jeder, dass jeder Antrag auf http://my.server/someurl/resources/ gehen auf Ressourcen-Verzeichnis unter Ihrem Web-Verzeichnis zugeordnet. Also, wenn Sie Ihre home.html in Ressourcen-Verzeichnis setzen und Ihren Browser auf http://my.server/someurl/resources/home.html zeigen, wird die Datei geliefert. Um damit umzugehen, indem Sie Ihre Controller kehren Sie dann den vollständigen Pfad zu der Ressource:

@Controller 
public class HomeController { 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public ModelAndView home(Locale locale, Model model) { 
     // (...) 

     return new ModelAndView("/someurl/resources/home.html"); // NOTE here there is /someurl/resources 
    } 

} 

Wenn Sie im selben Verzeichnis legen einige jsp Dateien (nicht nur * .html-Dateien), sagen home_dynamic.jsp in den gleichen Ressourcen Verzeichnis können Sie auf ähnliche Weise zugreifen, aber Sie müssen den tatsächlichen Pfad auf dem Server verwenden. Der Pfad tut nicht Start mit/Someurl/weil dies die Zuordnung nur für HTML-Ressourcen mit Endung .html ist). In diesem Kontext ist jsp eine dynamische Ressource, auf die am Ende von JspServlet mit dem tatsächlichen Pfad auf der Festplatte zugegriffen wird. So richtige Weg, um die jsp zuzugreifen, ist:

@Controller 
public class HomeController { 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public ModelAndView home(Locale locale, Model model) { 
     // (...) 

     return new ModelAndView("/resources/home_dynamic.jsp"); // NOTE here there is /resources (there is no /someurl/ because "someurl" is only for static resources 

} 

dies in Config XML-basierte Um dies zu erreichen müssen Sie verwenden:

<mvc:resources mapping="/someurl/resources/**" location="/resources/" /> 

und ändern Sie Ihre jstl Ansicht Resolver:

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- Please NOTE that it does not matter if you use InternalResourceViewResolver or UrlBasedViewResolver as in annotations example --> 
    <beans:property name="prefix" value="" /> 
    <beans:property name="suffix" value="" /> 
</beans:bean> 

Implementierung auf Lösung 2:

In dieser Option verwenden wir den Tomcat 's JspServlet, um auch statische Dateien zu verarbeiten. Als Folge können Sie JSP-Tags in Ihren HTML-Dateien verwenden :) Es ist natürlich Ihre Wahl, ob Sie es tun oder nicht. Höchstwahrscheinlich möchten Sie plain html verwenden, also verwenden Sie einfach keine jsp Tags und der Inhalt wird so geliefert, als wäre es statisches html.

Zuerst haben wir preffix und Suffix für Ansicht Resolver als in vorherigen Beispiel löschen:

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 
    @Autowired 
    @Qualifier("jstlViewResolver") 
    private ViewResolver jstlViewResolver; 

    @Bean 
    @DependsOn({ "jstlViewResolver" }) 
    public ViewResolver viewResolver() { 
    return jstlViewResolver; 
    } 

    @Bean(name = "jstlViewResolver") 
    public ViewResolver jstlViewResolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); // NOTE: this time I'm using InternalResourceViewResolver and again it does not matter :) 
    resolver.setPrefix(""); 
    resolver.setSuffix(""); 
    return resolver; 
    } 

} 

Nun fügen wir JspServlet für die Handhabung auch * .html-Dateien:

public class AppInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
    WebApplicationContext context = new MyWebApplicationContext(); 
    servletContext.addListener(new ContextLoaderListener(context)); 

    addStaticHtmlFilesHandlingServlet(servletContext); 
    addSpringDispatcherServlet(servletContext, context); 

    } 

// (...) 

    private void addStaticHtmlFilesHandlingServlet(ServletContext servletContext) { 
    ServletRegistration.Dynamic servlet = servletContext.addServlet("HtmlsServlet", new JspServlet()); // org.apache.jasper.servlet.JspServlet 
    servlet.setLoadOnStartup(1); 
    servlet.addMapping("*.html"); 
    } 

} 

wichtig das ist, dies zu machen Klasse verfügbar Sie müssen das jasper.jar nur zur Kompilierzeit aus der Tomcat-Installation hinzufügen. Wenn Sie Maven App haben, ist dies relativ einfach, indem Sie den für das Glas vorgesehenen scope = verwenden. Die Abhängigkeit in maven wird wie folgt aussehen:

<dependency> 
    <groupId>org.apache.tomcat</groupId> 
    <artifactId>tomcat-jasper</artifactId> 
    <version>${tomcat.libs.version}</version> 
    <scope>provided</scope> <!--- NOTE: scope provided! --> 
</dependency> 
<dependency> 
    <groupId>org.apache.tomcat</groupId> 
    <artifactId>tomcat-jsp-api</artifactId> 
    <version>${tomcat.libs.version}</version> 
    <scope>provided</scope> 
</dependency> 

Wenn Sie es auf XML-Weise tun möchten. Sie müßten jsp Servlet registrieren * .html Anfragen zu bearbeiten, so müssen Sie folgenden Eintrag in Ihrem web.xml

<servlet> 
    <servlet-name>htmlServlet</servlet-name> 
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> 
    <load-on-startup>3</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>htmlServlet</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 

Jetzt in Ihrem Controller hinzuzufügen, die Sie HTML und JSP-Dateien ebenso wie in vorherigem Beispiel zugreifen können . Der Vorteil ist, dass es keine "/ someurl /" zusätzliche Zuordnung gibt, die in Lösung 1 benötigt wurde.Ihr Controller wird wie folgt aussehen:

@Controller 
public class HomeController { 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public ModelAndView home(Locale locale, Model model) { 
     // (...) 

     return new ModelAndView("/resources/home.html"); 

} 

zu Ihrem jsp Punkt Sie tun genau das gleiche:

@Controller 
public class HomeController { 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public ModelAndView home(Locale locale, Model model) { 
     // (...) 

     return new ModelAndView("/resources/home_dynamic.jsp"); 

} 

Implementierung auf Lösung 3:

dritte Lösung ist etwas eine Kombination aus Lösung 1 und Lösung 2. Also hier wollen wir alle Anfragen an * .html an ein anderes Servlet übergeben. Sie können Ihre eigenen schreiben oder nach einem guten Kandidaten für ein bereits bestehendes Servlet suchen.

Wie oben zuerst reinigen wir das Präfix und Suffix für die Ansicht Resolver auf:

@Configuration 
@EnableWebMvc 
public class WebConfig extends WebMvcConfigurerAdapter { 
    @Autowired 
    @Qualifier("jstlViewResolver") 
    private ViewResolver jstlViewResolver; 

    @Bean 
    @DependsOn({ "jstlViewResolver" }) 
    public ViewResolver viewResolver() { 
    return jstlViewResolver; 
    } 

    @Bean(name = "jstlViewResolver") 
    public ViewResolver jstlViewResolver() { 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); // NOTE: this time I'm using InternalResourceViewResolver and again it does not matter :) 
    resolver.setPrefix(""); 
    resolver.setSuffix(""); 
    return resolver; 
    } 

} 

Anstatt nun die Tomcats JspServlet verwenden wir unsere eigenen Servlet schreiben (oder wieder verwenden einige bestehende):

public class StaticFilesServlet extends HttpServlet { 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setCharacterEncoding("UTF-8"); 

    String resourcePath = request.getRequestURI(); 
    if (resourcePath != null) { 
     FileReader reader = null; 
     try { 
     URL fileResourceUrl = request.getServletContext().getResource(resourcePath); 
     String filePath = fileResourceUrl.getPath(); 

     if (!new File(filePath).exists()) { 
      throw new IllegalArgumentException("Resource can not be found: " + filePath); 
     } 
     reader = new FileReader(filePath); 

     int c = 0; 
     while (c != -1) { 
      c = reader.read(); 
      if (c != -1) { 
      response.getWriter().write(c); 
      } 
     } 

     } finally { 
     if (reader != null) { 
      reader.close(); 
     } 
     } 
    } 
    } 
} 
zu * .html zu unserem Servlet

Wir weisen nun die Feder um alle Anfragen zu passieren

public class AppInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
    WebApplicationContext context = new MyWebApplicationContext(); 
    servletContext.addListener(new ContextLoaderListener(context)); 

    addStaticHtmlFilesHandlingServlet(servletContext); 
    addSpringDispatcherServlet(servletContext, context); 

    } 

// (...) 

    private void addStaticHtmlFilesHandlingServlet(ServletContext servletContext) { 
    ServletRegistration.Dynamic servlet = servletContext.addServlet("HtmlsServlet", new StaticFilesServlet()); 
    servlet.setLoadOnStartup(1); 
    servlet.addMapping("*.html"); 

    } 

} 

Der Vorteil (oder Nachteil, hängt davon ab, was Sie wollen) ist, dass JSP-Tags offensichtlich nicht verarbeitet werden. Sie Controller sieht wie gewohnt:

@Controller 
public class HomeController { 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public ModelAndView home(Locale locale, Model model) { 
     // (...) 

     return new ModelAndView("/resources/home.html"); 

} 

Und für jsp:

@Controller 
public class HomeController { 

    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public ModelAndView home(Locale locale, Model model) { 
     // (...) 

     return new ModelAndView("/resources/home_dynamic.jsp"); 

}