O navegador não pode acessar / encontrar resources relativos como CSS, imagens e links ao chamar um Servlet que encaminha para um JSP

Estou com problemas ao carregar CSS e imagens e criar links para outras páginas quando tenho um servlet encaminhado para um JSP. Especificamente, quando eu defino meu para index.jsp , o CSS está sendo carregado e minhas imagens estão sendo exibidas. No entanto, se eu definir meu para HomeServlet que encaminha o controle para index.jsp , o CSS não será aplicado e minhas imagens não serão exibidas.

Meu arquivo CSS está em web/styles/default.css .
Minhas imagens estão na web/images/ .

Estou ligando para o meu CSS assim:

  

Estou exibindo minhas imagens da seguinte maneira:

 Image1 

Como este problema é causado e como posso resolvê-lo?


Atualização 1 : adicionei a estrutura do aplicativo, bem como algumas outras informações que podem ajudar.

texto alternativo

O arquivo header.jsp é o arquivo que contém a tag de link para o CSS. O HomeServlet está configurado como meu welcome-file no web.xml :

  HomeServlet  

O servlet é declarado e mapeado como segue no web.xml :

  HomeServlet com.brianblog.frontend.HomeServlet   HomeServlet /  

Atualização 2 : Eu encontrei o problema finalmente – meu servlet foi mapeado incorretamente. Aparentemente, ao configurar um Servlet como seu ele não pode ter um padrão de URL de / , o que eu acho estranho, porque não seria o diretório raiz do site?

O novo mapeamento é o seguinte:

  HomeServlet /HomeServlet  

Todas as URLs relativas na página HTML geradas pelo arquivo JSP são relativas à URL de solicitação atual (a URL como você vê na barra de endereço do navegador) e não à localização do arquivo JSP no lado do servidor, como você parece esperar. É o navegador que tem que baixar esses resources individualmente por URL, não o servidor que tem que incluí-los do disco de alguma forma.

Além de alterar as URLs relativas para torná-las relativas à URL do servlet em vez da localização do arquivo JSP, outra maneira de corrigir esse problema é torná-las relativas à raiz do domínio (isto é, iniciar com um / ). Dessa forma, você não precisa se preocupar em alterar os caminhos relativos novamente quando alterar o URL do servlet.

       link 

No entanto, você provavelmente não gostaria de codificar o caminho do contexto. Muito razoável. Você pode obter o caminho do contexto em EL por ${pageContext.request.contextPath} .

       link 

(que pode ser facilmente abreviado por e usado como ${root} outro lugar)

Ou, se você não temer o XML ilegível e o destaque da syntax XML quebrada, use o JSTL :

  " /> ">   " /> ">link 
">

De qualquer maneira, isso é bastante complicado se você tiver muitos URLs relativos. Para isso, você pode usar a tag . Todas as URLs relativas serão instantaneamente relativas a elas. No entanto, deve começar com o esquema ( http:// , https:// , etc). Não existe uma maneira simples de obter o caminho do contexto base no EL simples, então precisamos de uma pequena ajuda do JSTL aqui.

 < %@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> < %@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>   ${req.requestURL} ...        link 

Isto por sua vez (novamente) algumas ressalvas. Âncoras (as #identifier URL’s) também se tornarão relativas ao caminho base! Você gostaria de torná-lo relativo ao URL de solicitação (URI). Então, mude como

 jump 

para

 jump 

Cada maneira tem suas próprias vantagens e desvantagens. Cabe a você escolher qual. Pelo menos, você deve entender como esse problema é causado e como resolvê-lo 🙂

Veja também:

  • É recomendado usar a tag html ?

Eu enfrentei um problema semelhante com o aplicativo Spring MVC. Eu usei a tag < mvc:resources > para resolver esse problema.

Por favor, encontre o seguinte link com mais detalhes.

http://www.mkyong.com/spring-mvc/spring-mvc-how-to-include-js-or-css-files-in-a-jsp-page/

Você deve analisar a saída HTML real, para a dica.

Dando o caminho como este significa “da localização atual”, por outro lado, se você começar com um / isso significaria “do contexto”.

Sua página de boas vindas está definida como esse servlet. Portanto, todo caminho de css, imagens deve ser dado em relação a esse servlet DIR. o que é uma má ideia! Por que você precisa do servlet como uma home page? definir .jsp como página de índice e redirect para qualquer página de lá?

você está tentando preencher os campos do database é por isso que você está usando o servlet?

Se você estiver usando o Spring MVC, precisará declarar o servlet de ação padrão para o conteúdo estático. Adicione as seguintes inputs no spring-action-servlet.xml. Isso funcionou para mim.

NOTA: mantenha todo o conteúdo estático fora do WEB-INF.

         

Quanto à sua atualização, fiquei confuso com o raciocínio por trás dentro cavou um pouco mais e encontrou esta jóia:

  • yoursite.com se torna yoursite.com/
  • yoursite.com/ é um diretório, portanto, a lista de arquivos de boas-vindas é verificada
  • yoursite.com/CMS é o primeiro arquivo de boas-vindas (“CMS” na welcome-file-list), e há um mapeamento de / CMS para o servlet MyCMS, para que o servlet seja acessado.

Fonte: http://wiki.metawerx.net/wiki/HowToUseAServletAsYourMainWebPage

Então, o mapeamento faz sentido.

E agora é possível usar livremente $ {pageContext.request.contextPath} / path / as como src / href para links relativos!

resposta curta – adicione a seguinte linha no jsp que definirá a base
base href = “/ {raiz do seu aplicativo} /”

Abaixo do código funcionou para mim.

em vez de usar < % @ include file = "styles / default.css"%>