Domanda

Abbiamo il solito web.xml per la nostra applicazione web che include alcuni file tag jsp e jsp. Voglio passare all'uso di jsp precompilati. Ho la pre-compilazione in corso nella build ok, e genera il frammento web.xml e ora voglio unire il frammento nel web.xml principale.

Esiste una direttiva di tipo includi per web.xml che mi permetterà di includere il frammento.

Idealmente lascerò le cose come è per DEV- poiché è utile cambiare jsp's al volo e vedere immediatamente le modifiche ma poi per UAT / PROD, jsp's sarà pre-compilato e quindi funzionerà più velocemente.

È stato utile?

Soluzione

Uso le Tomcat jasper ANT task nel mio progetto, che precompila i JSP in servlet e aggiunge i nuovi mapping servlet al web.xml originale. Nelle build DEV, basta saltare questo passaggio e distribuire i JSP senza pre-compilazione e modifica di 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>

Se hai già la compilazione JSP funzionante e vuoi solo unire i file web.xml, una semplice XSLT potrebbe essere scritta per aggiungere elementi selezionati (come i mapping servlet) dal web appena generato, xml al tuo originale.

Altri suggerimenti

Doh: esiste un'opzione sull'attività jasper2 per unire automaticamente il frammento nel web.xml principale: 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" />

Mi chiedo quanto sia buona l'unione ...

Stranamente devi generare ancora il frammento, anche se non è necessario dopo questa attività.

Poiché il frammento generato non è un file XML valido (dopo tutto è un frammento), non è possibile utilizzare XSLT direttamente. D'altra parte non è necessario. Ecco un semplice trucco che ti darà esattamente ciò di cui hai bisogno.

Nel tuo file web.xml inserisci un commento XML <!-- @JSPS_MAP@ --> tra <servlet> e <servlet-mapping> elementi, ad es.

  <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>

Quindi utilizza un filtro token per sostituire @JSPS_MAP@ tag con contenuto generato.

<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>

Questo approccio ha il vantaggio che il file web.xml originale è completamente valido (un tag è nascosto nel commento), ma ti dà il controllo totale su dove e quando verrà inserito il frammento generato.

Quindi per DEV build, basta copiare ${orig-web-content.dir}/WEB-INF/web.xml in ${generated-web-content.dir}/WEB-INF/web.xml senza filtro.

Esiste l'attività jasper2 che altri hanno notato. Ho pensato di menzionare un paio di altre opzioni che ho trovato.

Uno è l'attività formica cactus webxmlmerge , che utilizza org.codehaus.cargo.module.webapp.WebXmlMerger

Un altro sarebbe usare JAXB per manipolare il web.xml; La demo di Sebastien Dionne dtd-schemas-generator fa questo . Non sono sicuro di quale sia la licenza.

dopo aver preso in considerazione queste opzioni, penso che userò il task XSLT .

Nel tuo file web.xml se hai tag per specificare dove inizia e finisce l'unione, il flag addWebXmlMappings genererà il file correttamente per te. I tag sono: <! - Inizio delle mappature servlet JSPC - > e <! - Fine delle mappature servlet JSPC - > dopo aver fatto questo sul mio web.xml tutto ha funzionato come un incantesimo! (Devo guardare il codice per org.apcahe.jasper.JspC per vedere come è stato implementato)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top