Запись Сервлета, который проверяет, чтобы видеть, существует ли JSP's и вперед к другому JSP, если они не

ОБНОВЛЕНИЕ:

Разъяснить универсального ошибочного ловца, который ловит 404, не имеет достаточной гранулярности для меня. Я должен сделать это, только если jsp находится в конкретном каталоге и затем только если имя файла содержит определенную строку.

/ ОБНОВЛЕНИЕ

Для меня определили задачу с записью сервлета, который прерывает вызов к и JSP в определенном каталоге, проверьте, что файл существует и если это делает просто передачу тому файлу, если это не делает затем, я собираюсь передать 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>

И 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);   
  }
 }

Это, кажется, приводит к ошибке 500 от кота, я думаю, что это вызвано тем, что сервлет перенаправляет к той же папке, которая затем прерывается снова сервлетом, приводя к бесконечному циклу. Существует ли лучший способ сделать это? Я - вывод, чтобы полагать, что я мог использовать фильтры, чтобы сделать это, но я не знаю очень много о них.

6
задан bakoyaro 10 November 2011 в 19:51
поделиться

3 ответа

 Файл файл = новый файл (requestUri); 
 

Это неверно. java.io.File не знает ничего о контексте веб-приложения, в котором он запущен. Путь к файлу будет относиться к текущему рабочему каталогу, который зависит от способа запуска. сервер приложений. Например, он может относиться к C: / Tomcat / bin , а не к корню webapp, как вы, кажется, ожидаете. Вы не хотите этого.

Используйте ServletContext # getRealPath () , чтобы преобразовать относительный веб-путь в абсолютный путь к файловой системе на диске. ServletContext доступен в сервлете с помощью унаследованного метода getServletContext () . Таким образом, следующее должно указывать на правильный файл:

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

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

Или, если целевой контейнер не расширяет WAR в файловой системе физического диска, а вместо этого в памяти, тогда вам лучше использовать ServletContext # getResource () :

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

if (url != null) { 
    // ...
}
8
ответ дан 9 December 2019 в 20:41
поделиться

Я бы создал фиктивный каталог для начального запроса сервлета, а затем перешел в реальный каталог или на страницу типа 404. Вы все равно отправляете форвард, так почему бы просто не перенаправить в другой каталог? Это позволит избежать проблем с зацикливанием.

0
ответ дан 9 December 2019 в 20:41
поделиться

Это можно сделать намного проще и встроенным способом.

web.xml содержит элемент . Вы можете сделать что-то вроде:

<error-page>
    <error-code>404</error-code>
    <location>/pageNotFound.jsp</location>
<error-page>
4
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: