在实做AJAX中我们提到服务定位表达式的概念,接下来我们详细对服务定位表达式做一个说明。
在Dorado7中服务定位表达式是用来描述服务的查找方式,即Dorado7通过服务定位表达式来查找到具体服务,以便于对服务进行调用。
它的基本格式:
协议:服务名[#方法名]
这里的服务名通常是代表一个JavaBean。
目前支持的协议(协议也可以扩展):
- spring: 表示其后的服务名是某个Spring上下文中的Bean的id。例如:spring:ajax#toUpperCase
- classpath: 表示其后的服务名一个类的完全限定名,当Dorado7需要调用此服务时会自动按照单例模式来实例化该类。(此种方式不推荐使用,因为Spring是Dorado7的标配,将服务注册在Spring上下文中可以获得很多额外的好处)。例如:classpath:com.bstek.dorado.sample.basic.Ajax#toUpperCase
以刚才实做的AJAX范例说明,首先我们了解一下什么是可暴露服务,在Dorado中所有的Ajax调用只能调用到那些明确声明为可暴露服务的Java方法,否则是无法调用成功的。可暴露服务包括两个部分:
- 服务名称
- 服务定位表达式
在Ajax.java中我们利用annotation机制实现了spring的bean声明:
@Component public class Ajax { }
另外我们在WEB-INF的doradohome的app-context.xml中添加了如下的代码:
<context:component-scan base-package="com.bstek.dorado.sample" />
这样系统默认就会自动扫描到Ajax类,并注册到Spring的BeanFactory中。
而对于toUpperCase方法,我们在此处采用了@Expose标记:
@Expose public String toUpperCase(String str) { return "input:\n" + str + "\n\n" + "output:\n" + str.toUpperCase(); }
@Expose标记是Dorado7专门提供的标注,用于定义可暴露服务,根据这个规则Dorado7会将这个方法自动注册在ExposedServiceManager中,其中服务名为:ajax.toUpperCase,服务表达式为:spring:ajax.toUpperCase。由于本例采用的是spring协议,因此服务定位表达式以"spring:"作为前缀,而服务名就是Ajax.java在BeanFactory中注册的bean的id,annotation机制会自动将Ajax的A自动转换为小写字母。
另外对于一些其他不采用annotation的系统我们也可以手动的注册可暴露服务,其方法是在Spring的配置文件中添加如下的代码:
<bean parent="dorado.exposedServiceRegister"> <property name="services"> <map> <entry key="ajax#toUpperCase" value="spring:ajax#toUpperCase" /> </map> </property> </bean>
如果有多个服务,就在map中添加就是了。