Come gestire il percorso del file quando si accede dal percorso diverso?
-
28-09-2019 - |
Domanda
Ho alcune pagine web che si siedono in directory diverse e il mio obiettivo è quello di avere un qualche tipo di struttura organizzata in modo che io possa accedere a JS o file CSS, senza hardcoding il percorso.
Per esempio, la struttura di directory è:
root --- js --- some.js
|
|--css --- some.css
|
|---pages ---- main.jsp
|
|---other----foo---- foo.jsp
|
|--bar --- bar.jsp
Poi main.jsp e foo.jsp tenta di fare riferimento some.js ma deve avere percorso diverso.
( main.jsp )
<script type="text/javascript" src="../js/some.js"></script>
( foo.jsp)
<script type="text/javascript" src="../../js/some.js"></script>
Questa non è l'ideale se voglio cambiare la posizione del main.jsp o foo.jsp, devo tornare a ogni file e modificare il percorso manualmente.
Sto pensando di avere classe factory che ha percorso completo per ogni file in modo che esso sarebbe simile:
<script type="text/javascript" src=<% Factory.getFullPath(some.js) %> ></script>
In questo caso, posso ancora spostare i file liberamente e non devono tornare a ciascun file.
Posso ottenere qualche opinione al mio approccio? C'è altro modo per risolvere questo problema?
Soluzione
Usa un percorso al contesto relativo. Si farà il percorso assoluto alla radice del dominio. È possibile ottenere il percorso del contesto da HttpServletRequest#getContextPath()
. In JSP, il HttpServletRequest
è disponibile da ${pageContext.request}
.
<script type="text/javascript" src="${pageContext.request.contextPath}/js/some.js"></script>
(la contextPath
sé inizia già con un /
, quindi non c'è bisogno di prefisso da soli)
È anche possibile impostare utilizzando il HTML <base>
tag in modo che tutti URL relativo nella pagina diventa relativo ad esso. In questo modo non c'è bisogno di copiare ${pageContext.request.contextPath}
su tutto il luogo.
<base href="${pageContext.request.contextPath}"></base>
<script type="text/javascript" src="js/some.js"></script>
Questo ha però un avvertimento: ancore, come <a href="#foo">
diventerà anche rispetto ad esso. È necessario tener conto di questo e se si va per questo.
Vedi anche:
Altri suggerimenti
mm Io non sono veramente sicuro se una fabbrica è il modo più appropriato per fare questo, forse funzionerà .. Ricordo che per che ho usato un'interfaccia in cui ho implementato alcune costanti, tra cui il percorso JS e la cartella CSS
public interface Configuration {
public static final String SERVER_URL = "http://localhost:8080/";
public static final String CSS_URL = SERVER_URL + "css/";
public static final String JS_URL = SERVER_URL + "js/";
}
e quindi avrei dovuto importare questa interfaccia nella servlet e chiamare in questo modo:
...src="<% Configuration.JS_URL %>some.js" />..
In questo modo se si cambia il nome delle cartelle o percorso. dovrai solo modificare la configurazione