<url-pattern>/*</url-pattern>
O /*
em um servlet substitui todos os outros servlets, incluindo todos os servlets fornecidos pelo servletcontainer, como o servlet padrão e o servlet JSP. Qualquer que seja o pedido que você acionar, ele terminará nesse servlet. Portanto, esse é um padrão de URL incorreto para servlets. Normalmente, você gostaria de usar apenas /*
um Filter
. Ele pode permitir que a solicitação continue para qualquer um dos servlets que estão ouvindo um padrão de URL mais específico, chamando FilterChain#doFilter()
.
<url-pattern>/</url-pattern>
O /
não substitui nenhum outro servlet. Ele substitui apenas o servlet padrão interno do contêiner de servlet para todas as solicitações que não correspondem a nenhum outro servlet registrado. Normalmente, isso é chamado apenas em recursos estáticos (CSS / JS / image / etc) e em listas de diretórios. O servlet padrão interno do contêiner de servlet também é capaz de lidar com solicitações de cache HTTP, streaming de mídia (áudio / vídeo) e o download de arquivos. Normalmente, você não deseja substituir o servlet padrão, pois, caso contrário, teria que cuidar de todas as suas tarefas, o que não é exatamente trivial (a biblioteca de utilitários JSF OmniFaces tem um exemplo de código aberto ) Portanto, esse também é um padrão de URL incorreto para servlets. Quanto ao motivo pelo qual as páginas JSP não atingem esse servlet, é porque o servlet JSP interno do contêiner será chamado, o que já é mapeado por padrão no padrão de URL mais específico *.jsp
.
<url-pattern></url-pattern>
Depois, há também o padrão de URL de string vazio
. Isso será chamado quando a raiz de contexto for solicitada. Isso é diferente da <welcome-file>
abordagem que não é chamada quando qualquer subpasta é solicitada. Esse provavelmente é o padrão de URL que você está procurando, caso deseje um " servlet da página inicial ". Eu só tenho que admitir que esperaria intuitivamente que o padrão de URL de string vazio
e o padrão de URL de barra /
fossem definidos exatamente ao contrário, para que eu entenda que muitos iniciantes ficaram confusos com isso. Mas é o que é.
Controlador Frontal
No caso de você realmente pretende ter um servlet controlador de frente, então você tinha melhor mapeá-lo em um padrão de URL mais específico, como *.html
, *.do
, /pages/*
, /app/*
, etc. Você pode esconder os recursos estáticos padrão de URL controlador frontal e tampa sobre um padrão de URL comum como /resources/*
, /static/*
etc, com a ajuda de um filtro de servlet. Consulte também Como impedir que recursos estáticos sejam manipulados pelo servlet do controlador frontal que é mapeado em / * . Deve-se notar que o Spring MVC possui um servlet de recursos estáticos embutido; é por isso que você pode mapear seu controlador frontal /
se configurar um padrão de URL comum para recursos estáticos no Spring. Consulte também Como lidar com conteúdo estático no Spring MVC?