Pergunta

Temos o costume web.xml para a nossa aplicação web que inclui algumas jsp e arquivos de tags JSP. Quero passar a usar pré-compilados jsp de. Tenho a pré-compilação acontecendo no ok construção, e gera o fragmento web.xml e agora eu quero fundir o fragmento na web.xml principal.

Existe um incluir Tipo de directiva para web.xml que vai me deixar incluem o fragmento.

Idealmente eu vou deixar as coisas como é para DEV como a sua utilidade para mudar jsp de on the fly e ver as mudanças imediatamente, mas, em seguida, para a UAT / PROD, do jsp será pré-compilados e, portanto, trabalhar mais rápido.

Foi útil?

Solução

Eu uso as tarefas Tomcat jasper ANT na minha projeto, que pré-compilar os JSPs em servlets e adicionar os novos mapeamentos de servlet no web.xml originais. No DEV constrói, apenas ignore este passo e implantar os JSPs sem pré-compilação e modificação do 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 você já tem a compilação de trabalho JSP e apenas deseja mesclar os arquivos web.xml, um XSLT simples poderia ser escrito para adicionar elementos selecionados (como os mapeamentos de servlet) a partir da web recém-gerado, xml em seu original.

Outras dicas

Doh - há uma opção na tarefa jasper2 a auto-merge o fragmento na 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" />

Eu me pergunto o quão boa a mesclagem é ...

Irritantemente você precisa para gerar o fragmento ainda, embora seu não necessário após esta tarefa.

Porque o fragmento gerado não é um arquivo XML válido (é um fragmento depois de tudo), não é possível usar XSLT diretamente. Por outro lado, você não tem que. Aqui está um truque simples que lhe dará exatamente o que você precisa.

Em seu arquivo web.xml inserção comentário XML <!-- @JSPS_MAP@ --> entre <servlet> e <servlet-mapping> elementos, e.

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

Em seguida, use um filtro de token para substituir tag @JSPS_MAP@ com conteúdo gerado.

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

Esta abordagem tem uma vantagem que o arquivo web.xml original está completamente válido (a tag está escondido no comentário), mas lhe dá total controle de onde e quando o fragmento gerado será inserido.

Assim, para DEV construir, basta copiar ${orig-web-content.dir}/WEB-INF/web.xml para ${generated-web-content.dir}/WEB-INF/web.xml sem filtrar.

Há o jasper2 Ant tarefa outros têm. Eu pensei que eu ia mencionar um par de outras opções que eu encontrei.

Um é cactus' webxmlmerge tarefa Ant, que usa org.codehaus.cargo.module.webapp.WebXmlMerger

Outra seria a utilização de JAXB para manipular o web.xml; de Sebastien Dionne DTD-schemas-gerador demonstração faz isso . Não sei o que a licença é apesar de tudo.

fwiw tendo considerado estas opções eu acho que eu vou usar a formiga XSLT tarefa.

Em seu arquivo web.xml se você tiver tags para especificar onde a fusão começa e termina a bandeira addWebXmlMappings irá gerar o arquivo corretamente para você. As tags são: e depois de fazer isso ao meu web.xml tudo funcionou como um encanto! (Eu tenho que olhar o código para org.apcahe.jasper.JspC para ver como isso foi implementado)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top