Como lidar com conteúdo estático no Spring MVC?


200

Estou desenvolvendo um webapp usando o Spring MVC 3 e tenho DispatcherServlettodos os pedidos para '/' assim (web.xml):

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

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

Agora isso funciona como anunciado, no entanto, como posso lidar com conteúdo estático? Antes, antes de usar URLs RESTful, eu pegava todos * .html, por exemplo, e enviava isso para o DispatcherServlet, mas agora é um jogo diferente.

Eu tenho uma pasta / static / que inclui / styles /, / js /, / images / etc e gostaria de excluir / static / * do DispatcherServlet.

Agora eu poderia obter recursos estáticos funcionando quando fiz isso:

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

Mas eu quero que ele tenha URLs legais (o ponto de eu usar o Spring MVC 3) e não a página de destino sendo www.domain.com/app/

Também não quero uma solução acoplada ao tomcat ou a qualquer outro contêiner de servlet, e como esse tráfego é (relativamente) baixo, não preciso de um servidor da web (como o apache httpd) na frente.

Existe uma solução limpa para isso?



Respostas:


266

Como passei muito tempo com esse problema, pensei em compartilhar minha solução. Desde a primavera 3.0.4, existe um parâmetro de configuração chamado <mvc:resources/>(mais sobre isso no site da documentação de referência ) que pode ser usado para servir recursos estáticos enquanto você ainda usa o DispatchServlet na raiz do seu site.

Para usar isso, use uma estrutura de diretórios semelhante à seguinte:

src/
 springmvc/
  web/
   MyController.java
WebContent/
  resources/
   img/
    image.jpg
  WEB-INF/
    jsp/
      index.jsp
    web.xml
    springmvc-servlet.xml

O conteúdo dos arquivos deve se parecer com:

src / springmvc / web / HelloWorldController.java:

package springmvc.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

 @RequestMapping(value="/")
 public String index() {
  return "index";
 }
}

WebContent / WEB-INF / web.xml:

<?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>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>
</web-app>

WebContent / WEB-INF / springmvc-servlet.xml:

<?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:context="http://www.springframework.org/schema/context"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- not strictly necessary for this example, but still useful, see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-controller for more information -->
 <context:component-scan base-package="springmvc.web" />

    <!-- the mvc resources tag does the magic -->
 <mvc:resources mapping="/resources/**" location="/resources/" />

    <!-- also add the following beans to get rid of some exceptions -->
 <bean      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
 <bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
 </bean>

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

</beans>

WebContent / jsp / index.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>Page with image</h1>
<!-- use c:url to get the correct absolute path -->
<img src="<c:url value="/resources/img/image.jpg" />" />

Espero que isto ajude :-)


12
Este exemplo deve estar no guia do usuário do Spring - é o melhor que eu já vi neste tópico. Obrigado Joris!
Paul

Definitivamente, isso fez o truque para mim - apenas o conselho de rozky é o que eu comecei a fazer, mas por alguma razão qualquer página, além da minha página inicial, estava processando os URLs dos recursos em relação à página - seguir esse conselho os torna relativos para a raiz de contexto do meu aplicativo - e funciona perfeitamente! Obrigado!
Bane

obrigado! Eu estava arrancando os cabelos até mudar a linha: <mvc: mapeamento de recursos = "/ resources / **" location = "/, caminho da classe: / META-INF / web-resources /" /> para <mvc: mapeamento de recursos = "/ resources / **" location = "/ resources /" />
Mark D

2
Como o @Bane apontou, o <c: url value = ... /> é uma parte essencial desta solução. Você (ou alguém) se importaria de me dizer por quê? Obrigado!
Mark

4
Você também pode usar <mvc: resources mapping = "/ **" location = "/ resources /" /> e ele será mapeado para a raiz. (ou seja: a raiz conterá os dois recursos E os jsps). Isso pode economizar usando c: url em todos os lugares
efaj

46

Esse problema foi resolvido na primavera 3.0.4.RELEASE, onde você pode usar o <mvc:resources mapping="..." location="..."/> elemento de configuração no arquivo de configuração do dispatcher da primavera.

Verifique a documentação da primavera


5
Embora não seja realmente "errada", esta resposta é muito breve, porque a documentação do Spring (que você mencionou como resposta) parece estar faltando alguma coisa. Verifique a resposta de Joris para obter uma resposta mais completa ... não o fato de ser longa, mas o fato de ele mencionar o uso de <c: url ...> que nem sua resposta nem o dox de Spring mencionam - e que provaram ser ser uma parte crítica da solução.
Bane

38

No Spring 3.0.x, adicione o seguinte ao seu servlet-config.xml (o arquivo configurado no web.xml como o contextConfigLocation. Você também precisa adicionar o espaço para nome mvc, mas pesquise no google se não souber como !;)

