Java 每个webapp有一个或多个servlet?

Java 每个webapp有一个或多个servlet?,java,servlets,web-applications,Java,Servlets,Web Applications,我知道,这取决于网络应用程序。但是在正常情况下,您会做什么:一个servlet,为不同的页面提供服务(就像一个独立的应用程序,内容不断变化),或者为每个页面提供一个servlet 以博客为例。有一个包含最新博客条目的起始页,一个用于显示一个博客条目和一个存档的文章视图。您是使用三个不同的servlet来实现这一点,还是使用一个分派给函数的servlet来实现这一点。至少有一部分内容是共享的,比如http头 那么,您的经验是什么,什么最有效?通常您会为每个用例创建一个servlet。servlet

我知道,这取决于网络应用程序。但是在正常情况下,您会做什么:一个servlet,为不同的页面提供服务(就像一个独立的应用程序,内容不断变化),或者为每个页面提供一个servlet

以博客为例。有一个包含最新博客条目的起始页,一个用于显示一个博客条目和一个存档的文章视图。您是使用三个不同的servlet来实现这一点,还是使用一个分派给函数的servlet来实现这一点。至少有一部分内容是共享的,比如http头


那么,您的经验是什么,什么最有效?

通常您会为每个用例创建一个servlet。servlet就像应用程序的控制器。当您识别来自用户的交互时,然后实现一个servlet来控制该交互

也就是说,如果您使用普通的servlet/JSP来构建站点。如果您使用的是struts之类的框架,您会发现它们实现了front controller模式,并使用一个servlet接收所有请求,并将这些请求转发给实现用户请求实际逻辑的action类。这是一个很好的实践…这就是为什么这么多人使用这些框架的原因

因此,简单的回答是,您将为每个webapp创建许多servlet,因为每个webapp将公开几个用例


[编辑]重新阅读您的问题,您似乎在使用术语“站点”来表示页面或视图。同样,这取决于该视图上发生了什么。例如,要显示最新的博客条目,可以使用servlet从数据库构建条目列表以供显示。如果用户单击一个条目,那么另一个servlet可以检索该条目以供查看,以此类推。主要来说,每个操作都是一个用例,因此是一个不同的servlet。

大多数web框架使用dispatcher servlet(例如:Spring MVC),负责将请求路由到适当的类/控制器

当您开始拥有大量页面时,这种方法效果最好,因为您有一种更为用户友好的方式(关于web.xml)来声明/管理处理http请求及其url的类。示例(同样是spring mvc):

此外,使用DispatcherServlet可以使代码流保持集中。

这取决于具体情况

在我最近的项目中,我实现了一个servlet,它将委托给以依赖注入方式实例化的几个类似servlet的对象。例如,我的servlet中有类似的内容(伪代码):

其中Handler是一个带有布尔句柄(请求、响应)方法的接口。我从一个容器中获得我的处理程序(无论是Spring还是更轻量级的东西)

原因是我非常喜欢依赖注入,在servlet中很难实现它;对于大多数提供web组件依赖注入的框架,我真的感觉不太自在——我喜欢servlet的简单性


如果不是这样,我会选择多个servlet,尽管这是一个折衷方案;要么你有一个包含很多(和很多)servlet映射的巨大web xml,要么你有一个非常复杂的servlet(除非你使用类似我的d-i方法)。

这是轮子的再发明。一个特别好的轮子是DispatcherServlet。有关更多详细信息,请参阅。它的控制器接口接受像你的“处理器”一样的请求和响应。我知道Spring的MVC——它显然影响了我的设计。但是它有很多我不需要的特性,而且有点复杂。这对我来说效果很好,我想自己实现它。如果Spring的MVC非常适合您的需要,请务必使用它。请您进一步解释一下
好吗?我已经实现了一个servlet,它将委托给以依赖项注入方式实例化的几个类似servlet的对象。如果您有4个不同的servlet
B
C
D
E
,我将如何添加一个servlet
a
,该servlet将把作业专用于
B
C
D
E
。我的B、C、D和E不是servlet,是看起来非常类似于Servlet的接口实例。“A”是一个servlet。我只是将所有内容映射到A,A调用一个类似servlet的对象中的服务方法。这是Spring的DispatcherServlet所做的事情之一,您可以检查它们的源代码。它是否类似于mvc存储库模式?与asp.net mvc一样,我们将类似的函数聚合到一个控制器中。servlet和这个想法类似吗?@永恒不真的,我不这么认为。servlet是相当低级的构建块,多年来,应用程序开发人员一直在使用更高级的框架,这些框架位于servlet平台之上,但提供了更好的应用程序体系结构。例如,SpringMVC就是这样一个框架,它在许多方面与ASP MVC相似。
@Controller
public class MyController {
 @RequestMapping("/viewPosts")
 public void doViewPosts(HttpRequest r, HttpResponse res) {
  //...
 }
}
for(Handler handler : handlers) {
    if(handler.handle(request, response)) {
         return;
    }
}