servlet3.1规范翻译:第15章 与其它规范有关的要求
第15章 与其它规范有关的要求
本章列出对web容器的要求,它已经包含在容器产品中了,还包括其他Java技术。
下面章节中任何涉及到JavaEE应用的profile,不只是完整的Java EE profile,还包括任何支持Servelt的profile,像Java EEWeb Profile。有关配置文件的更多信息,请参阅Java EE平台规范。
15.1 会话属于Java EE实现的分布式servlet容器必须支持其他JavaEE对象从一个JVM迁移到另一个JVM所必需的机制。
15.2 Web应用程序15.2.1 Web应用程序类加载器Servlet容器是一个Java EE产品的一部分,不应该允许应用程序重写Java SE或Java EE平台的类,比如那些在java.*和javax.*命名空间中的类,JavaSE或Java EE不允许被修改。
15.2.2 Web应用程序环境Java EE定义了一个命名的环境,允许应用程序在没有明确的知道外部信息是如何命名和组织的情况下轻松地访问资源和外部信息。
由于servlet是Java EE技术的一个完整的组件类型,已经在Web应用程序部署描述符中规定了允许servlet获取引用资源和企业bean的指定信息。包含此信息的部署元素有:
■ env-entry
■ ejb-ref
■ ejb-local-ref
■ resource-ref
■ resource-env-ref
■ service-ref
■ message-destination-ref
■ persistence-context-ref
■ persistence-unit-ref
开发人员使用这些元素来描述在Web容器中运行时Web应用程序需要在JNDI命名空间中注册的某些对象。
Java EE规范第5章中描述了关于Java EE环境设置的要求。
Servlet容器属于Java EE技术标准实现的一部分,它必须支持这种语法。查阅Java EE规范可获取更多详细信息。这种类型的servlet容器必须支持查找这种对象并在受servlet容器管理的线程上执行时调用这些对象。当在开发人员创建的线程上执行时,这种类型的servlet容器应该支持这种行为,但目前没有要求这样做。这样的规定将被添加到本规范的下一个版本中。开发人员应该小心,不推荐应用程序创建的线程依赖这种能力,因为它是不可移植的。
15.2.3 Web模块上下文根URL的JNDI名称Java EE平台规范定义了一个标准化的全局JNDI命名空间和一系列相关的命名空间映射到不同的Java EE应用程序的范围。应用程序可以使用这些命名空间可移植地检索组件和资源的引用。本节定义的Web应用程序的基本URL是需要注册的JNDI名称。
为一个Web应用程序上下文根目录预定义的java.net.URL资源的名称的语法如下:
全局命名空间中java:global[/<app-name>]/<module-name>!ROOT,应用程序指定的命名空间中java:app/<module-name>!ROOT。
确定应用程序名称和模块名称的规则请参阅Java EE规范8.1.1节(组件创建)和 8.1.2节(应用程序组装)。
只有当Web应用打包成一个.ear文件时才适合使用<app-name>。
java:app前缀允许一个组件内执行的Java EE应用程序来访问特定于应用程序的命名空间。java:app名称允许一个企业应用程序中的模块引用同一个企业应用程序中其他模块的上下文根目录。<module-name>是java:app url语法的必要组成部分。
示例
然后,可以在应用程序中按如下方式使用上述的URL:
如果Web应用程序使用模块名称myWebApp独立部署。URL可被注入到另一个web模块,如下:
代码示例 15-1
组件类型
实现以下接口的类
Servlet
javax.servlet.Servlet
Filter
javax.servlet.Filter
Listener
javax.servlet.ServletContextListener
javax.servlet.ServletContextAttributeListener
javax.servlet.ServletRequestListener
javax.servlet.ServletRequestAttributeListener
javax.servlet.http.HttpSessionListener
javax.servlet.http.HttpSessionAttributeListener
javax.servlet.AsyncListener
除了上表15-1列出的那些类外,Web容器不需要为存在注解的类执行资源注入。
引用必须在任何生命周期方法调用和组件实例对应用可用之前注入。
在一个web应用中,使用资源注入的类拥有它们自己的注解,只有当它们位于WEB-INF/classes目录,或如果它们被打包到位于WEB-INF/lib目录下的jar文件中,它们的注解才将被处理。容器可以选择性地为在其他地方的应用类路径中找到的类处理资源注入注解。
Web应用部署描述符的web-app元素上包含一个metadata-complete属性。metadata-complete属性定义了web.xml描述符是否是完整的,或是否应考虑部署过程中使用的其他资源的元数据。元数据可能来自web.xml文件、web-fragment.xml文件、WEB-INF/classes中的类文件上的注解、和WEB-INF/lib目录中的jar文件中的类文件上的注解。如果metadata-complete设置为“true”,部署工具仅检查web.xml文件且必须忽略如出现在应用的类文件上的@WebServlet、@WebFilter、和@WebListener注解,且必须也忽略WEB-INF/lib中的打包在jar文件的任何web-fragment.xml描述符。如果metadata-complete没有指定或设置为“false”,部署工具必须检查类文件和web-fragment.xml文件的元数据,就像前面指定的那样。
web-fragment.xml的web-fragment元素也包含了metadata-complete属性。该属性定义了对于给定fragment的web-fragment.xml描述符是否是完整的,或者是否应该扫描相关的jar文件中的类中的注解。如果metadata-complete设置为“true”,部署工具仅检查web-fragment.xml文件且必须忽略如出现在fragment的类文件上的@WebServlet、@WebFilter、和@WebListener注解。如果metadata-complete没有指定或设置为“false”,部署工具必须检查类文件的元数据。
以下是兼容Java EE技术的web容器需要的注解。
15.5.1 @DeclareRoles该注解用于定义由应用安全模型组成的安全角色。该注解指定在类上,且它用于定义能从注解的类的方法内测试(即,通过调用isUserInRole)的角色。由于用在@RolesAllowed而隐式声明的角色,不必使用@DeclareRoles注解明确声明。@DeclareRoles注解仅可以定义在实现了javax.servlet.Servlet接口或它的一个子类的类中。
以下是如何使用该注解的一个例子。
代码示例 15-3 @DeclareRoles注解示例
@WebServiceRef private MyService service;在这个例子中,一个到web service“MyService”的引用将被注入到声明该注解的类。
进一步了解这个注解和行为,请参考JAX-WS规范(JSR 224)第7章。
15.5.14 @WebServiceRefs 注解
这个注解允许在单个资源上声明多于一个的@WebServiceRef注解。进一步了解这个注解的行为请参考JAX-WS规范(JSR 224)第7章。
15.5.15 托管Bean和JSR299要求
在一个也支持托管Bean(Managed Bean)的产品中,实现必须支持使用托管Bean如Servlet、Filter和Listener。在一个也支持JSR 299的产品中,实现必须同样支持使用JSR 299风格的托管Bean。
在一个也支持JSR-299的产品中,在一个应用中实现必须支持使用299风格的托管bean如Servlet、Filter和Listener类。Servlet注解可直接应用到这些bean上。JSR-299指定了这些容器托管bean实例关于实例化、注入和其他服务的要求。JSR-299定义了@Dependent伪作用域,Servlet、Filter和Listener必须在这个伪作用域中。