Java Servlet: passar um pedido de volta para processamento padrão
-
11-09-2019 - |
Pergunta
Eu quero um Servlet para lidar com solicitações para arquivos, dependendo prefixo e extensão, por exemplo.
prefixo _ *. Xml
Uma vez que o mapeamento em início e fim de pedido caminho não é possível, eu mapearam todas as solicitações * .xml para o meu Servlet. A questão agora é: como posso abandonar a minha servlet para arquivos XML não começando com "prefix_", para que o pedido seja tratado como um pedido de "normal" para um arquivo xml
Este é provavelmente muito simples, mas eu não parecem ser capazes de descobrir isso ...: - /
Muito obrigado antecipadamente
Solução
Gostaria de sugerir usando um framework MVC adequada para isso. Como você descobriu, a flexibilidade da API servlet padrão é muito limitada quando se trata de pedido de despacho.
O ideal é que você seria capaz de usar seu código servlet existente em combinação com um framework MVC, com o quadro fazendo o diapcthing baseado em padrão caminho, e seus servlets fazendo a lógica de negócios. Felizmente, Spring MVC permite que você faça exatamente isso, usando o ServletForwardingController. Seria uma configuração de mola muito leve.
Então você teria algo parecido com isso no seu 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>
Você teria, então, um arquivo WEB-INF / spring-servlet.xml assim:
<beans>
<bean name="/prefix*.xml" class="org.springframework.web.servlet.mvc.ServletForwardingController">
<property name="servletName" value="myServlet"/>
</bean>
</beans>
E isso seria muito bonito isso. Todos os pedidos de /prefix*.xml iria para MyServlet, e todos os outros cairia até o recipiente.
Outras dicas
outra solução (talvez se encaixa para você) é se você estiver usando / plano de usar um Apache na frente dessa instância container web, você poderia usar o módulo de reescrita do apache. Reescrevendo a url para algo mais fácil de manusear para o recipiente Webapp.
Espero que isso ajude. David.
Não shure, mas uma vez que você pegar todos os pedidos .xml * Você pode inspecionar o pedido novamente em seu código via 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
}
}
(código não testado apenas uma idéia ...)