【问题标题】:how to precompile .jspf files with jasper2 in ant如何在ant中使用jasper2预编译.jspf文件
【发布时间】:2013-05-15 01:56:33
【问题描述】:

.jspf 文件是“Java 服务器片段”——仅用于在其他 .jsp 文件中包含 () 的 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 文件扩展名的建议。

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

【问题讨论】:

    标签: jsp tomcat ant precompile jsp-fragments


    【解决方案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 文件通常不会单独编译,它们是通过来自其他文件的&lt;jsp:include&gt; 引用以文本形式包含的。这种说法和推理是错误的。 Tomcat Jasper .jsp 编译器实际上会在 .jsp 和相关 .jspf 文件的正常显示时处理期间独立编译 .jspf。这可以通过检查 /usr/share/tomcat/work/Catalina/localhost/org/youdomain/yourpath/includefile_jspf.java 轻松看到。此 .java 文件作为 .jspf 文件的独立代码生成。底线是 &lt;jsp:include&gt; 不像 C 的 #include() 那样工作,而是在运行时将 jspf 文件的 output 包含在包含文件的输出中,而不是包含 source 将 jspf 文件的源代码转换为 .jsp 文件的源代码,就像 C 一样。

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

      RequestDispatcher 调度程序 = servctxThis.getRequestDispatcher( "/WEB-INF/JSP/thewholepage.jsp");
    dispatcher.forward(request, response);

    因此,具体来说,/WEB-INF 中的 .jsp 文件不能直接被最终用户查看,但它们可以被任何 servlet 或其他 JSP 文件转发到,并且经常这样做包含整个网络响应——&lt;HTML&gt; ... &lt;/HTML&gt;。 (另一方面,.jspf 通常包含一个 sn-p 或 HTML 响应片段 --- &lt;DIV&gt;header-content&lt;/DIV&gt;,例如。

    【讨论】:

    • 讨论位有误:链接的文章谈到使用&lt;%@include file="" %&gt;,确实像一个C #include 声明。 &lt;jsp:include&gt; 确实,正如您所说,工作方式不同,因此在使用 &lt;jsp:include&gt; 包含文件时,不要使用 .jspf 扩展名,但将其用于 &lt;%@include file="" %&gt; 并排除这些文件从编译,因为它们将与包含文件一起编译。
    【解决方案2】:

    替代解决方案是在web.xml 中仅使用register jspf 扩展:

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

    那么不需要对 Ant 脚本进行任何更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多