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

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top