Браузер не может получить доступ / найти относительные ресурсы, такие как CSS, изображения и ссылки, при вызове сервлета, который пересылает в JSP - PullRequest
76 голосов
/ 07 сентября 2010

У меня проблемы с загрузкой CSS и изображений и созданием ссылок на другие страницы, когда я отправляю сервлет в JSP. В частности, когда я установил <welcome-file> на index.jsp, CSS загружается, и мои изображения отображаются. Однако, если я установлю <welcome-file> на HomeServlet, который перенаправляет управление на index.jsp, CSS не применяется и мои изображения не отображаются.

Мой файл CSS находится в web/styles/default.css.
Мои изображения в web/images/.

Я ссылаюсь на свой CSS следующим образом:

<link href="styles/default.css" rel="stylesheet" type="text/css" />

Я показываю свои изображения следующим образом:

<img src="images/image1.png" alt="Image1" />

Как возникает эта проблема и как я могу ее решить?


Обновление 1 : я добавил структуру приложения, а также некоторую другую информацию, которая может помочь.

alt text

Файл header.jsp - это файл, который содержит тег ссылки для CSS. HomeServlet установлен как welcome-file в web.xml:

<welcome-file-list>
    <welcome-file>HomeServlet</welcome-file>
</welcome-file-list>

Сервлет объявляется и отображается как следующий в web.xml:

<servlet>
    <servlet-name>HomeServlet</servlet-name>
    <servlet-class>com.brianblog.frontend.HomeServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HomeServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Обновление 2 : наконец-то я обнаружил проблему - мой сервлет был отображен неправильно. Очевидно, при установке сервлета в качестве <welcome-file> он не может иметь шаблон URL-адреса /, что я нахожу довольно странным, потому что это не будет означать корневой каталог сайта?

Новое отображение выглядит следующим образом:

<servlet-mapping>
    <servlet-name>HomeServlet</servlet-name>
    <url-pattern>/HomeServlet</url-pattern>
</servlet-mapping>

Ответы [ 8 ]

96 голосов
/ 07 сентября 2010

Все относительные URL на странице HTML, сгенерированной файлом JSP, относятся к текущему URL запроса (URL, как вы видите в адресной строке браузера), а не к расположению файла JSP вна стороне сервера, как вы ожидаете.Именно веб-браузер должен загружать эти ресурсы индивидуально по URL-адресу, а не веб-сервер должен каким-то образом включать их с диска.

Помимо изменения относительных URL-адресов, чтобы сделать их относительными к URL-адресу сервлета, а нерасположение файла JSP, другой способ решить эту проблему - сделать их относительно корня домена (т.е. начать с /).Таким образом, вам не нужно беспокоиться об изменении относительных путей при изменении URL-адреса сервлета.

<head>
    <link rel="stylesheet" href="/context/css/default.css" />
    <script src="/context/js/default.js"></script>
</head>
<body>
    <img src="/context/img/logo.png" />
    <a href="/context/page.jsp">link</a>
    <form action="/context/servlet"><input type="submit" /></form>
</body>

Однако вы, вероятно, не захотите жестко кодировать путь контекста.Очень разумноВы можете получить контекстный путь в EL с помощью ${pageContext.request.contextPath}.

<head>
    <link rel="stylesheet" href="${pageContext.request.contextPath}/css/default.css" />
    <script src="${pageContext.request.contextPath}/js/default.js"></script>
</head>
<body>
    <img src="${pageContext.request.contextPath}/img/logo.png" />
    <a href="${pageContext.request.contextPath}/page.jsp">link</a>
    <form action="${pageContext.request.contextPath}/servlet"><input type="submit" /></form>
</body>

(который можно легко сократить на <c:set var="root" value="${pageContext.request.contextPath}" /> и использовать как ${root} в другом месте)

Или, если вы не боитесь нечитаемого XML и выделения синтаксиса XML, используйте JSTL <c:url>:

<head>
    <link rel="stylesheet" href="<c:url value="/css/default.css" />" />
    <script src="<c:url value="/js/default.js" />"></script>
