对于处理多个URL的控制器servlet,建议采用什么方法?

对于处理多个URL的控制器servlet,建议采用什么方法?,url,jakarta-ee,servlets,Url,Jakarta Ee,Servlets,我一直在学习netbeans电子商务教程,他们将其设置为处理多个URL 然而,他们这样做的方式基本上是有一个大的if-then-else-if语句: String userPath = request.getServletPath(); // if category page is requested if (userPath.equals("/category")) { // TODO: Implement category request

我一直在学习netbeans电子商务教程,他们将其设置为处理多个URL

然而,他们这样做的方式基本上是有一个大的
if-then-else-if
语句:

    String userPath = request.getServletPath();

    // if category page is requested
    if (userPath.equals("/category")) {
        // TODO: Implement category request

    // if cart page is requested
    } else if (userPath.equals("/viewCart")) {
        // TODO: Implement cart page request

        userPath = "/cart";

    // if checkout page is requested
    } else if (userPath.equals("/checkout")) {
        // TODO: Implement checkout page request

    // if user switches language
    } else if (userPath.equals("/chooseLanguage")) {
        // TODO: Implement language request

    }
这真的是在一个servlet中处理多个URL的推荐方法吗?这种方法看起来很可怕,也很难管理


还是我缺少了一些明显的干净处理方法?

您应该使用一个MVC框架,比如Stripes或Spring MVC,它可以为您(以及更多)处理这个问题。在这些框架中,您可以配置一个servlet来截获对给定URL模式的所有请求(*.action,例如),此servlet根据注释和/或命名约定和/或配置向适当的操作发送信息。

您可以使用ServletFilter并以以下方式配置web.xml,以将客户端请求重定向到适当的目标控制器

对于上述代码段中的不同用户路径,将使保持更改

使用这种方法,您可以根据需要将多个URL发送到相同(或多个)过滤器

<filter>
  <filter-name>My Filter</filter-name>
  <filter-class>com.project.my.MYclass</filter-class>
</filter>


<filter-mapping>
  <filter-name>My Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

我的过滤器
com.project.my.MYclass
我的过滤器
/*

这真是太可怕了。然而,一个真正像样的前端控制器要复杂得多。他们显然想让事情简单化。在本教程中,我宁愿使用单独的Servlet(由于Servlet 3.0,通过
@WebServlet
注释将Servlet注册为独立的迷你控制器非常容易,无需任何XML配置),而不是对“前端控制器”设计进行误导性的介绍。另见相关问题/答案:@BalusC谢谢。我同意他们应该在示例中为每个url创建一个servlet,链接的答案再次确认了我关于解决这些问题的最初想法。非常感谢,谢谢。是的,我知道Spring MVC(我同意这是一种更好的处理方式),但这是一门学习使用servlet的课程,所以我真的想知道普通servlet的最佳实践是什么。如果你使用普通servlet,那么每个URL(或URL组)有一个servlet,或者重新实现你自己的MVC框架。但是已经有几十个了,所以我会走这条路。是的,谢谢。我可能会实现一个servlet,它有一个AbstractFactory来为特定的URL生成处理程序,而不是依赖于第三方库,但在我的课程报告中指出,重新设计这个轮子可能是个坏主意,并指出可以使这更简单的可用框架。感谢您的输入。我看不出这与我目前拥有的有什么不同,我现在拥有的是一个类上的注释,它定义了它将处理哪些URL,但是所有URL仍然由该类中的相同方法处理?当筛选器匹配时,将调用指定类(
com.project.my.MYclass
)中的哪个方法我在上面提供的链接(或代码段)中没有看到注释,因此我觉得使用了简单的if和else条件块重定向url。如果所有请求都是同一个类,那么您可能需要一个工厂模式来促进低耦合的实现。