Как прекомпилировать файлы.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 не потребуется.

Другие вопросы по тегам