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

时间:2013-05-15 01:56:34

标签: jsp tomcat ant 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文件?

2 个答案:

答案 0 :(得分:1)

- 答案

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

使用ant helper任务构建要编译的.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> 

---讨论

在引用的What is .jspf file extension? How to compile it?(以及网络上的其他地方)中已经声明.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文件的放入.csp文件的源代码中。

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

RequestDispatcher dispatcher = servctxThis.getRequestDispatcher(                                   “/WEB-INF/JSP/thewholepage.jsp”);
dispatcher.forward(请求,响应);

因此,具体而言,/ WEB-INF中的.jsp文件不能由最终用户直接查看,但它们可以由任何servlet或其他JSP文件转发 - 并经常执行包含整个网络回复 - <HTML> ... </HTML>。 (另一方面,(。jspf)通常包含HTML响应的片段或片段--- <DIV>header-content</DIV>

答案 1 :(得分:0)

另一种解决方案是仅对web.xml中的register jspf扩展名:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspf</url-pattern>
    </jsp-property-group>
</jsp-config>

然后不需要更改Ant脚本。