为什么Servlet规范中暴露了魔术属性?

时间:2010-03-15 18:48:33

标签: java attributes servlets

Java Servlet规范(2.5版本here)包含一组包含有关所包含资源信息的魔术属性,似乎与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 documentation中甚至没有明确指出,只有在规范中才能正确实施。

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

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