ОБНОВЛЕНИЕ:
Разъяснить универсального ошибочного ловца, который ловит 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 от кота, я думаю, что это вызвано тем, что сервлет перенаправляет к той же папке, которая затем прерывается снова сервлетом, приводя к бесконечному циклу. Существует ли лучший способ сделать это? Я - вывод, чтобы полагать, что я мог использовать фильтры, чтобы сделать это, но я не знаю очень много о них.
Файл файл = новый файл (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) {
// ...
}
Я бы создал фиктивный каталог для начального запроса сервлета, а затем перешел в реальный каталог или на страницу типа 404. Вы все равно отправляете форвард, так почему бы просто не перенаправить в другой каталог? Это позволит избежать проблем с зацикливанием.
Это можно сделать намного проще и встроенным способом.
web.xml содержит элемент
. Вы можете сделать что-то вроде:
<error-page>
<error-code>404</error-code>
<location>/pageNotFound.jsp</location>
<error-page>