Servir archivos estáticos (JavaScript) con Struts 2
-
27-09-2019 - |
Pregunta
Quiero poner algunos archivos JavaScript en uno de mis paquetes y hacer que ellos sirven como puntales /struts/js/foo.js
Puntales hace que los archivos en el paquete de 'plantilla' (que es donde se encuentran los archivos de jQuery plugin, vigilado por la opción struts.ui.templateDir
). Sin embargo, quiero poner esos archivos en otro paquete; Si struts.ui.templateDir
redefinen cesa entonces puntales de trabajo porque no puede encontrar sus plantillas.
Así que la pregunta es: ¿Cómo saber puntales para servir archivos en org.foo.some.package.js
como /struts/js/whatever.js
Solución
Struts2 puede servir contenido estático fuera de la caja. Por el contenido estático por defecto está siendo servido por DefaultStaticContentLoader
una implementación de StaticContentLoader
. Se busca automáticamente los siguientes paquetes:
- org.apache.struts2.static
- plantilla
- estática
- org.apache.struts2.interceptor.debugging
Puede agregar paquetes adicionales que se debe buscar en el parámetro init filtro llamado "paquetes".
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>packages</param-name>
<param-value>some.package another.one</param-value>
</init-param>
</filter>
Se puede añadir más de un paquete, el uso de la coma o espacio o tabulador o nueva línea como separador.
Por cierto, se puede controlar si el contenido estático se almacena en caché por un navegador o no con esta constante:
struts.serve.static.browserCache
Otros consejos
Una forma es extender a toda la plantilla y cambiar el TEMPLATEDIR como ya sugirió. A menos que uno necesita para implementar una nueva plantilla, esto es altamente sobre-kill.
Sin embargo, en mi humilde opinión la mejor manera es olvidar /struts/js/foo.js
y utilizar cualquier otro URL para cargar el js.
pocas muestras:
JSP
WebPages
|-->myjs.js (a normal js file)
|-->mydynamicjs.jsp (a .jsp file containing ONLY javascript code)
|-->WEB-INF-->xyz.js (another .js file but accessed only through action)
Puntales
<action name="myacctionjs">
<result>/WEB-INF/xyz.js</result>
</action>