小编典典

编写一个Servlet,检查是否存在JSP,如果不存在,则转发到另一个JSP

jsp

更新:

要弄清楚捕获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拦截,从而导致无限循环。有一个更好的方法吗?我以为我可以使用过滤器来执行此操作,但是我对它们并不了解。


阅读 282

收藏
2020-06-08

共1个答案

小编典典

File file = new File(requestUri);

错了 该java.io.File知道 什么
关于它运行在webapp背景下,该文件的路径将是相对于当前的工作目录,你如何启动应用程序服务器是依赖的方式。例如,它可能是相对于C:/Tomcat/binWebapp根目录的,而不是您所期望的。你不要这个

ServletContext#getRealPath()一个相对路径网络转化为一个绝对的磁盘文件系统的路径。该ServletContext是由继承servlet的可用getServletContext()方法。因此,以下应指出正确的文件:

String absoluteFilePath = getServletContext().getRealPath(requestUri);
File file = new File(absoluteFilePath);

if (file.exists()) { 
    // ...
}

或者,如果目标容器不是在物理磁盘文件系统上扩展WAR,而是在内存中扩展WAR,则最好使用ServletContext#getResource()

URL url = getServletContext().getResource(requestUri);

if (url != null) { 
    // ...
}
2020-06-08