Projetar um servlet genérico que lida com a expedição de solicitação
Pergunta
Eu tenho uma pergunta de design :)
Quero ter vários servlets, mas não quero configurar um novo servlet com um novo nome a cada vez e estender o httpServlet. Eu estava pensando em ter um servlet genérico que despacha parâmetros diferentes para diferentes classes específicas que estão realmente lidando com a solicitação.
Ex: Essas duas chamadas serão atendidas pelo mesmo servlet genérico, mas despachadas para diferentes serviços (classes).
/ServiceServlet? Action = Action1¶m1 = Test1¶m2 = Test2 /ServiceVlet? Ação = Ação2¶m21 = Teste
Isso pode ser feito de muitas maneiras diferentes e eu não sei para qual design passar. O que tenho agora é usar Guice para bootstrapping e se parece com o seguinte:
@Singleton Public Class ServiceServlet estende httpServlet {
private static final String PARAM_ACTION = "action";
private final Service1 service1; // Service1 is an interface
private final Service2 service2; // Service2 is another interface
@Inject
public ServiceServlet(final Service1 service1) {
this.service1 = service1;
}
@Inject
public ServiceServlet(final Service2 service2) {
this.service2 = service2;
}
@Override
public void doPost(final HttpServletRequest request, final HttpServletResponse response) {
String action = ServletUtils.getStringParameter(request, PARAM_ACTION);
if ("action1".equals(action)) {
... check that the parameters are correct before executing the below to have typesafety
service1.process(request.getParameter("param1"), request.getParameter("param2"));
} else if ("action2".equals(action)) {
... check that the parameters are correct before executing the below to have typesafety
service2.process(request.getParameter("param21"));
}
}
}
Em princípio, gostaria de lidar com os serviços de uma maneira mais genérica e quero que seja o mais fácil possível adicionar novos serviços posteriormente, mas não quero perder o Typefety. Qual você acha que é a melhor estratégia?
/Br Joynes
Solução
Atualmente, os programadores da Web não escrevem esse tipo de código. Eles usam estruturas da Web como Struts ou JSF ou Spring (se você é um programador Java) que fornece implementações elegantes de solicitações de despacho, de mapeamento de solicitações para classes que implementam as solicitações. E muito, muito mais.
No entanto, Se você realmente quer "rolar o seu" , então eu sugeriria, primeiro, que você não use uma declaração se dentro do seu servlet. Você deve usar um mapa (ou seja, hashmap) que os mapas solicitam a Uris para atender a classes. No Servlet Init, o mapa deve ser preenchido com instâncias das classes de serviço. Dentro do seu servlet, adicione um método, getServiceClass () que retorna obtém o URI e as ações da HttpServicerequest e procura sua classe de serviço. Melhor ainda, você deve mapear as classes de serviço, não solicitar parâmetros, mas para URIs: MyApp/ServiceX mapas para ServiceX.class. Defina uma interface de serviço, serviço, com um método de execução e chame o método Execute do servlet.
Resumindo:
1) Carregue um mapa dos URIs de solicitação para atender as classes quando o servlet inits.
2) Defina uma interface de serviço entre o servlet e a classe de serviço.
3) A partir do servlet, pegue o URI (parte relevante do URI) da solicitação e procure o serviço correspondente e ligue para o método Execute (ou qualquer nome que você escolher).