5

いくつかの jsp および jsp タグ ファイルを含む、Web アプリケーション用の通常のweb.xmlがあります。コンパイル済みの jsp を使用するように切り替えたいと考えています。ビルドで事前コンパイルが正常に行われ、web.xml フラグメントが生成され、フラグメントをメインの web.xml にマージしたいと考えています。

フラグメントをインクルードできる web.xmlのインクルードタイプ ディレクティブはありますか。

理想的には、DEV の場合はそのままにしておきます。その場で jsp を変更して変更をすぐに確認できるので便利ですが、UAT/PROD の場合は、jsp が事前にコンパイルされているため、より高速に動作します。

4

5 に答える 5

4

プロジェクトでTomcatjasperANTタスクを使用します。このタスクは、JSPをサーブレットにプリコンパイルし、新しいサーブレットマッピングを元のweb.xmlに追加します。DEVビルドでは、このステップをスキップして、web.xmlをプリコンパイルおよび変更せずにJSPをデプロイします。

    <?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から選択した要素(サーブレットマッピングなど)を元の要素に追加できます。

于 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 に答える
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 に答える
1

他の人が指摘したjasper2 ant タスクがあります。私が見つけた他のいくつかのオプションについて言及したいと思いました。

1 つは、org.codehaus.cargo.module.webapp.WebXmlMerger を使用する cactus のwebxmlmerge ant タスクです。

もう 1 つの方法は、JAXBを使用して web.xml を操作することです。Sebastien Dionne のdtd-schemas-generator demo はこれを行います。ただし、ライセンスが何であるかはわかりません。

fwiw これらのオプションを検討した結果、ant XSLTタスクを使用することにしました。

于 2009-12-07T11:18:09.930 に答える
1

マージの開始位置と終了位置を指定するタグがある場合、web.xml ファイルに addWebXmlMappings フラグを指定すると、ファイルが正しく生成されます。タグは次のとおりです。(これがどのように実装されたかを確認するには、org.apcahe.jasper.JspC のコードを調べる必要があります)

于 2010-06-30T17:23:15.370 に答える