Here is an example. You can make the cache values dynamic. I assume you
know how to use class loaders to get your classpath dynamically, which is
what Classpath.WEB_INF does. This solution involves having one folder where
you store all your resources, separating them into subfolders named "tiff",
etc.
public final class ResourceCacheAction
extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException,
ServletException {
String file = request.getParameter("file");
String ext = file.substring(file.lastIndexOf('.') + 1);
String type = null;
String path = null;
if ("gif".equals(ext)) {
type = "image/gif";
path = path("gif");
} else if ("jpg".equals(ext)) {
type = "image/jpeg";
path = path("jpeg");
} else if ("css".equals(ext)) {
type = "text/css";
path = path("css");
} else if ("flash".equals(ext)) {
type = "application/x-shockwave-flash";
path = path("flash");
} else if ("text".equals(ext)) {
type = "text/plain";
path = path("text");
} else if ("js".equals(ext)) {
type = "text/javascript";
path = path("js");
} else if ("png".equals(ext)) {
type = "image/png";
path = path("png");
} else if ("html".equals(ext)) {
type = "text/html";
path = path("html");
} else if ("bmp".equals(ext)) {
type = "image/bmp";
path = path("bmp");
} else if ("tif".equals(ext)) {
type = "image/tiff";
path = path("tiff");
} else if ("tiff".equals(ext)) {
type = "image/tiff";
path = path("tiff");
}
String fileName = Classpath.WEB_INF + path + file;
response.setContentType(type);
/* E.g. cache = "post-check=120,pre-check=240",
= "max-age=86400,private"
post-checks are the time after the initial cache at which you
have an immediate view without any update. The time from the
post to the pre-check is the time whem you get an immediate
view but an update. The time after the pre-check time is when
you get an update prior to a view.
Cf.
http://msdn.microsoft.com/workshop/author/perf/perftips.asp#Use_Cache-Control_Extensions
*/<http://msdn.microsoft.com/workshop/author/perf/perftips.asp#Use_Cache-Control_Extensions*/>
String cache = request.getParameter("cache"); /* HTTP 1.1: Numbers
are seconds for cache. */
String pragma = request.getParameter("pragma"); /* HTTP 1.0: Numbers
are seconds for pragma. */
String expires = request.getParameter("expires");/* HTTP 1.0: Numbers
are minutes for expires. */
response.setHeader("Cache-Control", ((cache == null) ?
"max-age=8640000,private" : cache));
response.setHeader("Pragma", ((pragma == null) ?
"max-age=8640000,private" : pragma));
response.setHeader("Expires", ((expires == null) ?
"144000" : expires));
response.addHeader("Content-Disposition",("filename=" + fileName));
try {
FileInputStream fis = new FileInputStream(fileName);
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] bytes = new byte[bis.available()];
OutputStream os = response.getOutputStream();
bis.read(bytes);
os.write(bytes);
os.flush();
os.close();
os = null;
fis.close();
fis = null;
bis.close();
bis = null;
} catch (IOException ioe) {
StdOut.log(SiteConstant.ERROR_LOG,"ResourceCacheAction: problem file
is: " + fileName + "\n" + StackTrace.trace(ioe) + "\n" + ioe.getMessage());
}
return null;
}
private String path(String fileType) {
return "resource" + File.separator + "content_type" + File.separator +
fileType + File.separator;
}
} ///;-)
On 5/16/06, M.Liang Liu <[EMAIL PROTECTED]> wrote:
*Dakota Jackļ¼*your solution is awesome;cool.
Actually I am a freshman to struts;as a result,I need your help to do the
same as you.
**Greatly appreciated if you send your code of the very action
class which
is to deliver all images or other resources.
Thanks .
On 5/17/06, Dakota Jack <[EMAIL PROTECTED]> wrote:
>
> Using standard URLs is just a guarantee that you will keep having these
> sorts of problems. I use an action to deliver all images, including
> flash,
> or other resources, CSS, etc. I would suggest you do the same and you
> will
> never have to worry about this recurrent problem again.
>
>
--
"You can lead a horse to water but you cannot make it float on its back."
~Dakota Jack~