Servir arquivos estáticos (JavaScript) com Struts 2
-
27-09-2019 - |
Pergunta
Quero colocar alguns arquivos JavaScript em um dos meus pacotes e fazer com que o Struts os sirva como /struts/js/foo.js
O Struts faz isso para arquivos no pacote 'template' (é onde os arquivos do plugin jQuery estão localizados, guardados por struts.ui.templateDir
opção).No entanto, quero colocar esses arquivos em outro pacote;Se eu redefinir struts.ui.templateDir
então o struts para de funcionar porque não consegue encontrar seus modelos.
Então a questão é:Como dizer ao Struts para servir arquivos em org.foo.some.package.js
como /struts/js/whatever.js
?
Solução
Struts2 pode servir conteúdo estático pronto para uso.Por padrão, o conteúdo estático está sendo servido por DefaultStaticContentLoader
uma implementação de StaticContentLoader
.Ele pesquisa automaticamente os seguintes pacotes:
- org.apache.struts2.static
- modelo
- estático
- org.apache.struts2.interceptor.debugging
Você pode adicionar pacotes adicionais para serem pesquisados no parâmetro init do filtro chamado "pacotes".
<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>
Você pode adicionar mais de um pacote, usar vírgula ou espaço ou tabulação ou nova linha como separador.
Aliás, você pode controlar se o conteúdo estático está sendo armazenado em cache por um navegador ou não com esta constante:
struts.serve.static.browserCache
Outras dicas
Uma maneira é estender todo o modelo e alterar o modelo como você já sugeriu. A menos que seja necessário implementar um modelo personalizado, isso é muito exagerado.
Mas a melhor maneira de esquecer o IMHO /struts/js/foo.js
e use qualquer outro URL para carregar o JS.
Poucas amostras:
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)
Suportes
<action name="myacctionjs">
<result>/WEB-INF/xyz.js</result>
</action>