对于基于 Servlet 的 Java Web 应用程序,我真的需要 web.xml 吗?
Posted
技术标签:
【中文标题】对于基于 Servlet 的 Java Web 应用程序,我真的需要 web.xml 吗?【英文标题】:Do I really need web.xml for a Servlet based Java web application? 【发布时间】:2015-07-27 08:34:48 【问题描述】:我没有从事过真实世界的网络项目。在大学里,我们同时使用 Servlet 和 Spring 进行 Java Web 开发。在这两个项目中,我们都获得了已经配置好的 web.xml 文件,我们只对它们进行了微小的更改。现在我需要从头开始构建一个 Web 应用程序。我在 Eclipse 中创建了新的 Servlet 类,它没有自动创建任何 web.xml。然后我用谷歌搜索,我从几个资源中读到 web.xml 并不是真正需要的,但是这个推理被放在了几句话中,所以我不确定使用注释而不是 web.xml 是否会没有问题。 web.xml如果不用配置我会很高兴,因为我自己没有配置过,我想更专注于业务逻辑。
提前感谢您!
【问题讨论】:
如果你使用 Spring,你根本不可能编写任何 Servlet。 由于 servlet 3 规范 (IIRC) 不再需要 web.xml。 仍然取决于他最终将使用哪个应用程序服务器,以及他想在多大程度上使用spring OP,这将注定不仅要编写一个web.xml,还要编写另一个海量的xml文件。 web.xml 是最简单的之一。 @BigMike 你从 2.5 开始就没有使用过 Spring,是吗? @chrylis 是的,我仍然对我不得不使用的大量无用、复杂和不确定的 xml 废话感到有点创伤。如果他们简化了它,那很好。 【参考方案1】:如果您的容器支持最新的 j2ee 规范,则不需要 web.xml
文件。
Here 是一个使用注解的简单 servlet 示例的链接,here 您可以在 Spring MVC 中找到相同的示例;为了方便起见,我在这里发布示例
public class MyWebApplicationInitializer implements WebApplicationInitializer
@Override
public void onStartup(ServletContext container)
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
registration.setLoadOnStartup(1);
registration.addMapping("/example/*");
Here 是另一个链接,展示了如何使用其他可用的注释(@ServletFilter, @WebServletContextListener);您可以下载规格表here,以便更详细地了解可通过 j2ee 获得的注释。
【讨论】:
“最新”规范称为“Java EE”。 “J2EE”已被删除since 2006。【参考方案2】:从 Servlet 3 开始,不需要 web.xml。您将要使用 Tomcat 7 或 8 之类的东西(更好的选择)。对于原始 servlet this is a good starting point。
如果您想使用现代 Spring,Grails 3 是一个不错的选择。它避开了所有这些问题,Grails 是一个非常高效的 Web 开发框架。您可以将其视为构建在 Spring 和 Hibernate 之上的 Ruby on Rails。
此时,您不必编写任何 web.xml 来进行设置,除非您使用需要它的框架。我不知道 spring mvc,但 Grails 不需要你这样做,它使用了你已经习惯使用的大部分内容。
【讨论】:
您好,但是如果我们不使用 xml,那么可能会有一些内部实现如何将操作绑定到 servlet。那在哪里? @VikramSaini,动作与 servlet 的绑定现在在注释中完成,如下所示:docs.spring.io/spring-boot/docs/1.5.8.RELEASE/reference/…【参考方案3】:另一种方式(Spring 3.1+)-
一个名为AbstractDispatcherServletInitializer
的WebApplicationInitializer
的抽象基类实现使注册 DispatcherServlet 变得更加容易,只需重写方法来指定 servlet 映射和 DispatcherServlet 配置的位置 -
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer
@Override
protected WebApplicationContext createRootApplicationContext()
return null;
@Override
protected WebApplicationContext createServletApplicationContext()
XmlWebApplicationContext cxt = new XmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
return cxt;
@Override
protected String[] getServletMappings()
return new String[] "/" ;
【讨论】:
【参考方案4】:您是否需要 web.xml 取决于您在应用程序中声明的 servlet 规范。如果您将使用规范 3.0 构建应用程序,则可以使用注释来声明您的 servlet,并将其部署到容器中,而无需 web.xml 文件。这是作为JSR-315 的一部分完成的。
【讨论】:
【参考方案5】:在这里,我找到了一个不使用部署描述符文件(web.xml)的 Web 应用程序示例。这里要考虑的唯一一点是这将适用于最新的 tomcat 版本 >=7.0
访问http://java-demos.blogspot.com/2014/01/servlet-web-application-without-webxml.html
访问https://www.baeldung.com/java-web-app-without-web-xml
【讨论】:
【参考方案6】:使用 Spring Boot,它将为您管理容器和所有样板配置。您可以使用Initializr 生成准备启动的骨架。
【讨论】:
【参考方案7】:不,如果您使用的是 servlet 版本 >3.0
和 tomcat 7
,则对于 servlet based application
将不需要 web.xml
,因为它不会在以前版本的 tomcat 中运行。
注解代表元数据。如果使用注解,则不需要部署描述符(web.xml 文件)。查看Here 了解所有可用的注释。
【讨论】:
以上是关于对于基于 Servlet 的 Java Web 应用程序,我真的需要 web.xml 吗?的主要内容,如果未能解决你的问题,请参考以下文章
荧客技荐Flux 会取代 Web MVC,或可不再基于 Servlet 容器了?