Java EE Servlet是否实际直接使用?

sle*_*ske 10 java servlets java-ee

我只是想开始使用Java EE和相关概念.但是,我在理解某些技术与它们扮演的角色之间的关系时遇到了一些麻烦.

据我所知,Java EE Servlet是一个在服务器内运行的Java类,它生成对请求的响应(通常是对HTTP请求的HTML响应,尽管Servlet理论上可以服务于任何协议).

我的问题:

  • 据我所知,我可以直接编写Servlet类,也可以使用JSP或JSF等技术,然后为我生成/提供Servlet.无论如何,我最终运行我的应用程序的Java EE Web容器(例如Apache Tomcat)将只看到Servlet,并且不关心它们是如何创建的(因此Servlet是一种低级管道).真的吗?
  • 如果Servlet是低级的,有没有理由直接使用Servlet?我已经看过许多解释如何编写Servlet的教程,但这看起来相当不实用.有没有直接编写Servlet更好/更喜欢使用JSP或类似的情况?
  • 最后,Servlets需要运行服务器(例如Apache Tomcat).在阅读该上下文中的服务器时,我已经看到了各种名称,例如(Java EE)Web容器,servlet容器,JSP容器Java EE服务器.这些术语是否都意味着相同,还是有区别?

谢谢你帮助我开始吧!

Bal*_*usC 12

当不使用像MVF,Spring MVC,Struts等MVC框架时,你仍然需要一个servlet来完成基本的请求/响应控制工作.JSP--虽然在封面下确实被编译为servlet-应该仅用作视图,而不是用作控制器.

我认为你的困惑是由相对大量的关于servlet的低质量教程引起的,这些教程用于通过out.print()语句打印纯HTML .这是鉴于MVC完全错误.我建议从我们的维基页面开始:https://stackoverflow.com/tags/servlets/info


Wil*_*ung 5

当容器加载servlet时,不,它不会太关心它来自哪里。也就是说,当涉及到动态加载之类的事情时,不同的容器会以不同的方式处理这个问题,但我不会太担心。

Servlet 是低级别的。它们是所有其他 Java EE Web 框架所基于的基本抽象。在“现实世界”中,大多数时候,人们会使用一些更高级别的框架而不是原始的 Servlet。

也就是说,当您确实想要访问 HTTP 请求的“裸机”(以及 Servlet 所获得的裸机)接口时,Servlet 仍然很有用。对于简单的事情,编写一个 Servlet 比建立一堆框架 jar 等更容易。

就容器而言,区别基本上是 Java EE 服务器与 Servlet 容器或服务器。Tomcat 不是 Java EE 服务器,它仅处理 Java EE 堆栈的 Web 部分。令人困惑的是,Java EE 6 现在有一个“web-profile”,它基本上是 Servlet 堆栈,但是之前 Servlet 容器不能被视为“Java EE 服务器”,现在它可以是“Java EE 服务器” - 网络简介”。

是啊,我也不知道什么意思。

主要区别在于 Servlet 容器(Tomcat、Jetty、Resin)不与 Java EE 堆栈的其余部分(尤其是 EJB)捆绑在一起,而是具有作为整个 Java EE 堆栈一部分的其他几个组件。

如果您刚刚接触 Java EE,我会选择一个完整的船容器(如 Glassfish),因为 a)您可以,b)它很容易(GF 设置起来很简单),c)您不必再做猜测您的容器中包含或不包含什么以及您正在阅读的所需内容。GF 将拥有 Java EE 的“一切”。例如,它不会有 Spring,因为那不是 Java EE,但如果它出现在您的 Java EE 书籍或网站文章中,GF 就会有它。

稍后您可以选择何时需要完整的套件或只想使用 Tomcat 之类的东西。


aro*_*oth 5

  1. JSP和JSF是表示层技术.虽然JSP确实被编译成servlet,并且你甚至可以在JSP中编写普通的Java代码,但这样做的编码风格非常糟糕.通常,您的JSP文件不应包含任何Java代码,也不应执行查询服务器数据库或直接检查请求参数等操作.所有这些都应该在一个单独的Servlet中完成(或者如果使用Web框架,那么您的框架是Servlet的抽象),然后再访问JSP.

  2. 在典型的情况下,为每个要服务的请求编写Servlet是不切实际的.大多数Java Web框架完全抽象出Servlet接口,因此您无需直接实现Servlet即可构建完整的Web应用程序.但是,偶尔会遇到一种独特的情况,即绕过Web框架并提供一个提供某些特殊功能的Servlet是最有效的.

  3. 真的,它们非常接近.所有这些都是servlet容器.其中一些还可能包括servlet支持之外的其他Java EE功能.作为servlet容器并不保证支持其他Java EE功能,但作为Java EE容器确实支持servlet.