servlet应该执行多少个动作?

时间:2009-08-27 12:53:15

标签: java servlets

我是Web开发的新手,我只是想知道java servlet的最佳实践。每个servlet应该只执行一个动作,即用于登录的servlet,用于注册的servlet等,还是应该通过传递一个不同的参数来告诉servlet要执行哪个动作来组合类似的动作?

干杯

5 个答案:

答案 0 :(得分:4)

在Struts等框架中,只有一个servlet(尽管可能有多个实例正在运行)。这个servlet将处理对各种URL的请求,并将它们从相关的动作处理程序中传递出去。

我最终只编写额外的servlet来提供不同的内容类型,例如图像渲染servlet。

答案 1 :(得分:4)

你永远不应该传递参数来告诉servlet做不同的动作。您正在做的就是将2个servlet合并为一个,这将变得更加难以管理。你需要为每个'动作'建立一个servlet。

要避免的一个例子是:

/应用/ Servlet1?行动=编辑

if (request.getParamater("action").equals("edit")) {
//update fields

} else if (request.getParamater("action").equals("view")) {
//just query
}

当你想重新设计任何东西时,这往往会导致很多问题。您将需要具有单独的servlet,因为它正在解耦您的逻辑,以便您可以轻松地更改它,而不是耦合它不应该与之相关的各种复杂的代码。另外,请查看Separation of Concerns

修订/编辑: 我现在要说这个(稍后回到最初的答案)......你可以保留“多个动作”的概念并将其放入一个servlet(控制器)中。该控制器可以并且委托给各个动作处理程序。我认为在关注点分离方面是相同的,并且比我原来的答案更清晰。换句话说,不要在servlet中实现任何东西,只能用于路由。

答案 2 :(得分:1)

我更喜欢servlet而不是更多。您可以很好地将servlet用作单个入口点,就像在许多Web框架中一样。单个servlet正在接收所有HTTP请求,并根据请求选择正确的操作。这是基本的前端控制器模式,它创造了很多好处,比如可以很容易地创建集中式功能,比如身份验证等。 这里有一些关于它的更多信息: http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html

在许多servlet中具有功能只会使不必要的事情复杂化。但是请记住,如果不能很好地划分和管理代码,那么只使用一个servlet也会造成很大的混乱。

答案 3 :(得分:1)

每个servlet应该有一到四个动作,名为doDelete,doGet,doPost和doPut。这些名称对应于HTTP方法名称DELETE,GET,POST和PUT。他们一起构建了一个REST ful API。如果使用此统一接口编写服务器资源,您将使用HTTP的全部功能。

要使RESTful API将资源视为具有一组标准操作的名词。你最终会得到更多的Servlet(控制器),而不是像struts这样的框架,但是每个servlet只有大量的动作。

许多框架将前端控制器模式与单个servlet一起使用,该servlet将请求分派给控制器或操作。但是框架控制器或操作往往会复制servlet API的功能。 servlet容器已经是一种前端控制器,它将请求分派给处理程序(servlet)。

答案 4 :(得分:0)

如果您的Web应用程序足够复杂,操作数量可能超过您可以轻松处理的servlet数量,那么您可能会考虑使用Web框架来抽象 那个问题。

你的servlet层应该只做几件事:

  1. 来自请求的Yank输入
  2. 管理会话状态
  3. 向/从业务对象层发送对象
  4. 将数据推送到响应中
  5. 转发到视图
  6. 处理错误/输入/输出错误
  7. 几乎任何陷入servlet的东西都是个坏主意。

    如果遵循一些简单的指导原则,一个简单的servlet可以调用输入处理器将数据从请求和可能在会话中的数据转换为适当的对象。然后,该对象可以传递给BizObject层。该层将返回可能存储在会话中的信息以及将传递给视图的某个对象。

    我曾经为servlet服务方法强制执行40行规则。如果你超过40行,我期待一个很好的解释。

    我开发了一个80k的java web应用程序,它有两个servlet,都没有超过40行。它处理了大约60种形式/状态。

    如果servlet中有更多代码,我认为在任何时候都不会更容易管理/维护/修改应用程序。