下面我们来看看这个文件的格式:
<portlet-app id="j2-admin" version="1.0"
xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
xmlns:js="http://portals.apache.org/jetspeed"
xmlns:dc="http://www.purl.org/dc">
<js:services>
<js:service name="ApplicationServerManager" />
<js:service name="DeploymentManager" />
<js:service name="EntityAccessor" />
<js:service name="GroupManager" />
<js:service name="PageManager" />
<js:service name="PermissionManager" />
<js:service name="PortalAdministration" />
<js:service name="PortletFactory" />
<js:service name="PortalAdministration" />
<js:service name="PortletRegistryComponent" />
<js:service name="PortalStatistics" />
<js:service name="Profiler" />
<js:service name="RoleManager" />
<js:service name="SearchComponent" />
<js:service name="SSO" />
<js:service name="UserManager" />
<js:service name="HeaderResource" />
</js:services>
</portlet-app>
|
跟据XML Element的名字,可以理解就是提供给j2-admin这个Portlet应用程序使用的一些Services。那么这些Services是怎么定义的呢?以UserManager这个服务为例,首先回到前面提到过的assemble目录下,找到jetspeed-services.xml和 security-managers.xml,下面分别是它们的内容节选:
jetspeed-services.xml
<beans default-lazy-init="false" default-dependency-check="none" default-autowire="no">
<!--
Portlet Services
-->
<bean id="PortalServices"
class="org.apache.jetspeed.services.JetspeedPortletServices"
abstract="false" singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<constructor-arg>
<map>
<entry key="SearchComponent">
<ref bean="org.apache.jetspeed.search.SearchEngine" />
</entry>
<entry key="UserManager">
<ref bean="org.apache.jetspeed.security.UserManager" />
</entry>
<entry key="PageManager">
<ref bean="org.apache.jetspeed.page.PageManager" />
</entry>
</map>
</constructor-arg>
</bean>
</beans>
|
security-managers.xml
<beans default-lazy-init="false" default-dependency-check="none" default-autowire="no">
<bean id="org.apache.jetspeed.security.UserManager"
class="org.apache.jetspeed.security.impl.UserManagerImpl" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<constructor-arg>
<ref bean="org.apache.jetspeed.security.SecurityProvider" />
</constructor-arg>
</bean>
</beans>
|
由上面的两个文件,我们可以清楚地看出UserManager是定义security-managers.xml文件中的,但是为了能够在portlet服务中引用它,还必须在jetspeed- services.xml中再次引用它的bean name,org.apache.jetspeed.services.JetspeedPortletServices封装了一个Map数据结构, Map中存放的就是服务名称和该服务POJO对象引用,这一切便利都是由Spring带来的。
下面是在Portlet的代码中使用该服务的例子:
protected UserManager userManager = null;
public void init(PortletConfig config) throws PortletException {
super.init(config);
userManager = (UserManager)
getPortletContext().getAttribute(CommonPortletServices.
CPS_USER_MANAGER_COMPONENT);
if (null == userManager) {
throw new PortletException("Failed to find the User Manager
on portlet initialization");
}
}
|
Jetspeed鼓励Portlet开发者在开发过程中,将公共的Service用Spring Bean的方式封装起来,然后添加到Jetspeed-services中,这样就可以在Portlet代码中轻松复用这些公共Service了,并且还可以利用Spring来管理这些Service的生命周期。事实上,Jetspeed自带管理界面Portlet应用程序就大量采用了这种技术。
还有一个需要注意的问题是,用户自定义的Service必须放到Tomcat的shared\lib下面去,以保证JAVA Classloader能够找到它。
Jetspeed核心组件简介
介绍了那么多Jetspeed架构方面的信息,下面我们一起来快速浏览一下Jetspeed Portal的核心组件。
Jetspeed-Api
路径:components/jetspeed-api
定义几乎所有的jetspeed-api interfaces,一般的开发者都使用这个组件中定义的接口进行二次开发。
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一页 1 2 3 4 5 6 78 下一页
上一篇:LVM 五分钟教程 下一篇:深入Linux PAM 体系结构
|