更新:
要弄清楚捕获404的通用错误捕获程序对我来说没有足够的粒度。仅当jsp位于特定目录中,然后文件名包含特定字符串时,才需要执行此操作。
/更新
我的任务是编写一个在特定目录中拦截对JSP的调用的servlet,检查文件是否存在,是否只是转发到该文件,否则,我将转发到一个文件。默认的JSP。我已经按照以下步骤设置了web.xml:
<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>CustomJSPListener</servlet-name> <servlet-class> ... CustomJSPListener</servlet-class> <load-on-startup>1</load-on-startup> </servlet> ... <servlet-mapping> <servlet-name>CustomJSPListener</servlet-name> <url-pattern>/custom/*</url-pattern> </servlet-mapping>
servlet的doGet方法如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.debug(String.format("Intercepted a request for an item in the custom directory [%s]",request.getRequestURL().toString())); String requestUri = request.getRequestURI(); // Check that the file name contains a text string if (requestUri.toLowerCase(Locale.UK).contains("someText")){ logger.debug(String.format("We are interested in this file [%s]",requestUri)); File file = new File(requestUri); boolean fileExists = file.exists(); logger.debug(String.format("Checking to see if file [%s] exists [%s].",requestUri,fileExists)); // if the file exists just forward it to the file if (fileExists){ getServletConfig().getServletContext().getRequestDispatcher( requestUri).forward(request,response); } else { // Otherwise redirect to default.jsp getServletConfig().getServletContext().getRequestDispatcher( "/custom/default.jsp").forward(request,response); } } else { // We aren't responsible for checking this file exists just pass it on to the requeseted jsp getServletConfig().getServletContext().getRequestDispatcher( requestUri).forward(request,response); } }
这似乎导致tomcat出现错误500,我认为这是因为servlet重定向到同一个文件夹,该文件夹随后再次被servlet拦截,从而导致无限循环。有一个更好的方法吗?我以为我可以使用过滤器来执行此操作,但是我对它们并不了解。
File file = new File(requestUri);
错了 该java.io.File知道 什么 关于它运行在webapp背景下,该文件的路径将是相对于当前的工作目录,你如何启动应用程序服务器是依赖的方式。例如,它可能是相对于C:/Tomcat/binWebapp根目录的,而不是您所期望的。你不要这个
java.io.File
C:/Tomcat/bin
用ServletContext#getRealPath()一个相对路径网络转化为一个绝对的磁盘文件系统的路径。该ServletContext是由继承servlet的可用getServletContext()方法。因此,以下应指出正确的文件:
ServletContext#getRealPath()
ServletContext
getServletContext()
String absoluteFilePath = getServletContext().getRealPath(requestUri); File file = new File(absoluteFilePath); if (file.exists()) { // ... }
或者,如果目标容器不是在物理磁盘文件系统上扩展WAR,而是在内存中扩展WAR,则最好使用ServletContext#getResource():
ServletContext#getResource()
URL url = getServletContext().getResource(requestUri); if (url != null) { // ... }