Aggiunta di risorse esterne (CSS / JavaScript / immagini ecc.) In JSP

Ho aggiunto un foglio di stile CSS esterno al mio progetto e inserito nella cartella WEB-CONTENTS del mio progetto in Eclipse. Quando l’ho distribuito su Tomcat, il foglio di stile non è stato applicato. Quando ho eseguito il debug in Chrome e l’ho aperto, mi ha dato errore 404 file not found . Perché è questo e come risolverlo?

Ecco il codice:

       joined now     
this is at the top

Il motivo per cui si ottiene l’errore 404 File Not Found è che il percorso per CSS assegnato come valore all’attributo href è privo del percorso di contesto .

Un URL di richiesta HTTP contiene le seguenti parti:

 http://[host]:[port][request-path]?[query-string] 

Il percorso della richiesta è inoltre composto dai seguenti elementi:

  • Percorso di contesto : una concatenazione di una barra (/) con la root di contesto dell’applicazione web del servlet. Esempio: http://host[:port]/context-root[/url-pattern]

  • Percorso servlet : la sezione del percorso che corrisponde all’alias del componente che ha triggersto questa richiesta. Questo percorso inizia con una barra (/).

  • Informazioni sul percorso : la parte del percorso della richiesta che non fa parte del percorso di contesto o del percorso del servlet.

Leggi di più qui .


soluzioni

Ci sono diverse soluzioni al tuo problema, eccone alcune:

1) Usando il di JSTL

Nelle mie applicazioni web Java solitamente usavo il tag di JSTL quando definivo il percorso per CSS / JavaScript / immagine e altre risorse statiche. In questo modo si può essere sicuri che tali risorse siano sempre riferite al contesto dell’applicazione (percorso di contesto).

Se dici che il tuo CSS si trova nella cartella WebContent , allora dovrebbe funzionare:

 " /> 

La ragione per cui funziona è spiegata nella “Versione 1.2 delle librerie standard delle librerie standard di JavaServer Pages ™ ” capitolo 7.5 (enfasi mia):

7.5
Crea un URL con le giuste regole di riscrittura applicate.

L’URL deve essere un URL assoluto che inizia con uno schema (ad esempio “http: // server / context / page.jsp”) o un URL relativo come definito da JSP 1.2 in JSP.2.2.1 “Specifica URL relativa”. Di conseguenza, un’implementazione deve anteporre il percorso di contesto a un URL che inizia con una barra (ad esempio “/page2.jsp”) in modo che tali URL possano essere interpretati correttamente da un browser client.

NOTA
Non dimenticare di usare la direttiva Taglib nel tuo JSP per poter fare riferimento ai tag JSTL . Vedi anche una pagina JSP di esempio qui .

2) Uso del linguaggio di espressione JSP e oggetti impliciti

Una soluzione alternativa utilizza Expression Language (EL) per aggiungere il contesto dell’applicazione:

  

Qui abbiamo recuperato il percorso di contesto dall’object richiesta . E per accedere all’object richiesta abbiamo usato l’ object implicito pageContext .

3) Utilizzo del da JSTL

NEGAZIONE
L’idea di questa soluzione è stata presa da qui .

Per rendere l’accesso al percorso di contesto più compatto rispetto alla soluzione №2, è ansible utilizzare innanzitutto il JSTL , che imposta il valore di una variabile EL o la proprietà di una variabile EL in uno qualsiasi degli ambiti JSP ( pagina, richiesta, sessione o applicazione) per l’accesso successivo.

  ...  

NOTA IMPORTANTE
Per impostazione predefinita, per impostare la variabile in modo tale, il JSP che contiene questo tag set deve essere accessibile almeno una volta (anche in caso di impostazione del valore nello scope dell’applicazione utilizzando l’attributo scope , come ), prima di usare questa nuova variabile. Ad esempio, puoi avere diversi file JSP in cui ti serve questa variabile. Quindi è necessario etere a) entrambi impostano la nuova variabile tenendo il percorso di contesto nello scope di applicazione E accedono prima a questo JSP, prima di utilizzare questa variabile in altri file JSP, o b) impostano questa variabile di mantenimento del percorso di contesto in OGNI file JSP, dove è necessario per accedervi.

4) Utilizzo di ServletContextListener

Il modo più efficace per rendere più compatto l’accesso al percorso di contesto è impostare una variabile che trattiene il percorso di contesto e lo memorizza nello scope dell’applicazione utilizzando un Listener . Questa soluzione è simile alla soluzione №3, ma il vantaggio è che ora il percorso di contesto di mantenimento variabile è impostato proprio all’inizio dell’applicazione Web ed è disponibile a livello di applicazione, senza necessità di ulteriori passaggi.

Abbiamo bisogno di una class che implementa l’interfaccia ServletContextListener . Ecco un esempio di tale class:

 package com.example.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class AppContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent event) { ServletContext sc = event.getServletContext(); sc.setAttribute("ctx", sc.getContextPath()); } @Override public void contextDestroyed(ServletContextEvent event) {} } 

Ora in un JSP possiamo accedere a questa variabile globale usando EL:

  

NOTA
L’ annotazione @WebListener è disponibile da Servlet versione 3.0. Se si utilizza un contenitore servlet o un server applicazioni che supporta specifiche Servlet precedenti, rimuovere l’annotazione @WebServlet e configurare invece il listener nel descrittore di distribuzione (web.xml). Ecco un esempio di file web.xml per il contenitore che supporta la massima versione Servlet 2.5 (altre configurazioni sono omesse per brevità):

   ...  com.example.listener.AppContextListener  ...  

5) Uso degli scriptlet

Come suggerito dall’utente @gavenkoa puoi anche usare scriptlet come questo:

 <%= request.getContextPath() %> 

Per una cosa così piccola è probabilmente OK, basta notare che generalmente l’uso di scriptlet in JSP è sconsigliato .

Conclusione

Personalmente preferisco la prima soluzione (l’ho usata nei miei progetti precedenti la maggior parte del tempo) o la seconda, poiché sono più chiare, intuitive e non ambigue (IMHO). Ma tu scegli ciò che più ti aggrada.


Altri pensieri

È ansible distribuire l’app Web come applicazione predefinita (ovvero nel contesto di root predefinito ), quindi è ansible accedervi senza specificare il percorso di contesto . Per maggiori informazioni leggi la sezione “Aggiorna” qui .

Usando il seguente codice risolvi questa domanda …. Se esegui un file usando il server localhost di questo problema risolvilo seguendo il codice pagina Jsp.Questo codice inserisce tra tag head nel file jsp