Java 为什么Servlet规范中公开了神奇的属性?

Java 为什么Servlet规范中公开了神奇的属性?,java,attributes,servlets,Java,Attributes,Servlets,Java Servlet规范(2.5版)包含一组神奇的属性,其中包含有关所包含资源的信息,这似乎总是与Java的原则有点不一致,即: javax.servlet.include.request_uri javax.servlet.include.context_path javax.servlet.include.servlet_path javax.servlet.include.path_info javax.servlet.include.query_string 在规范中甚至没有明确指

Java Servlet规范(2.5版)包含一组神奇的属性,其中包含有关所包含资源的信息,这似乎总是与Java的原则有点不一致,即:

javax.servlet.include.request_uri
javax.servlet.include.context_path
javax.servlet.include.servlet_path
javax.servlet.include.path_info
javax.servlet.include.query_string
在规范中甚至没有明确指出,只有在规范中,它是正确实现的必要条件


这种方法感觉非常错误,这是客户机将使用和依赖的公开的实现细节。为什么这些信息会以这种方式公开?

它们实际上是在API文档的部分中指定的。正如您在API文档中看到的,您应该使用的常量,例如:

String includeRequestURI = request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI);

您不应该在代码中使用原始常量(幻数)这一事实并不意味着当接口确实需要传入一个必须指定的常量时

从用户的角度来看,只有常量是有效的,但从实现的角度来看,如果不同的系统要交互,这些常量必须与实际值匹配。如果常量在不同的实现中定义不一致,那么在一个实现中编译的类(常量值可能内联在二进制中)将无法在不同的实现中工作


请注意,代码不依赖于幻数仍然很重要,因为规范可以在以后的任何审查中定义不同的值,如果他们决定的话。

我从未意识到它们是在API文档的深处指定的!使用常量更有意义,谢谢!