Hi, I was trying to create a Filter that generates the some content as files (if required) into the file system and lets the default servlet handle the rest. However I noticed that if the uri was such that TC would interpret it as "static content" like /foobar.html - I would get a 404 on the first request. If the uri refers to more dynamic content such as /foobar.jsp - you don't get a 404.
Assuming this is because of TC:s static content caching I tried to disable it by setting context parameters cacheTTL to zero and cachingAllowed to false. This worked with static uri's like /foobar.html but not with /foobar.jsp or /foobar/. Another interesting feature seemed to be that if the uri refers to a "directory" like /foobar/ and eventhough the "dynamic" index.jsp has been generated by the filter, 404 is still the result on the first request. So the question is: how to force TC to check if file exists in real time? Below a test Filter do demonstrate. Try uris like: /somepage.jsp -> loaded on first request but cached /somepage.html -> not loaded on first request (unless you have disabled static caching from context) /somedirectory/ -> not loaded on first request /somenewdirectory/?forward=1 -> loaded on first request -jukka- ps. tested on TC 6.0.14. ---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8< import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; /** * * @author jsr */ public class FilterThatGeneratesContent implements Filter { private FilterConfig filterConfig = null; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String uri = httpRequest.getRequestURI(); // assumes not deployed as ROOT String relativeURI = uri.substring(uri.indexOf("/", 1), uri.length()); if (relativeURI.equals("/")) { relativeURI = "index.jsp"; } else if (relativeURI.endsWith("/")) { relativeURI += "index.jsp"; } try { createFile(relativeURI); if (request.getParameter("include") != null) { httpRequest.getRequestDispatcher(relativeURI). include(request, response); } else if (request.getParameter("forward") != null) { httpRequest.getRequestDispatcher(relativeURI). forward(request, response); } else { chain.doFilter(request, response); } } catch (Exception e) { throw new ServletException(e); } } private void createFile(String relativeURI) throws Exception { String webAppDir = filterConfig.getServletContext().getRealPath(""); File contentFile = new File(webAppDir, relativeURI); contentFile.getParentFile().mkdirs(); FileWriter writer = new FileWriter(contentFile); writer.write("<html><body>" + "<pre>" + "Current Servlet time: " + new Date() + "<br/>" + "Current JSP time: <%=new java.util.Date()%><br/>" + "</pre>"); writer.flush(); writer.close(); } public void destroy() { } public void init(FilterConfig filterConfig) { this.filterConfig = filterConfig; } }