Obtención de recursos de contexto web estáticos para trabajar en páginas de Wicket que se pueden marcar y no marcar.

En una aplicación Wicket 1.4, tengo algunos recursos CSS y JS estáticos en [project root]/WebContent/css y [project root]/WebContent/js respectivamente.

enter image description here

Mis archivos HTML de Wicket están en src/resources/fi/company/product/pages con las correspondientes clases de Java en src/main/fi/company/product/pages. (En el archivo WAR resultante, los archivos HTML y de propiedades están, por supuesto, en los mismos lugares que las clases de Java).

Los archivos HTML contienen referencias a recursos como:

<head>
    <link rel="stylesheet" type="text/css" href="css/main.css"/>
    <script type="text/javascript" src="js/calendar.js"></script>
</head>

Esto funciona bien en todas partes (o eso pensábamos hasta hace poco). NB: mi código Java no hace referencia a estos recursos en absoluto.

Mirando la fuente de una página renderizada (cuya URL es, por ejemplo, http://localhost:8080/report/42.4 or http://localhost:8080/?wicket:interface=:6:::: ), la referencia del recurso aparece como:

<link rel="stylesheet" type="text/css" href="../css/main.css"/> 

Sin embargo, acabamos de notar que cuando la aplicación se implementa en otro lugar que no sea la raíz (Tomcat), los recursos se rompen páginas no marcables.

En otras palabras, cuando la URL es, por ejemplo,

http://localhost:8080/foobar/?wicket:interface=:2::::

y una página se refiere a

<link rel="stylesheet" type="text/css" href="../css/main.css"/>

... el navegador intenta buscar el recurso en la URL no válida

http://localhost:8080/css/main.css

Ahora, ¿Cuál es la forma más simple (aunque no complicada) de hacer que estos recursos estáticos funcionen?, independientemente de la ruta de implementación?

Podría cambiar al uso exclusivo de páginas que se pueden marcar como favoritas (lo que requeriría cambiar los constructores de las páginas), pero supongo que eso no debería ser necesario...


Editar: Parece que tengo recursos CSS funcionando (en la mayoría de los lugares) simplemente usando <wicket:link>, como se aconseja en esta respuesta:

<head>
    <wicket:link>
    <link rel="stylesheet" type="text/css" href="css/main.css"/>
    </wicket:link>
</head>

Sin embargo, ahora las referencias CSS están rotas en una página con una URL como http://localhost:8080/foobar/report/42.9

Wicket está intentando hacer algo extraño con la ruta "css/main.css":

ERROR org.apache.wicket.RequestCycle - Can't instantiate page using constructor public fi.company.product.pages.ReportPage(org.apache.wicket.PageParameters) and argument 0 = "css" 1 = "main"
org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor public fi.company.product.pages.ReportPage(org.apache.wicket.PageParameters) and argument 0 = "css" 1 = "main"
    at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:212)
    at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:89)
    at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:305)

Editar 2: En realidad no estoy seguro si <wicket:link> es la solución correcta aquí, ya que estos archivos de recursos son no "recursos de ruta de clase". Supongo que mi pregunta es, ¿Puedes hacer que esto funcione mientras sigues usando recursos de contexto web? (es decir, sin hacer estos recursos de ruta de clase)?

preguntado el 12 de junio de 12 a las 09:06

Una cosa curiosa es que sin ningún cambio, parece que ya no puedo reproducir el problema... Ahora las referencias CSS son como css/main.css excepto en URL como /foobar/report/42 donde son como ../css/main.css. -

1 Respuestas

Correcto, lo resolví, y la solución resultó ser muy sorprendente.

Antes escribí:

Una cosa curiosa es que sin ningún cambio, parece que ya no puedo reproducir el problema...

Eso no era del todo cierto, ya que había hecho una pequeño cambio (que pensé que era intrascendente): había eliminado un archivo WebContent/index.jsp que en nuestro proyecto era un remanente que no servía para nada.

Una vez que me di cuenta de que esto podría haberlo solucionado, hice algunas pruebas más y, de hecho:

Para que los recursos estáticos funcionen como se esperaba, no debes tener un index.html or index.jsp archivo en el directorio raíz de contenido web (es decir, el padre de los directorios de recursos CSS y JS), ya que en algunos casos se rompe ../ Referencias.

Probablemente esto ni siquiera sea específico de Wicket, pero tal vez sea específico de Tomcat; si alguien sabe más, siéntase libre de participar. Dudo que esta pregunta ayude a alguien más, pero aún así, ¡me alegro de haberlo hecho funcionar!

Respondido 16 Jul 13, 09:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.