</head>
<body>
    <img src="<c:url value="/img/logo.png" />" />
    <a href="<c:url value="/page.jsp" />">link</a>
    <form action="<c:url value="/servlet" />"><input type="submit" /></form>
</body>

В любом случае, этов свою очередь довольно громоздко, если у вас много относительных URL.Для этого вы можете использовать тег <base>.Все относительные URL-адреса мгновенно станут относительными к нему.Однако начинать нужно со схемы (http://, https:// и т. Д.).Нет простого способа получить базовый путь контекста в простом EL, поэтому нам нужна небольшая помощь: JSTL здесь.

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="uri" value="${req.requestURI}" />
<c:set var="url">${req.requestURL}</c:set>
...
<head>
    <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/" />
    <link rel="stylesheet" href="css/default.css" />
    <script src="js/default.js"></script>
</head>
<body>
    <img src="img/logo.png" />
    <a href="page.jsp">link</a>
    <form action="servlet"><input type="submit" /></form>
</body>

Это в свою очередь (опять же) несколько предостережений.Якоря (#identifier URL) также станут относительными к базовому пути!Вместо этого вы хотели бы сделать это относительно URL запроса (URI).Итак, измените как

<a href="#identifier">jump</a>

на

<a href="${uri}#identifier">jump</a>

У каждого способа есть свои плюсы и минусы.Вам решать, что выбрать.По крайней мере, теперь вы должны понимать, как эта проблема вызвана и как ее решить:)

См. Также:

6 голосов
/ 22 ноября 2014

Я столкнулся с подобной проблемой в приложении Spring MVC.Я использовал тег < mvc:resources > для решения этой проблемы.

Пожалуйста, найдите следующую ссылку с более подробной информацией.

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

2 голосов
/ 07 сентября 2010

Вы должны проанализировать фактический вывод HTML, для подсказки.

Если указывать такой путь, это означает «из текущего местоположения», с другой стороны, если вы начнете с /, это будет означать «из контекста».

0 голосов
/ 29 июля 2018

Ниже код работал для меня.

вместо использование <% @ include file = "styles / default.css"%>

0 голосов
/ 19 марта 2017

краткий ответ - добавьте следующую строку в JSP, которая будет определять основание
base href = "/ {корень вашего приложения} /"

0 голосов
/ 23 ноября 2014

Что касается вашего обновления, я был сбит с толку из-за рассуждений. Вырыл немного глубже и нашел этот драгоценный камень:

  • yoursite.com становится yoursite.com/
  • yoursite.com / - это каталог, поэтому сканируется список файлов приветствия
  • yoursite.com / CMS - это первый файл приветствия («CMS» в списке файлов приветствия), и для сервлета MyCMS отображается / CMS, так что к сервлету осуществляется доступ.

Источник: http://wiki.metawerx.net/wiki/HowToUseAServletAsYourMainWebPage

Итак, отображение имеет смысл.

И теперь можно свободно использовать $ {pageContext.request.contextPath} / path / в качестве src / href для относительных ссылок!

0 голосов
/ 01 июля 2014

Если вы используете Spring MVC, вам нужно объявить сервлет действия по умолчанию для статического содержимого.Добавьте следующие записи в spring-action-servlet.xml.Это сработало для меня.

ПРИМЕЧАНИЕ: держите все статическое содержимое вне WEB-INF.

<!-- Enable annotation-based controllers using @Controller annotations -->
<bean id="annotationUrlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="0" />
</bean>

<bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
    <property name="order" value="1" />
</bean>

<bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
0 голосов
/ 07 сентября 2010

Ваша страница приветствия установлена ​​как сервлет. Таким образом, все пути css, images должны быть указаны относительно DIR этого сервлета. это плохая идея! зачем вам сервлет в качестве домашней страницы? установить .jsp в качестве индексной страницы и перенаправить на любую страницу оттуда?

вы пытаетесь заполнить какие-либо поля из базы данных, поэтому вы используете сервлет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...