I want to put some JavaScript files in one of my packag开发者_StackOverflow社区es and make Struts serve them like /struts/js/foo.js
Struts does that for files in 'template' package (that's where jQuery plugin's files are located, guarded by struts.ui.templateDir
option). However I want to put those files into another package; If I redefine struts.ui.templateDir
then struts ceases working because it can't find its templates.
So the question is: How to tell Struts to serve files in org.foo.some.package.js
as /struts/js/whatever.js
?
Struts2 can serve static content out of the box. By default static content is being served by DefaultStaticContentLoader
an implementation of StaticContentLoader
. It automatically searches the following packages:
- org.apache.struts2.static
- template
- static
- org.apache.struts2.interceptor.debugging
You can add additional packages to be searched in filter init parameter named "packages".
<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>
You can add more than one package, use comma or space or tab or new line as separator.
BTW you can control whether static content is being cached by a browser or not with this constant:
struts.serve.static.browserCache
One way is to extend the entire template & change the templateDir as you already suggested. Unless one needs to implement a custom template, this is highly over-kill.
But the best way IMHO is to forget /struts/js/foo.js
& use any other URL to load the js.
Few Samples :
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)
Struts
<action name="myacctionjs">
<result>/WEB-INF/xyz.js</result>
</action>
精彩评论