Як використовувати відносні шляхи, не включаючи ім'я кореневого контексту?


78

Для роботи зі своїм статичним файлом (CSS, JS) я повинен написати абсолютний шлях, як /AppName/templates/style/main.css. Чи є якесь рішення, яке я міг би написати відносний шлях, як style/main.css?


2
Чому (і де ) ви повинні написати повний шлях? Майже де завгодно, про яке я можу згадати, style/main.cssмає працювати. Цілком можуть бути місця, де цього немає, але, не кажучи людям, що ви насправді намагаєтесь зробити, дуже важко буде сказати, чи можуть люди допомогти вам.
TJ Crowder,

Я просто хочу зв’язати файл css зі своєю jsp-сторінкою. Я не писав пояснення, оскільки це було найпростішим і єдиним способом використання зображень, тому я думаю, що всі здогадуються. Навіть так: вибачте. Моя помилка ...
kspacja

Відповіді:


168

Якщо ваша реальна проблема - динамічність контексту веб-додатка (частина "AppName"), тоді просто отримайте його динамічно за HttpServletRequest#getContextPath().

<head>
    <link rel="stylesheet" href="${pageContext.request.contextPath}/templates/style/main.css" />
    <script src="${pageContext.request.contextPath}/templates/js/main.js"></script>
    <script>var base = "${pageContext.request.contextPath}";</script>
</head>
<body>
    <a href="${pageContext.request.contextPath}/pages/foo.jsp">link</a>
</body>

Якщо ви хочете встановити базовий шлях для всіх відносних посилань, так що вам не потрібно повторюватись ${pageContext.request.contextPath}у кожному відносному посиланні, використовуйте <base>тег. Ось приклад за допомогою функцій JSTL .

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<head>
    <c:set var="url">${pageContext.request.requestURL}</c:set>
    <base href="${fn:substring(url, 0, fn:length(url) - fn:length(pageContext.request.requestURI))}${pageContext.request.contextPath}/" />
    <link rel="stylesheet" href="templates/style/main.css" />
    <script src="templates/js/main.js"></script>
    <script>var base = document.getElementsByTagName("base")[0].href;</script>
</head>
<body>
    <a href="pages/foo.jsp">link</a>
</body>

Таким чином кожне відносне посилання (тобто, не починаючи з /або схеми) стане відносно <base>.

Це, до речі, ніяк конкретно не пов'язано з Tomcat. Це просто пов’язано з основами HTTP / HTML. Ви мали б однакову проблему на кожному іншому веб-сервері.

Дивитися також:


я не використовую pageContext.request.contextPath, і я не бачу, коли мені це дійсно потрібно, я можу змінити властивості проекту в netbeans для контексту, чи можете ви пояснити більше
shareef

1
$ {pageContext ... у мене не працює. Просто генерує щось на зразок localhost: 8080 / profile / $% 7BpageContext.request.context% 7D / css / profile /
MegaMatt

5
@Matt: оновлення принаймні до JSP 2.0 (випущено десять років тому). Як варіант, використовуйте <c:out>. Бути повним невігласом і мати дуже устарену версію програмного забезпечення - це не справедлива причина для того, щоб голосувати проти, до речі.
BalusC

1
@Vnge: просто нехай JSP друкує його як змінну JS?
BalusC

1
@Natix: Перерва? Він призначений як основна URL-адреса всіх відносних URL-адрес. Дивіться також ao stackoverflow.com/a/1889957 Тільки не використовуйте його, якщо це не відповідає вашим технічним реалізаціям.
BalusC

21

Просто використовуйте <c:url>-tag із відносним шляхом контексту додатка.

Коли valueпараметр починається з /, тоді тег буде розглядати його як відносну URL-адресу програми та додаватиме назву програми до URL-адреси. Приклад:

jsp:

<c:url value="/templates/style/main.css" var="mainCssUrl" />`
<link rel="stylesheet" href="${mainCssUrl}" />
...
<c:url value="/home" var="homeUrl" />`
<a href="${homeUrl}">home link</a>

стане таким html, з відносною URL-адресою домену:

<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>

2

Ви запускаєте tomcat з якогось каталогу - це $ cwd для tomcat. Ви можете вказати будь-який шлях щодо цього $ cwd.

припустимо, у вас є

home
- tomcat
 |_bin
- cssStore
 |_file.css

І припустимо, ви запускаєте tomcat з ~ / tomcat, використовуючи команду "bin / startup.sh".

~ / tomcat стає домашньою директорією ($ cwd) для tomcat

Зараз ви можете отримати доступ до "../cssStore/file.css" із файлів класів у вашому сервлеті

Надія, що допомагає, - сс


2

Замість використання цілого посилання ми можемо зробити, як показано нижче (рішення стосується JSP-файлів)

За допомогою JSTL ми можемо зробити це так: Щоб зв’язати такий ресурс, як css, js:

     <link rel="stylesheet" href="${pageContext.request.contextPath}/style/sample.css" />
     <script src="${pageContext.request.contextPath}/js/sample.js"></script>   

Щоб просто зробити посилання:

     <a id=".." class=".." href="${pageContext.request.contextPath}/jsp/sample.jsp">....</a>

Варто ознайомитися з тегами

   <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

Існує також метод jsp, щоб зробити це, як показано нижче, але краще, як вище:

   <link rel="stylesheet" href="<%=request.getContextPath()%>/style/sample.css" />
   <script type="text/javascript" src="<%=request.getContextPath()%>/js/sample.js"></script>

Щоб просто зробити посилання:

   <a id=".." class=".." href="<%=request.getContextPath()%>/jsp/sample.jsp">....</a>

2

Це можна зробити простіше:

<base href="${pageContext.request.contextPath}/"/>

Усі URL-адреси будуть сформовані без зайвого, domain:portале з контекстом програми.


-1

Це похідна від пропозиції @Ralph, яку я використовував. Додайте у c:urlверхню частину вашого JSP.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url value="/" var="root" />

Тоді просто зверніться до кореневої змінної на вашій сторінці:

<link rel="stylesheet" href="${root}templates/style/main.css">
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.