Java-сервлет:передать запрос обратно в обработку по умолчанию
-
11-09-2019 - |
Вопрос
Я хочу, чтобы сервлет обрабатывал запросы к файлам в зависимости от префикса и расширения, например.
префикс_*.xml
Поскольку сопоставление начала и конца пути запроса невозможно, я сопоставил все запросы *.xml с моим сервлетом.Теперь вопрос:как я могу выйти из своего сервлета для XML-файлов, не начинающихся с «prefix_», чтобы запрос обрабатывался как «обычный» запрос к XML-файлу?
Это, вероятно, довольно просто, но я, похоже, не могу этого понять...:-/
Заранее большое спасибо
Решение
Я настоятельно рекомендую использовать для этого подходящую структуру MVC.Как вы обнаружили, гибкость стандартного API сервлетов очень ограничена, когда дело доходит до диспетчеризации запросов.
В идеале вы могли бы использовать существующий код сервлета в сочетании с платформой MVC, при этом платформа выполняла бы действия на основе шаблона пути, а ваши сервлеты выполняли бы бизнес-логику.К счастью, Spring MVC позволяет вам сделать это с помощью ServletForwardingController.Это будет очень легкая весенняя конфигурация.
Итак, в вашем web.xml будет что-то вроде этого:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>foo.MyServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<url-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*</url-pattern>
</url-mapping>
Тогда у вас будет такой файл WEB-INF/spring-servlet.xml:
<beans>
<bean name="/prefix*.xml" class="org.springframework.web.servlet.mvc.ServletForwardingController">
<property name="servletName" value="myServlet"/>
</bean>
</beans>
И это было бы примерно так.Все запросы к /prefix*.xml будут отправляться в myServlet, а все остальные — в контейнер.
Другие советы
другое решение (возможно, подойдет вам): если вы используете/планируете использовать Apache перед этим экземпляром веб-контейнера, вы можете использовать модуль перезаписи Apache.Переписывание URL-адреса на что-то более удобное для контейнера Webapp.
Надеюсь это поможет.Дэйвид.
Не уверен, но как только вы перехватите все запросы *.xml, вы сможете снова проверить запрос в своем коде через HttpServletRequest.getRequestURI().
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uri =req.getRequestURI();
int i = uri.lastIndexOf('/');
int j = uri.lastIndexOf('.', i);
if (uri.substring(i+1, j).startsWith("prefix_")) {
// your code
}
}
(код не проверялся, только идея...)