【问题标题】:Designing a generic servlet which handles request dispatching设计一个处理请求分派的通用 servlet
【发布时间】:2009-07-24 08:56:49
【问题描述】:

我有一个设计问题:)

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

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

/serviceservlet?action=action1&param1=test1&param2=test2 /serviceservlet?action=action2&param21=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 乔恩斯

【问题讨论】:

  • 这是作为练习还是实际使用?如果这是针对真实系统的,请使用适当的 MVC 框架,不要自己编写。例如,Spring 完全符合您的描述。

标签: servlets request dispatch


【解决方案1】:

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

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

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

【讨论】:

  • 是的,听起来很明智.. 使用 Stripes 怎么样?
  • 我尝试过使用 Stripes,但它与 guice 注入不太自然。我想它与其他框架存在同样的问题:(而且我想我会自己滚动直到更好的时候。
  • Guice 是依赖注入框架?我正在使用带有 Spring 的 Struts(依赖注入)并且它们集成在一起。 Struts 有一个插件架构,允许您集成各种其他技术。
猜你喜欢
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 2023-03-18
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2011-12-26
相关资源
最近更新 更多