Isso funciona para mim

<mvc:default-servlet-handler/>

Saudações

Ayub Malik


quando adiciono esta linha, obtenho: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: a linha 31 no documento XML do recurso de caminho da classe [META-INF / spring / application-context.xml] é inválida; exceção aninhada é org.xml.sax.SAXParseException; lineNumber: 31; columnNumber: 35; cvc-complex-type.2.4.c: O curinga correspondente é rigoroso, mas nenhuma declaração pode ser encontrada para o elemento 'mvc: default-servlet-handler'.
Alex Worden

Certifique-se de lidar com a ordem do manipulador quando tiver outros resolvedores de exibição também.
phoenix

20

Se entendi seu problema corretamente, acho que encontrei uma solução para o seu problema:

Eu tive o mesmo problema em que a saída bruta foi mostrada sem estilos CSS, javascripts ou arquivos jquery encontrados.

Acabei de adicionar mapeamentos ao servlet "padrão". O seguinte foi adicionado ao arquivo web.xml:

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

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

Isso deve filtrar as solicitações de arquivos javascript e css do objeto DispatcherRequest.

Novamente, não tenho certeza se é isso que você procura, mas funcionou para mim. Eu acho que "padrão" é o nome do servlet padrão no JBoss. Não tenho muita certeza do que é para outros servidores.


1
Eu realmente não quiser usar o servlet- padrão que os casais me para jboss / tomcat
hamo

@ hamo por que isso é um problema? (esta é uma pergunta genuína, não uma réplica argumentativa). Você precisará estar executando o servidor (jboss / tomcat / jetty) de qualquer maneira para que a primavera funcione, certo?
Manav

3
E você pode adicionar todas as <url-pattern>tags dentro do mesmo<servlet-mapping>
Milanka 06/06

16

Há outro post de estouro de pilha que tem uma excelente solução .

Não parece específico do Tomcat, é simples e funciona muito bem. Eu tentei algumas das soluções neste post com o spring mvc 3.1, mas depois tive problemas para exibir meu conteúdo dinâmico.

Em resumo, ele diz adicionar um mapeamento de servlet como este:

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

11

Encontrei uma maneira de contornar isso usando o urlrewritefilter da tuckey. Por favor, sinta-se livre para dar uma resposta melhor se você tiver uma!

No web.xml:

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

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

No urlrewrite.xml:

<urlrewrite default-match-type="wildcard">
<rule>
    <from>/</from>
    <to>/app/</to>
</rule>
<rule match-type="regex">
    <from>^([^\.]+)$</from>
    <to>/app/$1</to>
