Frage

Wir haben den üblichen web.xml für unsere Web-Anwendung, die einige jsp und JSP-Tag-Dateien enthält. Ich möchte mit vorkompilierte JSP wechseln. Ich habe die Vorkompilierung im Build ok geschieht, und es erzeugt das web.xml Fragment und jetzt will ich das Fragment in die Haupt web.xml verschmelzen.

Gibt es eine ist Art Richtlinie für web.xml , das ich das Fragment umfassen lassen.

Im Idealfall werde ich Dinge lassen, wie für DEV- als nützlich ist jsp die im laufenden Betrieb zu ändern und die Änderungen sofort sehen, aber dann für UAT / ART, wird die jsp des vorab zusammengestellt und damit schneller arbeiten.

War es hilfreich?

Lösung

Ich verwende den Tomcat Jaspis ANT Aufgaben in meinem Projekt, das die JSPs in Servlets und fügen Sie die neuen Servletzuordnungen auf den ursprünglichen web.xml vorkompilieren. In der DEV baut, nur diesen Schritt überspringen und die JSPs ohne vorherige Kompilierung und Modifikation der web.xml bereitstellen.

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

Wenn Sie bereits die JSP-Kompilierung Arbeits haben und wollen nur die web.xml-Dateien verschmelzen, ein einfaches XSLT geschrieben werden könnte, um ausgewählte Elemente (wie die Servletzuordnungen) hinzufügen aus dem neu generierten Web, XML in Ihre Originale.

Andere Tipps

Doh - gibt es eine Option auf der jasper2 Aufgabe zu auto-fusioniert das Fragment in die Haupt 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" />

Ich frage mich, wie gut die Zusammenführung ist ...

ärgerlicher müssen Sie das Fragment noch erzeugen, auch wenn es nicht nach dieser Aufgabe benötigt werden.

Da das erzeugte Fragment keine gültige XML-Datei ist (es ist ein Fragment, nachdem alle), ist es nicht möglich, XSLT direkt zu verwenden. Auf der anderen Seite müssen Sie nicht auf. Hier ist ein einfacher Trick, den Sie genau das, was Sie brauchen.

In der web.xml-Datei einfügen XML Kommentar <!-- @JSPS_MAP@ --> zwischen <servlet> und <servlet-mapping> Elemente, z.

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

Dann ein Token-Filter verwenden @JSPS_MAP@-Tag mit generierte Inhalte.

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

Dieser Ansatz hat den Vorteil, dass die ursprüngliche Datei web.xml vollständig gültig ist (ein Tag in dem Kommentar ausgeblendet), sondern gibt Ihnen die totale Kontrolle über wann und wo das erzeugte Fragment eingefügt wird.

Also für DEV bauen, kopieren Sie einfach ${orig-web-content.dir}/WEB-INF/web.xml ohne Filterung ${generated-web-content.dir}/WEB-INF/web.xml.

Es ist die jasper2 Ant-Task andere haben zur Kenntnis genommen. Ich dachte, ich würde ein paar andere Optionen erwähnen ich gefunden habe.

Eine davon ist Kaktus webxmlmerge Ant-Task, der org.codehaus.cargo.module.webapp.WebXmlMerger verwendet

Eine andere wäre zu verwenden JAXB die web.xml zu manipulieren; Sebastien Dionne dtd-schemas-Generator Demo tut dies . Nicht sicher, was die Lizenz allerdings ist.

FWIW diese Optionen in Betracht gezogen haben, ich denke, ich werde die Ameise XSLT Aufgabe verwenden.

In der web.xml-Datei, wenn Sie Tags müssen angeben, wo die Zusammenführung beginnt und endet die addWebXmlMappings Flag wird für Sie die Datei korrekt erzeugen. Die Tags sind: und nachdem ich das mein web.xml alles funktionierte wie ein Zauber! (Ich habe den Code suchen org.apcahe.jasper.JspC zu sehen, wie dies umgesetzt wurde)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top