Estou desenvolvendo um webapp usando o Spring MVC 3 e tenho DispatcherServlet
todos 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?
fonte
Respostas:
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:
O conteúdo dos arquivos deve se parecer com:
src / springmvc / web / HelloWorldController.java:
WebContent / WEB-INF / web.xml:
WebContent / WEB-INF / springmvc-servlet.xml:
WebContent / jsp / index.jsp:
Espero que isto ajude :-)
fonte
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
fonte
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
Saudações
Ayub Malik
fonte
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:
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.
fonte
<url-pattern>
tags dentro do mesmo<servlet-mapping>
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:
fonte
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:
No urlrewrite.xml:
Isso significa que qualquer uri com um '.' nele (como style.css por exemplo) não será reescrito.
fonte
<mvc:resources/>
, como demonstrado por @Joris.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:
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" é:
fonte
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.
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.
No seu JSP (ou similar), faça referência ao recurso da seguinte maneira.
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.
Por fim, como estou usando as melhores práticas atuais, tenho o seguinte no meu servlet de controlador frontal xml (veja acima).
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.
Eu espero que isso ajude.
fonte
Eu tive o mesmo problema e achei a resposta de Joris muito útil. Mas além disso eu preciso adicionar
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.
fonte
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.
fonte
Eu resolvi assim:
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.
fonte
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.
Portanto, a abordagem baseada em anotação será o bom negócio.
fonte
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:
Dessa maneira, você está direcionando o servlet do dispatcher a procurar nos recursos de diretório para procurar o conteúdo estático.
fonte
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.
fonte
Acabei de adicionar três regras antes da regra padrão da primavera (/ **) ao urlrewritefilter da tuckey (urlrewrite.xml) para resolver o problema
fonte
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.
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.
fonte
Isso fez o trabalho real no meu caso
no web.xml:
...
fonte
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.
fonte
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):
fonte
Isso pode ser conseguido de pelo menos três maneiras.
Soluções :
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?
fonte
O problema é com URLPattern
Altere seu padrão de URL no mapeamento do servlet de "/" para "/ *"
fonte
e se você quiser usar a configuração baseada em anotação, use o código abaixo
fonte
Coloque o conteúdo estático como css, js no caminho a seguir
fonte