JSP и include

В 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”.

Добавить комментарий

Войти с помощью: