如何在ant中使用jasper2预编译.jspf文件

TSn*_*der 6 ant jsp tomcat precompile jsp-fragments

.jspf文件是"Java服务器片段" - 仅适用于其他.jsp文件中的includes()的jsp.

预编译所有.jsp文件非常方便,因为它在构建时而不是运行时暴露语法错误,缺少导入,java代码错误等.在我们查看页面之前,我们都在.jsp中的拼写错误都没有出现.我正在将一个自动任务放入ant中以预编译我的所有JSP文件.(参见http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html#Web_Application_Compilation).

Tomcat的jsp编译器jasper2内置了一个假设,即所有jsp文件都有'.jsp'文件扩展名.这违反了当前建议在适当时使用.jspf文件扩展名.

问题: 如何编写一个ant任务来调用jasper2(又名jspC)来预编译所有.jsp文件,包括.jspf文件?

TSn*_*der 1

- 答案

(请参阅下面的讨论以更正与此相关的其他答案)

使用 ant 帮助器任务构建 .jspf 文件的文本列表,进行编译并将其传递给 jspfiles 属性中的 jasper2 任务。如下:

<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> 
Run Code Online (Sandbox Code Playgroud)

- - 讨论

已在引用的什么是 .jspf 文件扩展名?如何编译呢? (以及网络上的其他地方).jspf 文件通常不会自行编译,并且它们是通过<jsp:include>其他文件的引用以文本方式包含的。这种说法和推理是错误的。实际上,Tomcat Jasper .jsp 编译器在 .jsp 和相关 .jspf 文件的正常显示时处理过程中独立编译 .jspf。通过检查 /usr/share/tomcat/work/Catalina/localhost/org/youdomain/yourpath/includefile_jspf.java 可以轻松看出这一点。此 .java 文件是作为 .jspf 文件的独立代码生成的。底线是它<jsp:include>不像 C 的 #include() 那样工作,而是在运行时将jspf 文件的输出包含在包含文件的输出中,而不是将 jspf 文件的包含到 .jsp 的源中像 C 那样的文件。

该引用答案中关于最终用户无法查看 WEB-INF/somejsp.jsp 文件的说法也是错误的。通常将所有 .jsp 文件放在 WEB-INF 中,并在 web.xml 或其他 Servlet 请求转发机制中映射的 Servlet 代码网关中引用它们:

  RequestDispatcher 调度程序 = servctxThis.getRequestDispatcher( "/WEB-INF/JSP/thewholepage.jsp" );
  调度程序.forward(请求,响应);

因此,具体来说,最终用户无法直接查看 /WEB-INF 中的 .jsp 文件,但它们可以由任何 servlet 或其他 JSP 文件转发到,并且通常包含整个 Web 响应 - <HTML> ... </HTML>。(另一方面,.jspf 通常包含 HTML 响应的片段或片段 --- <DIV>header-content</DIV>,例如。

  • 讨论有点错误:链接的文章讨论了使用 `&lt;%@include file="" %&gt;`,这实际上_is_ 就像 C `#include` 语句。正如您所说,“&lt;jsp:include&gt;”的工作方式不同,因此当使用“&lt;jsp:include&gt;”包含文件时,不要使用 .jspf 扩展名,但要将其用于“&lt;%@include file=” "" %&gt;` 并从编译中排除这些文件,因为它们将与包含文件一起编译。 (2认同)