1

我有一个设计问题:)

我想要多个 servlet,但我不想每次都用新名称配置一个新的 servlet 并扩展 HttpServlet。我正在考虑拥有一个通用 servlet,它将不同的参数分派给实际处理请求的不同特定类。

例如:这两个调用将由同一个通用 servlet 处理,但分派给不同的服务(类)。

/serviceservlet?action=action1¶m1=test1¶m2=test2 /serviceservlet?action=action2¶m21=test

这可以通过许多不同的方式完成,我不知道该采用哪种设计。我现在拥有的是使用 guice 进行引导,看起来像这样:

@Singleton 公共类 ServiceServlet 扩展 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"));
    }
}

}

原则上,我想以更通用的方式处理服务,并且我希望以后添加新服务尽可能容易,但我不想失去类型安全性。你认为最好的策略是什么?

/Br 乔恩斯

4

1 回答 1

1

如今,Web 程序员自己不会编写这种代码。这些使用像 Struts 或 JSF 或 Spring(如果您是 Java 程序员)这样的 Web 框架,它们提供了分派请求的优雅实现,从请求映射到实现请求的类。还有很多很多。

但是,如果您真的想“自己动手”,那么我建议您首先不要在 servlet 中使用 if 语句。您应该使用将请求 URI 映射到服务类的映射(即 HashMap)。在 servlet 初始化时,应该用服务类的实例填充映射。在您的 servlet 中添加一个方法, getServiceClass() 返回从 HttpServiceRequest 获取 URI 和 ACTIONS 并查找您的服务类。更好的是,您应该映射服务类,而不是请求参数,而是映射到 URI:myapp/serviceX 映射到 ServiceX.class。使用执行方法定义服务接口Service,并从Servlet 调用执行方法。

总结一下:
1) 在 servlet 初始化时加载请求 URI 到服务类的映射。
2)在servlet和服务类之间定义一个服务接口。
3) 从 servlet 中,从请求中获取 URI(URI 的相关部分)并查找相应的服务并调用其执行方法(或您选择提供的任何名称)。

于 2009-07-24T19:21:37.470 回答