如何根据URL名称动态地将URL映射到Java servlet处理程序? (Google App Engine)

时间:2012-04-22 17:54:24

标签: google-app-engine servlets url-routing java-server

我正在寻找的是我可以添加到Java类中的某种类或注释,这些类专用于处理特定请求,并且URL根据其名称映射到这些类。例如,将URL“... / api / GetContactsRequest”映射到名为GetContactsRequest的处理程序(如果不存在此类处理程序,则为404)。我知道我可以编写servlet并将每个URL映射到每个servlet,但我认为样板路由代码/配置越少越好!这些将主要是应用程序请求处理程序,使用JSON进行通信。我还没弄清楚我将如何处理静态请求,但我很可能只是向用户发送一个大型Web应用程序来导航自己或其他东西。

对于后台,我正在使用Google App Engine,因此我可以访问yaml配置及其servlet API。那么有一种标准的方法可以使用Java servlet API或Google App Engine特定的框架吗?我以前只使用过像Apache这样的特定Java servlet框架,这些框架都是在我开始编写它们时已经构建的,所以我真的不知道这个环境有什么用处。我对这一切也很陌生,并且无法浏览Servlet,服务,过滤器,监听器和处理程序,以及哪种最适合我想要/需要的简单路由行为。我担心我会选错了,或者甚至不知道那个能满足我需要的那个。

1 个答案:

答案 0 :(得分:5)

这是JAX-RS的作用 - 不完全是类名映射,而是通过注释进行映射。见some of the features

有几个实现,我个人使用RESTEasy - 它在GAE上完美运行。另外,我使用Jackson(自带RESTEasy)来生成JSON。

如果您需要生成html,那么请查看htmleasy - 它是RESTEasy之上的一个薄层,可以使用不同的html模板库。它将帮助您将逻辑与表示分开。

修改

如果您真的想避免使用标准库并自行编写内容,那么编写一个servlet过滤器来检查请求并将其转发到您的servlet(或调用自定义代码):

public class ForwardFilter implements Filter {

    @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) {

        if(request.getRequestURI().equals("/some/path")){
            request.getRequestDispatcher("/path/where/servlet/registered").forward(request, response);
            return; // prevents normal request processing

        }

        // you need this for normal request path
        filterChain.doFilter(request, response);
    }
}