Как прекомпилировать файлы.jspf с помощью jasper2 в ant
Файлы.jspf - это "Фрагменты Java-сервера" - jsp, который предназначен только для включения () в другие файлы.jsp.
Прекомпиляция всех файлов.jsp очень удобна, потому что она выставляет синтаксические ошибки, пропуски импорта, ошибки кода Java и т. Д. Во время сборки, а не во время выполнения. Мы все боролись с опечатками в.jsp, которые не отображаются, пока мы не просмотрим страницу. Я ставлю автоматическую задачу в ant для предварительной компиляции всех моих файлов JSP. (см. http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html).
Jsp-компилятор Tomcat jasper2 встроил в него предположение, что все jsp-файлы имеют расширение.jsp. Это идет вразрез с текущими рекомендациями использовать расширения файлов.jspf при необходимости.
ВОПРОС: как кодировать задачу муравья, которая будет вызывать jasper2 (он же jspC) для предварительной компиляции всех файлов.jsp, включая файлы.jspf?
1 ответ
-- ОТВЕТ
(см. обсуждение ниже для исправления других ответов, связанных с этим)
Используйте вспомогательные задачи ant для создания текстового списка файлов.jspf для компиляции и передачи его в задачу jasper2 в атрибуте jspfiles. Следующее:
<target name="precompilejsp">
<taskdef name="jasper2" classname="org.apache.jasper.JspC">
<classpath refid="compile.classpath"/>
</taskdef>
<!-- THIS is the guts of the solution -->
<!-- Jasper2 refuses to precompile .jspf unless we list them specifically. Boo hoo. -->
<fileset id="jspffiles" dir="${appdir.build}">
<include name="**/*.jspf"/>
<include name="**/*.jsp"/>
</fileset>
<!-- This turns the set into a textual comma-separated list -->
<pathconvert targetos="unix" pathsep="," property="app.jspflist" refid="jspffiles"/>
<!-- echo message="Jspf files are: ${app.jspflist}"/ -->
<!-- Do the precompilation by invoking Jasper2 -->
<jasper2
validateXml="false"
uriroot="${appdir.build}"
jspfiles="${app.jspflist}"
webXmlFragment="${precompile_tmp_dir}/generated_web.xml"
outputDir="${precompile_tmp_dir}">
</jasper2>
<!-- Now compile those .java sources to generate any error messages. -->
<mkdir dir="${precompile_tmp_dir}/WEB-INF/classes"/>
<javac srcdir="${precompile_tmp_dir}"
destdir="${precompile_tmp_dir}/WEB-INF/classes"
debug="${compile.debug}"
deprecation="${compile.deprecation}"
optimize="${compile.optimize}"
includeantruntime="false">
<classpath refid="compile.classpath"/>
</javac>
</target>
--- ОБСУЖДЕНИЕ
Это было указано в ссылке Что такое расширение файла.jspf? Как это скомпилировать? (и в других местах в Интернете), что файлы.jspf обычно не должны компилироваться самостоятельно, и что они включаются в текст через <jsp:include>
ссылки из других файлов. Это утверждение и аргументация неверны. Компилятор Tomcat Jasper .jsp фактически компилирует.jspf автономно во время обычной обработки времени отображения.jsp и связанных файлов.jspf. Это можно легко увидеть, просмотрев /usr/share/tomcat/work/Catalina/localhost/org/youdomain/yourpath/includefile_jspf.java. Этот файл.java генерируется как отдельный код для вашего файла.jspf. Суть в том, что <jsp:include>
не работает как #include() в C, скорее он включает во время выполнения вывод файла jspf в вывод включающего файла, а не включает источник файла jspf в источник файла.jsp, как C иметь.
Утверждение в этом ссылочном ответе о том, что файлы WEB-INF/somejsp.jsp не могут быть просмотрены конечными пользователями, также является ложным. Распространено помещать ВСЕ файлы.jsp в WEB-INF и ссылаться на них в шлюзах кода сервлета, отображенных в web.xml или других механизмах пересылки запросов сервлета:
RequestDispatcher dispatcher = servctxThis.getRequestDispatcher ("/WEB-INF/JSP/thewholepage.jsp");
dispatcher.forward (запрос, ответ);
Таким образом, если быть точным, файлы.jsp в / WEB-INF не могут быть напрямую просмотрены конечными пользователями, но они могут быть перенаправлены любым сервлетом ИЛИ другим файлом JSP и часто содержат полный веб-ответ - <HTML> ... </HTML>
, (.jspf, с другой стороны, часто содержит фрагмент или фрагмент ответа HTML --- <DIV>header-content</DIV>
, например.
Альтернативное решение - просто зарегистрировать расширение jspf в web.xml
:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jspf</url-pattern>
</jsp-property-group>
</jsp-config>
Тогда никаких изменений в скриптах Ant не потребуется.