<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?
/**
padrão indica?Eu gostaria de complementar a resposta do BalusC com as regras de mapeamento e um exemplo.
Regras de mapeamento da especificação Servlet 2.5:
No nosso exemplo, existem três servlets. / é o servlet padrão instalado por nós. O Tomcat instala dois servlets para servir jsp e jspx. Então, para mapear
http://host:port/context/hello
Mapear
http://host:port/context/hello.jsp
fonte
Talvez você precise saber como os URLs também são mapeados, pois sofri
404
por horas. Existem dois tipos de manipuladores que manipulam solicitações.BeanNameUrlHandlerMapping
eSimpleUrlHandlerMapping
. Quando definimos aservlet-mapping
, estamos usandoSimpleUrlHandlerMapping
. Uma coisa que precisamos saber é que esses dois manipuladores compartilham uma propriedade comum denominadaalwaysUseFullPath
padrãofalse
.false
aqui significa que o Spring não usará o caminho completo para mapear um URL para um controlador. O que isso significa? Significa quando você define umservlet-mapping
:o manipulador realmente usará a
*
peça para encontrar o controlador. Por exemplo, o seguinte controlador enfrentará um404
erro quando você o solicitar usando/perfix/api/feature/doSomething
É uma combinação perfeita, certo? Mas por que
404
. Como mencionado anteriormente, o valor padrão dealwaysUseFullPath
é false, o que significa que, em sua solicitação,/api/feature/doSomething
é usado apenas para encontrar um Controlador correspondente, mas não há Controlador que se importe com esse caminho. Você precisa alterar seu URL/perfix/perfix/api/feature/doSomething
ou removerperfix
da base do MyController@RequestingMapping
.fonte
Acho que a resposta de Candy está correta. Há uma pequena parte que penso de outra forma.
Para mapear o host: port / context / hello.jsp
Eu acredito que por que "/ *" não corresponde a host: port / context / hello porque trata "/ hello" como um caminho em vez de um arquivo (já que não possui uma extensão).
fonte
A diferença essencial entre
/*
e/
é que um servlet com mapeamento/*
será selecionado antes de qualquer servlet com um mapeamento de extensão (como*.html
), enquanto um servlet com mapeamento/
será selecionado somente depois que os mapeamentos de extensão forem considerados (e será usado para qualquer solicitação que não seja ' não corresponde a mais nada - é o "servlet padrão").Em particular, um
/*
mapeamento sempre será selecionado antes de um/
mapeamento. Isso impede que qualquer solicitação alcance o servlet padrão do contêiner.Qualquer um deles será selecionado somente após os mapeamentos de servlet que são correspondências exatas (como
/foo/bar
) e aqueles que são mapeamentos de caminho mais longos que/*
(como/foo/*
). Observe que o mapeamento de string vazio é uma correspondência exata para a raiz de contexto (http://host:port/context/
).Consulte o Capítulo 12 da Java Servlet Specification, disponível na versão 3.1 em http://download.oracle.com/otndocs/jcp/servlet-3_1-fr-eval-spec/index.html .
fonte