- 答案
(请参阅下面的讨论以更正与此相关的其他答案)
使用 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>
- - 讨论
在引用的什么是 .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 文件,而不是像 C 那样将 jspf 文件的源包含到 .jsp 文件的源中。
该引用答案中声称最终用户无法查看 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 文件转发到,并且通常包含整个 Web 响应 - <HTML> ... </HTML>
。(另一方面,.jspf 通常包含 HTML 响应的片段或片段 ---<DIV>header-content</DIV>
例如。