5

我们的 Web 应用程序有常用的web.xml,其中包括一些 jsp 和 jsp 标记文件。我想切换到使用预编译的jsp。我在构建中进行了预编译,它生成了 web.xml 片段,现在我想将该片段合并到主 web.xml 中。

是否有web.xml的包含类型指令可以让我包含该片段。

理想情况下,我会为 DEV 保留原样,因为它对动态更改 jsp 并立即查看更改很有用,但是对于 UAT/PROD,jsp 将被预编译,因此工作得更快。

4

5 回答 5

4

Doh - jasper2 任务中有一个选项可以将片段自动合并到主 web.xml - addWebXmlMappings

    <jasper2
         validateXml="false"
         uriroot="${web.dir}"
         addWebXmlMappings="true"
         webXmlFragment="${web.dir}/WEB-INF/classes/jasper_generated_web.xml"
         outputDir="${web.dir}/WEB-INF/jsp-src" />

我想知道合并有多好...

令人讨厌的是,您仍然需要生成片段,即使在此任务之后不需要它。

于 2008-10-02T13:12:50.257 回答
4

我在我的项目中使用Tomcat jasper ANT 任务,它将 JSP 预编译成 servlet 并将新的 servlet 映射添加到原始 web.xml。在 DEV 构建中,只需跳过此步骤并部署 JSP,无需预编译和修改 web.xml。

    <?xml version="1.0"?>
<project name="jspc" basedir="." default="all">
 <import file="${build.appserver.home}/bin/catalina-tasks.xml"/>

 <target name="all" depends="jspc,compile"></target>

 <target name="jspc">
  <jasper
   validateXml="false"
   uriroot="${build.war.dir}"
   webXmlFragment="${build.war.dir}/WEB-INF/generated_web.xml"
   addWebXmlMappings="true"
   outputDir="${build.src.dir}" />
 </target>

 <target name="compile">
  <javac destdir="${build.dir}/classes"
   srcdir="${build.src.dir}"
   optimize="on"
   debug="off"
   failonerror="true"
   source="1.5"
   target="1.5"
   excludes="**/*.smap">
   <classpath>
    <fileset dir="${build.war.dir}/WEB-INF/classes">
     <include name="*.class" />
    </fileset>
    <fileset dir="${build.war.lib.dir}">
     <include name="*.jar" />
    </fileset>
    <fileset dir="${build.appserver.home}/lib">
     <include name="*.jar" />
    </fileset>    
    <fileset dir="${build.appserver.home}/bin">
     <include name="*.jar"/>
    </fileset>
   </classpath>
    <include name="**" />
    <exclude name="tags/**"/>
  </javac>
 </target>

 <target name="clean">
  <delete>
   <fileset dir="${build.src.dir}"/>
   <fileset dir="${build.dir}/classes/org/apache/jsp"/>
  </delete>
 </target>
</project>

如果您已经进行了 JSP 编译并且只想合并 web.xml 文件,则可以编写一个简单的 XSLT 来将新生成的 web,xml 中的选定元素(例如 servlet 映射)添加到您的原始文件中。

于 2008-10-04T23:38:16.747 回答
4

因为生成的片段不是一个有效的 XML 文件(毕竟它是一个片段),所以不能直接使用 XSLT。另一方面,您不必这样做。这是一个简单的技巧,可以为您提供所需的一切。

在您的 web.xml 文件中,在和元素<!-- @JSPS_MAP@ -->之间插入 XML 注释,例如<servlet><servlet-mapping>

  <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>my.servlets.MyServlet</servlet-class>
  <servlet>

  <!-- @JSPS_MAP@ -->

  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/my-servlet</url-pattern>
  </servlet-mapping>

然后使用令牌过滤器将@JSPS_MAP@标签替换为生成的内容。

<loadfile
  property="generated.web.xml.fragment"
  srcFile="${generated.fragment.file}"
/>

<copy file="${orig-web-content.dir}/WEB-INF/web.xml"
  toFile="${generated-web-content.dir}/WEB-INF/web.xml"
>
  <filterset>
    <filter token="JSPS_MAP"
      value=" --&gt; ${generated.web.xml.fragment} &lt;!-- "
    />
  </filterset>
</copy>

这种方法的优点是原始 web.xml 文件是完全有效的(标签隐藏在注释中),但可以让您完全控制插入生成的片段的位置和时间。

所以对于 DEV 构建,只需复制${orig-web-content.dir}/WEB-INF/web.xml${generated-web-content.dir}/WEB-INF/web.xml而不过滤。

于 2009-10-07T16:03:11.737 回答
1

有其他人注意到的jasper2 ant 任务。我想我会提到我发现的其他几个选项。

一个是 cactus 的webxmlmerge蚂蚁任务,它使用 org.codehaus.cargo.module.webapp.WebXmlMerger

另一种是使用JAXB来操作 web.xml;Sebastien Dionne 的dtd-schemas-generator演示就是这样做的。虽然不确定许可证是什么。

fwiw 考虑了这些选项后,我想我将使用 ant XSLT任务。

于 2009-12-07T11:18:09.930 回答
1

在您的 web.xml 文件中,如果您有标签来指定合并开始和结束的位置,则 addWebXmlMappings 标志将为您正确生成文件。标签是: <!-- JSPC servlet mappings start --> 和 <!-- JSPC servlet mappings end --> 对我的 web.xml 执行此操作后,一切都像魅力一样!(我必须查看 org.apcahe.jasper.JspC 的代码才能了解它是如何实现的)

于 2010-06-30T17:23:15.370 回答