28

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

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

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

4

3 回答 3

12

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

也就是说,如果您使用普通的 servlet/JSP 来构建站点。如果您使用像 struts 这样的框架,您会发现它们实现了前端控制器模式并使用单个 servlet 接收所有请求并将这些请求转发到实现用户请求的实际逻辑的操作类。自己做这件事要困难得多,但这是一个很好的做法……这就是为什么这么多人使用这些框架的原因。

所以简短的回答是,您将为每个 webapp 创建许多 servlet,因为每个 webapp 都会公开几个用例。

[编辑] 重新阅读您的问题,好像您使用术语站点来表示页面或视图。同样,这取决于该视图上发生的情况。例如,要显示最新的博客条目,您可以有一个 servlet,它从数据库中构造条目列表以供显示。如果用户单击一个条目,则另一个 servlet 可以检索该单个条目以进行查看等。主要是,每个动作都是一个用例,因此是一个不同的 servlet。

于 2008-11-07T13:56:03.797 回答
10

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

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

@Controller
public class MyController {
 @RequestMapping("/viewPosts")
 public void doViewPosts(HttpRequest r, HttpResponse res) {
  //...
 }
}

此外,拥有调度程序 servlet 可以使您的代码流保持集中。

于 2008-11-07T15:48:40.853 回答
3

这取决于。

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

for(Handler handler : handlers) {
    if(handler.handle(request, response)) {
         return;
    }
}

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

原因是我很喜欢依赖注入,在Servlet中很难实现;对于大多数提供 Web 组件依赖注入的框架,我真的不太熟悉——我喜欢 servlet 的简单性。

如果不是这样,我会使用多个 servlet,尽管有一个权衡;要么你有一个巨大的 web xml,有很多(和很多)servlet 映射,要么你有一个非常复杂的 servlet(除非你使用类似我的 di 方法)。

于 2008-11-07T16:39:28.740 回答