2014-02-17 5 views
2

Я делаю некоторые основные шаблоны в моем JSP-based webapp. Например, я хочу иметь стандартный верхний и нижний колонтитулы (базовый HTML), которые я втягиваю в каждый из моих JSP.JSP включить директиву, jsp: включить действие, относительные против абсолютных путей

Мое содержание JSP находится в /WEB-INF/jsp/home.jsp, и у меня есть шаблон JSPs на /WEB-INF/jsp/template/, например /WEB-INF/jsp/template/Body-Footer.jsp.

Так что теперь, в пределах home.jsp, я хочу вытащить файлы своих шаблонов. Во-первых, я стараюсь jsp:include действие:

<jsp:include page="template/Body-Footer.jsp"></jsp:include> 

Он генерирует ошибку javax.servlet.ServletException: File &quot;/template/Body-Footer.jsp&quot; not found

странным, учитывая, что Eclipse, говорит, что путь является действительным.

Ладно, тогда я переключаюсь директивы включают:

<%@ include file="template/Body-Footer.jsp" %> 

Это работает просто отлично, тянет в моем колонтитуле HTML.

Но почему jsp:include не работает? После нескольких экспериментов я обнаружил, что положить в абсолютном пути действительно заставить его работать:

<jsp:include page="/WEB-INF/jsp/template/Body-Footer.jsp"></jsp:include> 

Сейчас он работает отлично, без ошибок.

Итак, вот мой вопрос: почему? Почему я (по-видимому) должен использовать абсолютный путь с действием jsp:include, но не с директивой include?

+0

Возможно, вы захотите начать [здесь] (http://stackoverflow.com/questions/7879906/what-is-the-difference-between-jspinclude-page-and-include-file). –

ответ

4

/WEB-INF/jsp/template/Body-Footer.jsp не является абсолютным путем. Его также относительный путь. Проблема в том, что template/Body-Footer.jsp является неполным относительным путем, тогда как другой является полным. То есть, пути относятся к вашему пути к приложению. Поскольку /WEB-INF/ находится под вашим приложением, вы должны его включить. Абсолютный путь означает, как C:/program files/tomcat/webapps/yourapp/WEB-INF/jsp/template/Body-Footer.jsp

+1

Другой путь является абсолютным относительно URL контекста приложения. –

+0

Абсолютно ОТНОСИТЕЛЬНО к контексту приложения, таким образом, не совсем абсолютный. В терминологии есть явная путаница. Конечно, ваши относительные пути должны быть полными, иначе, как они будут работать? – developerwjk

+0

Вот что я сказал. Я не отрицаю тот факт, что они все-таки родственники. –

0

Ответ, почему - The jsp:include директива выполнения в отличие от <%@ include ... %> директивы, которая случается директива во время компиляции (время перевода, на самом деле).

Смотреть больше: JSP Performance using jsp:include

Нижняя линия - директивы выполняются по отношению к различным папкам в качестве базы.

КПП. JSP-страницы должны быть вне папки WEB-INF, если вы хотите следовать официальной рекомендации:

The Java EE 6 Tutorial - Web Module Structure

+1

Это полезно, спасибо. Однако по вашей рекомендации по размещению JSP вне папки WEB-INF, возможно, я пропустил ее, но я не мог видеть что-то в этой ссылке, которая рекомендовала это. В поддержку размещения JSP в WEB-INF у нас есть следующее: http://stackoverflow.com/questions/6825907/why-put-jsp-in-web-inf –

0

Я прочитал JSP 2.0 спецификации и здесь:

Relative URL Specifications 

* A context-relative path is a path that starts with a slash (/). 
It is to be interpreted as relative to the application to which 
the JSP page or tag file belongs. That is, its ServletContext 
object provides the base context URL. 

* A page relative path is a path that does not start with a 
slash (/). It is to be in- terpreted as relative to the current 
JSP page, or the current JSP file or tag file, depending on where 
the path is being used. 

На данный момент javax.servlet.ServletContext.getRealPath("/WEB-INF/test/test.jsp") является недействительным для безопасности причина.

Предположим, что контекстно-относительный путь - это путь от вашего корня WAR.

Смежные вопросы