设计处理请求调度的通用servlet

时间:2009-07-24 08:56:50

标签: servlets request dispatch

我有一个设计问题:)

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

Ex:theese两个调用将由同一个通用servlet处理,但调度到不同的服务(类)。

/ serviceservlet动作=动作1&安培;参数1 = TEST1&安培; param2的= TEST2 / serviceservlet动作= 1动作&安培; param21 =测试

这可以通过许多不同的方式完成,我不知道要采用哪种设计。我现在拥有的是使用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 joynes

1 个答案:

答案 0 :(得分:1)

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

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

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