В jsp есть два вида include.
Первый – <jsp:include page=”uri”/>
Второй – <%@include file=”uri”%>
В книгах и в документации много разного понаписано по этому поводу, чаще всего пишут, что тегом подключается статическая страница, а директивой – страница с jsp. Но это фигня.
Вот самое лучшее объяснение, которое я нашел:
Перед выполнением, jsp страницы компилируются контейнером. После компиляции директивы вида:
<@include file="reuse.html">
при дезассемблировании, получим:
out.write("<html>\r\n"); out.write(" <head>\r\n"); out.write(" <title>reusable</title>\r\n"); out.write(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n"); out.write(" </head>\r\n"); out.write(" <body>\r\n"); out.write(" <img src=\"candle.gif\" height=\"100\" width=\"50\"/> <br />\r\n"); out.write(" <p><b>As the candle burns,so do I</b></p>\r\n"); out.write(" </body>\r\n"); out.write("</html>\r\n");
Если же был использован тег:
<jsp:include page="reuse.html" />
То при дезассемблировании получим:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "reusable.html", out, false);
при условии, что в файле reusable.html
, содержится:
<html>
<head>
<title>reusable</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<img src="candle.gif" height="100" width="50"/> <br />
<p><b>As the candle burns,so do I</b></p>
</body>
Но есть еще один ньюанс.
При использовании директивы <%@include file=””%>, подключенный файл гарантированно будет отработан, как jsp. Если же использовать тег, то в зависимости от настроек контейнера, и расширения файла, файл может отобразиться как обычный html (вывалив юзеру весь код, в том числе jsp), а может и скомпилиться, как и положено приличному jsp файлу.
Но при любом раскладе, код из файла подключенного тегом, не будет иметь доступа, к объектам родительской страницы, с областью видимости “page”.