61.属于Java EE实现的分布式servlet容器必须支持其他Java EE对象从一个JVM迁移到另一个JVM所必需的机制。
Java EE定义了一个命名的环境,允许应用程序在没有明确的知道外部信息是如何命名和组织的情况下轻松地访问资源和外部信息。
Servlet容器是一个Java EE产品的一部分,不应该允许应用程序重写Java SE或Java EE平台的类,比如那些在Java.*和javax.*命名空间中的类,Java SE或Java EE不允许被修改。
Java EE定义了一个命名的环境,允许应用程序在没有明确的知道外部信息时如何命名和组织的情况下轻松地访问资源和外部信息。
由于servlet是Java EE技术的一个完整的组件类型,已经在Web应用程序部署文件中规定了允许servlet获取引用资源和企业bean的指定信息。
Java EE平台规范定义了一个标准化的全局JNDI命名空间和一系列相关的命名空间映射到不同的Java EE应用程序范围。应用程序可以使用这些命名空间可移植地检索组件和资源的引用。
为一个Web应用程序上下文根目录预定义的java.net.URL资源的名称的语法如下:
全局命名空间中java:global[/<app-name>/]<module-name>!ROOT,应用程序指定的命名空间中java:app/<module-name>!ROOT。
只有当Web应用打包成一个.ear文件时才适合使用<app-name>。
java:app前缀允许一个组件内执行的Java EE应用程序来访问特定于应用程序的命名空间。java:app名称允许一个企业应用程序中的模块引用同一个企业应用程序中其他模块的上下文根目录。<module-name>是java:app url语法的必要组成部分。
62.必须始终提供一个安全标识或主体(principal),用于调用一个企业bean。从Web应用程序中调用企业Bean的默认模式是为把Web用户的安全标识传播到EJB容器。
在其他情况下,Web容器必须允许不了解Web容器或EJB容器的web用户进行调用:
(1)Web容器必须支持未把自己授权给容器的用户访问Web资源。这是在互联网上访问Web资源场景的模式。
(2)应用程序代码可以是单点登录和基于调用者标识的定制化数据的唯一处理器。
在这些情况下,Web应用程序部署描述文件可以指定一个run-as元素。当为Servlet指定了一个run-as角色时,Servlet容器必须传播主要的映射到该角色,作为任何从Servlet到EJB调用的安全标识,包括从Servlet的init和destory方法进行原始调用。安全角色名必须是为Web应用程序定义的安全角色名称之一。
由于Web容器作为Java EE平台的一部分运行,在同一个Java EE应用程序中调用EJB组件,以及调用部署在其他JavaEE中的应用程序都必须支持run-as元素的使用。
Web容器可以选择支持运行实现JAX-PRC和/或JAX-WS规范定义的Web服务端点(endpoint)编写的组件。需要Web容器嵌入一个Java EE符合的实现来支持JAX-RPC和JAX-WS Web Service组件。
JSR-109定义了用于打包Web service接口与它关联的WSDL描述和关联的类的模型。它定义了一种机制用于启用了JAX-WS和JAX-RPC的容器链接到一个实现了这个Web service的组件。一个JAX-WS或JAX-RPC Web service实现组件使用JAX-WS和/或JAX-RPC规范定义的API,其定义了它与启用了JAX-WS和/或JAX-RPC的Web容器之间的契约。它被打包到WAR文件。Web service开发人员使用平常的<servlet>来声明这个组件。
由开发人员定义等于这个组件的任何Servlet初始化参数可能被容器忽略。此外,启用了JAX-WS和JAX-RPC的Web组件继承了用于定义如下信息的传统Web组件机制。
(1)使用Servlet映射技术映射组件到Web容器的URL命名空间
(2)使用安全约束在Web组件上授权约束
(3)能够使用servlet过滤器提供底层(low-level)字节流支持,用于使用过滤器映射技术操纵JAX-WS和/或JAX-RPC消息
(4)任何与组件关联的HTTP会话的超时特性
(5)链接到存储在JNDI命名空间的Java EE对象
63.在JavaEE中,注解用于声明对外部资源的依赖和在Java代码中的配置数据而无需再配置文件中定义该数据。
在一个web应用中,使用资源注入的类只有当它们位于WEB-INF/classes目录,或如果它们被打包到位于WEB-INF目录的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文件的元数据,就像前面指定的那样。
64.@DeclareRoles用于定义由应用安全模型组成的安全角色。该注解指定在类上,且它用于定义能从注解的类的方法内测试(即,通过调用isUserInRole)的角色。由于用在@RoleAllowed而隐式声明的角色,不必使用@DeclareRole注解尽可以定义在实现了javax.servlet.Servlet接口或他的一个子类的类中。
企业级JavaBean组件可以从一个web组件使用@EJB注解引用。@EJB注解提供了与部署描述符中声明ejb-ref或ejb-local-ref元素等价的功能。
@EJBs注解允许在单个资源上声明多于一个@EJB注解。
@Resource注解用于声明到资源的引用,如一个数据源、Java消息服务目的地、或环境项。该注解等价于在部署描述符中声明resource-ref、message-destination-ref、或env-ref或resource-env-ref元素。
@Resource注解指定在一个类、方法或字段上。容器负责注入到由@Resource注解声明的资源的引用和映射到适当的JNDI资源。
@PersistenceContext注解指定容器管理的用于引用持久化单元(persistence unit)的实体管理器(entity manager)。
@PersistenceContexts注解允许在一个资源上声明多于一个@PersistentContext。
@PersistenceUnit注解提供声明在servlet中的企业级JavaBean组件实体管理器工厂(entity manmager factory)的引用。实体管理器工厂绑定到一个单独的persistence.xml配置文件。
@PersistenceUnits该注解允许在一个资源上声明多于一个@PersistentUnit.
@PostConstruct注解声明在一个无参的方法上,且必须不抛出任何受查异常。返回值必须是void。该方法必须在资源注入完成之后被调用且在组件的任何声明周期方法之前被调用。
@PreDestroy注解声明在容器管理组件的一个方法上。该方法在容器移除该组件之前调用。
由于Java元数据规范不允许在相同的注解目标以相同名字使用多个注解,因此@Resources注解充当容器的多个@Resource注解。
@RunAs注解等价于部署描述符中的run-as注解。@RunAs注解可能仅定义在javax.servlet.Servlet接口或它的子类的类实现上。
@WebServiceRef注解在一个web组件中使用可能在部署描述符中的resource-ref相同的方式提供一个到web service的引用。
@WebServiceRefs注解允许在单个资源上声明多于一个的@WebServiceRef注解。