</rule>
<outbound-rule>
    <from>/app/**</from>
    <to>/$1</to>
</outbound-rule>    

Isso significa que qualquer uri com um '.' nele (como style.css por exemplo) não será reescrito.


5
A melhor resposta é a primavera 3 <mvc:resources/>, como demonstrado por @Joris.
Paul

11

Acabei de lidar com esse problema no Spring MVC 3.0 e, inicialmente, fui com a opção UrlRewriteFilter. No entanto, não fiquei satisfeito com esta solução, pois "não parecia certa" (não sou a única - veja o link acima para os Fóruns do Spring, onde a palavra "hack" aparece algumas vezes).

Então, eu vim com uma solução semelhante ao "Unknown (Google)" acima, mas peguei emprestada a idéia de ter todo o conteúdo estático veiculado em / static / (extraído da versão Spring Roo do aplicativo Pet Store). O servlet "padrão" não funcionou para mim, mas o Spring Webflow ResourceServlet funcionou (também retirado do aplicativo gerado pelo Spring Roo).

Web.xml:

<servlet>
    <servlet-name>mainDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet>
    <servlet-name>Resource Servlet</servlet-name>
    <servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

<servlet-mapping>
    <servlet-name>Resource Servlet</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

A única alteração que fiz nas JSPs foi adicionar o caminho / static / aos URLs para CSS, JS e imagens. Por exemplo, "$ {pageContext.request.contextPath} /static/css/screen.css".

para usuários do Maven, a dependência de "org.springframework.js.resource.ResourceServlet" é:

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>org.springframework.js</artifactId>
    <version>2.0.8.RELEASE</version>
</dependency>

Não é uma solução ruim nickdos- obrigado! Ainda não entendi por que não existe um servlet de recursos no core spring mvc (em vez de precisar adicionar outra dependência com o fluxo da web) ou alguma outra solução pronta para uso. Urlrewrite funciona bem para mim, então eu vou ficar com isso por enquanto! Cheers, Hamo
hamo

2
Analisando a versão padrão (não Roo) do aplicativo Spring Pet Clinic, notei que a definição de servlet para "padrão" está comentada com o comentário adicional: "Descomente isso em contêineres (GlassFish) que não declaram isso definição implícita pronta para uso ". A declaração explícita do pacote por padrão é org.apache.catalina.servlets.DefaultServlet. Portanto, esse pode ser seu servlet de recurso "pronto para uso" (?). Eu uso o Jetty no trabalho de desenvolvimento e parece que o Jetty não fornece um servlet padrão implícito (como o Glassfish).
jan

8

Minha própria experiência com esse problema é a seguinte. A maioria das páginas da Web e livros relacionados ao Spring parecem sugerir que a sintaxe mais apropriada é a seguinte.

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

A sintaxe acima sugere que você pode colocar seus recursos estáticos (CSS, JavaScript, imagens) em uma pasta chamada "recursos" na raiz do seu aplicativo, ou seja, / webapp / resources /.

No entanto, na minha experiência (estou usando o Eclipse e o plug-in Tomcat), a única abordagem que funciona é se você colocar sua pasta de recursos dentro de WEB_INF (ou META-INF). Portanto, a sintaxe que eu recomendo é a seguinte.

    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />

No seu JSP (ou similar), faça referência ao recurso da seguinte maneira.

<script type="text/javascript"
        src="resources/my-javascript.js">
</script>

Desnecessário mencionar, toda a questão surgiu apenas porque eu queria que meu servlet do despachante Spring (controlador frontal) interceptasse tudo, tudo dinâmico, ou seja. Então, eu tenho o seguinte no meu web.xml.

<servlet>
    <servlet-name>front-controller</servlet-name>
    <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    <!-- spring automatically discovers /WEB-INF/<servlet-name>-servlet.xml -->
</servlet>

<servlet-mapping>
    <servlet-name>front-controller</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Por fim, como estou usando as melhores práticas atuais, tenho o seguinte no meu servlet de controlador frontal xml (veja acima).

<mvc:annotation-driven/>

E tenho o seguinte na implementação real do controlador, para garantir que eu tenha um método padrão para lidar com todas as solicitações recebidas.

@RequestMapping("/")

Eu espero que isso ajude.


Essa foi a única solução que funcionou para mim. Uma coisa interessante que notei é que novos recursos adicionados depois que iniciei o webapp não foram encontrados até uma reinicialização. Não faz sentido da perspectiva do usuário, mas não deve ser um grande problema na maioria das vezes.
Rafael Steil

Você contou com Tomcat perspectiva, impressionante :)
Sirra omkar

Eu tentei cada resposta nesta página. Felizmente, quando cheguei a este, não preciso mais tentar.
TimeTrax

6

Eu tive o mesmo problema e achei a resposta de Joris muito útil. Mas além disso eu preciso adicionar

<mvc:annotation-driven /> 

para o arquivo de configuração do servlet. Sem esse recurso, o mapeamento não funcionará e todos os manipuladores deixarão de funcionar. Espero que isso ajude alguém.


2

O URLRewrite é uma espécie de "hack", se você quiser chamar assim. O que se resume é que você está reinventando a roda; pois já existem soluções. Outra coisa a lembrar é o servidor HTTP = conteúdo estático e servidor de aplicativos = conteúdo dinâmico (é assim que eles foram projetados). Ao delegar as responsabilidades apropriadas para cada servidor, você maximiza a eficiência ... mas hoje em dia isso provavelmente é apenas uma preocupação em ambientes críticos de desempenho e algo como o Tomcat provavelmente funcionaria bem nas duas funções na maioria das vezes; mas ainda é algo a ter em mente.


2

Eu resolvi assim:

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

Isso funciona no Tomcat e no Jboss, é claro. No entanto, no final, decidi usar a solução que o Spring fornece (como mencionado por rozky), que é muito mais portátil.


2

Usei as duas formas urlrewrite e anotação com base no spring mvc 3.0.xe descobri que a abordagem baseada em anotação é a mais adequada.

<annotation-driven />

<resources mapping="/resources/**" location="/resources/" />

No caso de urlrewrite, é necessário definir várias regras e, por algum tempo, também obter exceção de classe não encontrada para UrlRewriteFilter, já que a dependência foi fornecida. Descobri que isso está acontecendo devido à presença de dependência transitiva; portanto, mais uma etapa aumentará e será necessário excluir essa dependência do pom.xml usando

<exclusion></exclusion> tags.

Portanto, a abordagem baseada em anotação será o bom negócio.


2

A partir da primavera 3, todos os recursos precisam ser mapeados de uma maneira diferente. Você precisa usar a tag para especificar a localização dos recursos.

Exemplo:

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

Dessa maneira, você está direcionando o servlet do dispatcher a procurar nos recursos de diretório para procurar o conteúdo estático.


1

Minha maneira de resolver esse problema é colocar todas as suas ações com um prefixo específico como "web" ou "serviço" e configurar que todas as URLs com esse prefixo serão interceptadas pelo DispatcherServlet.


1

Acabei de adicionar três regras antes da regra padrão da primavera (/ **) ao urlrewritefilter da tuckey (urlrewrite.xml) para resolver o problema

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
    <urlrewrite default-match-type="wildcard">
     <rule>
      <from>/</from>
      <to>/app/welcome</to>
     </rule>
     <rule>
      <from>/scripts/**</from>
      <to>/scripts/$1</to>
     </rule>
     <rule>
      <from>/styles/**</from>
      <to>/styles/$1</to>
     </rule>
     <rule>
      <from>/images/**</from>
      <to>/images/$1</to>
     </rule>
     <rule>
      <from>/**</from>
      <to>/app/$1</to>
     </rule>
     <outbound-rule>
      <from>/app/**</from>
      <to>/$1</to>
     </outbound-rule> 
    </urlrewrite>

1

Sei que existem algumas configurações para usar o conteúdo estático, mas minha solução é criar uma pasta de aplicativos Web em massa no seu tomcat. Esse "webapp em massa" serve apenas todo o conteúdo estático sem exibir aplicativos. Esta é uma solução fácil e sem dor para fornecer conteúdo estático ao seu webapp de primavera real.

Por exemplo, estou usando duas pastas de aplicativos da web no meu tomcat.

  1. springapp : está executando apenas o aplicativo da web spring sem conteúdo estático como imgs, js ou css. (dedicado para aplicativos da primavera.)
  2. recursos : está servindo apenas o conteúdo estático sem JSP, servlet ou qualquer tipo de aplicativo da web java. (dedicado ao conteúdo estático)

Se eu quiser usar o javascript, basta adicionar o URI para o meu arquivo javascript.

EX> /resources/path/to/js/myjavascript.js

Para imagens estáticas, estou usando o mesmo método.

EX> /resources/path/to/img/myimg.jpg

Por último, eu coloquei " restrição de segurança " no meu tomcat para bloquear o acesso ao diretório real. Eu coloquei "ninguém" rolagem de usuário na restrição, para que a página gere "403 erro proibido" quando as pessoas tentavam acessar o caminho do conteúdo estático.

Até agora, funciona muito bem para mim. Também notei que muitos sites populares como Amazon, Twitter e Facebook estão usando URI diferente para veicular conteúdo estático. Para descobrir isso, clique com o botão direito do mouse em qualquer conteúdo estático e verifique seu URI.


1

Isso fez o trabalho real no meu caso

no web.xml:

...
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/images/*</url-pattern>
    <url-pattern>/css/*</url-pattern>
    <url-pattern>/javascripts/*</url-pattern>
</servlet-mapping>


<servlet-mapping>
    <servlet-name>spring-mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

...


1

Para configuração de mola baseada em java, você pode usar o seguinte

Usando ResourceHandlerRegistry que armazena registros de manipuladores de recursos para servir recursos estáticos.

Mais informações @ WebMvcConfigurerAdapter, que define métodos de retorno de chamada para personalizar a configuração baseada em Java para o Spring MVC ativada via @EnableWebMvc.

@EnableWebMvc
@Configurable
@ComponentScan("package.to.scan")
public class WebConfigurer extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static_resource_path/*.jpg").addResourceLocations("server_destination_path");

    }

0

Depois de encontrar e passar pelo mesmo processo de tomada de decisão descrito aqui, decidi seguir a proposta do ResourceServlet, que funciona muito bem.

Observe que você obtém mais informações sobre como usar o fluxo da web em seu processo de criação do maven aqui: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html

Se você usar o repositório central padrão do Maven, o artefato é (oposto ao pacote de fontes de fontes acima mencionado):

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>spring-js</artifactId>
    <version>2.0.9.RELEASE</version>
</dependency> 

0

Isso pode ser conseguido de pelo menos três maneiras.

Soluções :

  • expor o html como um arquivo de recurso
  • instrua o JspServlet a também manipular solicitações * .html
  • escreva seu próprio servlet (ou passe para outras solicitações de servlet existentes em * .html).

Para obter exemplos completos de código, como conseguir isso, consulte a minha resposta em outra postagem: Como mapear solicitações para o arquivo HTML no Spring MVC?


0

O problema é com URLPattern

Altere seu padrão de URL no mapeamento do servlet de "/" para "/ *"


0
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:default-servlet-handler/>
</beans>

e se você quiser usar a configuração baseada em anotação, use o código abaixo

@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

0

Coloque o conteúdo estático como css, js no caminho a seguir

resources 
        ->static
               ->css
               ->js
(or) 
resources 
        ->public
               ->css
               ->js
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.