Pergunta

Eu estou tentando escrever um aplicativo web usando SpringMVC. Normalmente eu apenas mapear alguns extensão de arquivo fez-se ao controlador frente da Primavera e viver feliz, mas desta vez eu vou para REST como URLs, sem nenhuma extensões de nome de arquivo.

Mapeamento tudo sob o meu caminho de contexto para o controlador de frente (vamos chamá-lo " aplicativo ") significa que eu deveria cuidar de arquivos estáticos também, algo que eu prefiro não fazer (Por que reinventar mais uma weel?), de modo algum combinação com servlet padrão do tomcat (vamos chamá-lo " tomcat ") parece ser o caminho a percorrer.

Eu tenho a coisa para o trabalho fazendo algo como

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

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

e repetindo esta última para cada uma das extensões do meu conteúdo estático de arquivo. Eu só estou perguntando por que as seguintes configurações, o que para mim são equivalentes ao de cima, e não fazer o trabalho.

<!-- failed attempt #1 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

<!-- failed attempt #2 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

Alguém pode lançar alguma luz?

Foi útil?

Solução

Eu acho que eu saiba o que está acontecendo.

Em seu web.xml de trabalho tiver definido o servlet para ser o servlet padrão (/ por si só é o servlet padrão chamado se não há outros jogos), ele irá responder a qualquer solicitação que não corresponde a outro mapeamento.

Em Falha 1 o / * mapeamento parece ser um mapeamento caminho válido. Com o * mapeamento / em web.xml ele atenderá todas as solicitações, exceto outros mapeamentos de caminho. De acordo com a especificação mapeamentos de extensão são mapeamentos implícitos que são substituídos por mapeamentos explícitos. É por isso que o mapeamento de extensão falhou. Tudo foi explicitamente mapeado para aplicação.

Em Falha 2, App é responsável por tudo, exceto o conteúdo que corresponde ao mapeamento de conteúdo estático. Para mostrar o que está acontecendo no teste rápido eu configurar. Aqui está um exemplo. /some-static-content-folder/ contém test.png

Tentando acesso test.png eu tentei:

/some-static-content-folder/test.png

e o arquivo não foi encontrado. No entanto tentando

/some-static-content-folder/some-static-content-folder/test.png

ele vem para cima. Assim, parece que o servlet padrão Tomcat (6.0.16, pelo menos) descarta o mapeamento de servlet e tentará encontrar o arquivo usando o caminho restante. De acordo com este post Servlet para servir conteúdo estático Jetty dá o comportamento que você e eu estava esperando.

Existe algum motivo você não pode fazer algo como mapear um diretório raiz para as suas chamadas de descanso. Algo como aplicativo mapeado para / rest_root / * do que você é responsável por tudo o que se passa na pasta rest_root, mas em qualquer outro lugar deve ser manuseado por Tomcat, a menos que você faça outro mapeamento explícito. Sugiro a criação sua servlet resto para um mapeamento caminho, porque declara a intenção melhor. Usando / ou / * não parece apropriado, pois você tem que mapear as exceções. Usando SO como um exemplo, meus mapeamentos de descanso seria algo como

/ users / * para o servlet de usuário

/ posts / * para os cargos servlet

ordem Mapeamento

  1. explícita (mapeamentos de caminho)
  2. implícito (mapeamentos de extensão)
  3. Padrão (/)

Corrija qualquer coisa que eu tenho errado.

Outras dicas

Para referência, a "tentativa fracassada # 2" é perfeitamente correto em versão do Tomcat> = a 6.0.29.

Foi o resultado de um erro do Tomcat que ficar fixo na versão 6.0.29:

https://issues.apache.org/bugzilla/show_bug.cgi? id = 50026

<!-- Correct for Tomcat >= 6.0.29 or other Servlet containers -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

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

Eu nunca tentou mapear um servlet como este, mas eu se argumentam que * faz tecnicamente tanto start / com / e terminam com / *, embora o mesmo personagem é usado tanto para partidas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top