我只是想开始使用Java EE和相关概念。但是,我在理解某些技术与它们扮演的角色之间的关系方面遇到了一些麻烦。
据我所知,Java EE Servlet是一个在服务器内运行的Java类,它生成对请求的响应(通常是对HTTP请求的HTML响应,尽管Servlet理论上可以为任何协议提供服务)。
我的问题:
感谢您帮助我开始使用!
答案 0 :(得分:12)
当不使用像JSF,Spring MVC,Struts等MVC框架时,你仍然需要一个servlet来完成基本的请求/响应控制工作。 JSP--虽然在封面下确实被编译为servlet-应该仅用作视图,而不是用作控制器。
我认为你的混淆是由于相对大量的关于servlet的低质量教程引起的,它们被用于通过out.print()
语句打印纯HTML。这是鉴于MVC完全错误。我建议从我们的维基页面开始:https://stackoverflow.com/tags/servlets/info
答案 1 :(得分:5)
JSP和JSF是表示层技术。虽然JSP被编译成servlet,并且你甚至可以在JSP中编写普通的Java代码,但这样做的编码风格非常糟糕。通常,您的JSP文件不应包含任何Java代码,也不应执行查询服务器数据库或直接检查请求参数等操作。所有这些都应该在一个单独的Servlet中完成(或者如果使用Web框架,那么你的框架是对Servlet的抽象),然后再进入JSP。
在典型情况下,为每个要服务的请求编写Servlet代码是不切实际的。大多数Java Web框架完全抽象出Servlet接口,因此您无需直接实现Servlet即可构建完整的Web应用程序。但是,偶尔会遇到一种独特的情况,即绕过Web框架并提供提供某些特殊功能的Servlet是最有效的。
他们真的非常接近。所有这些都是servlet容器。其中一些还可能包括servlet支持之外的其他Java EE功能。作为servlet容器并不保证支持其他Java EE功能,但作为Java EE容器确实支持servlet。
答案 2 :(得分:3)
当容器加载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 Server”之前,现在它可以是“Java EE Server” - 网络资料“。
是的,我不知道这意味着什么。
关键的区别在于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之类的东西。
答案 3 :(得分:2)
许多框架使用servlet,但是将它们从最终用户中抽象出来。这个想法是servlet本身非常低级,框架提供了有用的抽象,允许开发人员专注于应用程序设计和业务逻辑。我倾向于同意这一点,但有些核心开发人员喜欢在servlet级别工作。
知识就是力量,回答你的第二个问题。因此,了解servlet的作用是个好主意;它只能帮助。如果您需要扩充底层框架,您可能会发现自己在Servlet级别工作 - 您也可以这样做来调试问题。
Servlet确实在servlet容器中运行。 servlet容器和Java EE容器之间存在技术差异。没有后者你可以拥有前者,但没有前者你就不能拥有后者(我认为)。 Servlet是Java EE堆栈的一部分。其他部分包括JMS(消息传递)和JMX(管理扩展)等。
答案 4 :(得分:1)
JSF,JSP,Struts等框架内部依赖于servlet规范。这些框架仅构建在servlet之上。