如何根据 URL 的名称动态地将 URL 映射到 Java servlet 处理程序?(谷歌应用引擎)



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

作为背景,我正在使用Google App Engine,因此我可以访问yaml配置及其servlet API。那么,是否有一种标准的方法可以使用Java servlet API或特定于Google App Engine的框架来做到这一点呢?我以前只使用过特定的Java servlet框架,如Apache和其他东西,当我开始研究它们时,它们都已经构建好了,所以我真的不知道在这个环境中可以使用什么。总的来说,我也是新手,并且无法浏览 Servlet、服务、过滤器、侦听器和处理程序,以及哪种最适合我想要/需要的这种简单路由行为。我担心我会选错一个,或者甚至不知道适合我需求的那个。

这就是

JAX-RS所做的 - 不完全是类名映射,而是通过注释进行映射。查看一些功能。

有几种实现,我个人使用 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);
    }
}

最新更新