sirve servlet que para example ejemplo java jsp tomcat ant web.xml

java - servlet - Cómo fusionar el fragmento jsp precompilado web.xml con web.xml principal utilizando Ant



servlets y jsp (5)

Doh: hay una opción en la tarea jasper2 para fusionar automáticamente el fragmento en el web.xml principal - 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" />

Me pregunto qué tan buena es la fusión ...

Es molesto que necesites generar el fragmento aún, aunque no sea necesario después de esta tarea.

Tenemos el web.xml habitual para nuestra aplicación web que incluye algunos archivos de etiquetas jsp y jsp. Quiero pasar a usar jsp precompilados. Tengo la compilación previa en la compilación, y genera el fragmento web.xml y ahora quiero fusionar el fragmento en el web.xml principal.

¿Hay una directiva de tipo de inclusión para web.xml que me permita incluir el fragmento?

Idealmente, dejaré las cosas como están para DEV, ya que es útil cambiar las jsp sobre la marcha y ver los cambios inmediatamente, pero luego para UAT / PROD, las jsp se precompilarán y, por lo tanto, funcionarán más rápido.


Utilizo las tareas ANT de Tomcat jasper en mi proyecto, que precompila las JSP en servlets y agrega las nuevas asignaciones de servlets al web.xml original. En las compilaciones DEV, solo omita este paso e implemente las JSP sin precompilación y modificación de 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>

Si ya tiene la compilación JSP funcionando y solo desea fusionar los archivos web.xml, podría escribirse un XSLT simple para agregar elementos seleccionados (como las asignaciones de servlet) del nuevo sitio web generado, xml, al original.


Debido a que el fragmento generado no es un archivo XML válido (después de todo es un fragmento), no es posible usar XSLT directamente. Por otro lado, no es necesario. Aquí hay un truco simple que le dará exactamente lo que necesita.

En su archivo web.xml, inserte el comentario XML <!-- @JSPS_MAP@ --> entre los elementos <servlet> y <servlet-mapping> , por ej.

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

Luego use un filtro de token para reemplazar @JSPS_MAP@ tag con el contenido generado.

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

Este enfoque tiene la ventaja de que el archivo web.xml original es completamente válido (una etiqueta está oculta en el comentario), pero le da un control total de dónde y cuándo se insertará el fragmento generado.

Por lo tanto, para la creación de DEV, simplemente copie ${orig-web-content.dir}/WEB-INF/web.xml en ${generated-web-content.dir}/WEB-INF/web.xml sin filtrar.


Existe la tarea de la hormiga jasper2 que otros han notado. Pensé que mencionaría algunas otras opciones que he encontrado.

Una de ellas es la tarea de hormiga webxmlmerge de cactus, que utiliza org.codehaus.cargo.module.webapp.WebXmlMerger

Otro sería usar JAXB para manipular el web.xml; Demostración dtd-schemas-generator de Sebastien Dionne hace esto. No estoy seguro de lo que es la licencia.

Después de haber considerado estas opciones, creo que voy a usar la tarea XSLT de la hormiga.


En su archivo web.xml si tiene etiquetas para especificar dónde se inicia y finaliza la fusión, el indicador addWebXmlMappings generará el archivo correctamente para usted. Las etiquetas son: <! - las asignaciones de servlets JSPC comienzan -> y <! - las asignaciones de servlets JSPC terminan -> después de hacer esto en mi web.xml todo funcionó como un amuleto! (Tengo que mirar el código de org.apcahe.jasper.JspC para ver cómo se implementó esto)