Java-сервлет:передать запрос обратно в обработку по умолчанию

StackOverflow https://stackoverflow.com/questions/1090906

Вопрос

Я хочу, чтобы сервлет обрабатывал запросы к файлам в зависимости от префикса и расширения, например.

префикс_*.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
        }
    }

(код не проверялся, только идея...)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top