jetspeed使用spring来作为它的缺省组件框架,但是,jetspeed的体系架构使得它可以很容易替换其组件管理框架,其控制是在
JetspeedServlet中,其类图如下:
在JetspeedServlet初始化启动时,在其init()方法中,有如下调用引擎的代码:
engine = new JetspeedEngine(properties, applicationRoot, config, initializeComponentManager(config, applicationRoot, properties)); Jetspeed.setEngine(engine); engine.start(); |
其中的
initializeComponentManager
方法加载组件管理(
assembly
)框架,要改用其他额
IoC
框架的话,需要修改此函数。
以下就是
initializeComponentManager
方法的代码:
ServletConfigFactoryBean.setServletConfig(servletConfig); // String relativeApplicationRoot = getRealPath("/"); String relativeApplicationRoot = appRoot; String absApplicationRoot = new File(relativeApplicationRoot).getCanonicalPath(); final String assemblyDir = configuration.getString("assembly.dir","/WEB-INF/assembly"); final String assemblyFileExtension = configuration.getString("assembly.extension",".xml"); String[] bootConfigs = new String[] {"/WEB-INF/assembly/boot/*.xml"}; String[] appConfigs = new String[] {assemblyDir+"/*"+assemblyFileExtension}; ServletContext servletContext = servletConfig.getServletContext(); SpringComponentManager cm = new SpringComponentManager(bootConfigs, appConfigs, servletContext, appRoot); return cm; |
从以上代码可以看出:
1、 Spring框架的所有应用配置文件都放在了
/WEB-INF/assembly目录下。
2、 初始配置文件放在了
/WEB-INF/assembly/boot/目录下,这个目录下目前只有一个文件 ――
datasource.xml,记录了ojb数据库的连接基本配置,如果要修改数据库的连接配置,可以修改它,这种情况一般发生在应用服务器要从Tomcat迁移到别的J2EE服务器时。
3、 在JetspeedServlet启动的时候,收集assembly目录下的所有Spring配置文件,传递给Spring作初始加载。
Jetspeed目前数据库的连接配置信息写在了catalina/jetspeed.xml配置文件中了,以Resource标签的模式来作为一个资源而定义。这中模式不是很通用,在weblogic中我就不知道改如何修改了。但是,可以通过另外一种方法来修改数据库的配置模式:
在
/WEB-INF/assembly/boot/目录下的datasource
.xml文件中,我们将前面居于Context上下文的加载模式注释掉,如下 所示:
<bean id="JetspeedDS" class="org.apache.jetspeed.components.rdbms.ojb.ConnectionRepositoryEntry">
<property name="jndiName">
<value>java:comp/env/jdbc/jetspeed</value>
</property>
</bean>
|
将其下面的居于“common DBCP Pooled datasource”模式的连接模式放开,如下所示:
<bean id="JetspeedDS" class="org.apache.jetspeed.components.rdbms.ojb.ConnectionRepositoryEntry">
<property name="driverClassName">
<value>{my.drivers.class.name}</value>
</property>
<property name="url">
<value>{URL to my DB}</value>
</property>
<property name="username">
<value>{username}</value>
</property>
<property name="password">
<value>{password}</value>
</property>
</bean>
|
同时修改classes目录下的OJB.properties文件(编译前在/etc/db-ojb/OJB.properties),修改里面的
ConnectionFactoryClass
或ConnectionManagerClass属性如下:
ConnectionFactoryClass=org.apache.ojb.broker.accesslayer.ConnectionFactoryDBCPImpl
或:
ConnectionManagerClass=org.apache.jetspeed.components.rdbms.ojb.ConnectionManagerImpl
|--------------------------
à
推荐这个
|
两个只要修改一个就可以了。
修改后,连接池不再用J2EE应用服务器提供了,而是由
DBCP来负责提供。
1、 form指向“/jetspeed/login/proxy”,在web.xml定义中,其被定向到“jetspeed-portal-version.jar”中的org.apache.jetspeed.login. LoginProxyServlet.java中
2、 LoginProxyServlet.java中,用户名和密码被封装在session中后,重定向到“/login/redirector”,指向“org.apache.jetspeed.login.LoginRedirectorServlet.java”中。
3、 在导向(触发)到/login/redirector时,由于在/conf/Catalina/jetspeed.xml中配置了居于JAASRealm的验证,并且连接在web.xml中的《security-constraint》中配置了对资源“/login/redirector”需要访问验证,所以JAAS验证被触发。
Portlet API定义了一个 PortletURL 的接口。Portlets 必须用这个 PortletURL 物件来产生 portlet URLs。 在产生 PortletURL 的同时, PortletURL 也会呼叫 RenderResponse 接口定义的两个方法:
createActionURL 和 createRenderURL。
createActionURL 用来生成 action URLs。
createRenderURL 用来生成 render URLs。
一个render URL 是对某些特殊类型action URLS 的一种优化。 在 render portlet URL 的过程中 Portal/portlet-container 不允许调用目标 portlet 的 processAction方法。 Portal/portlet-container必须确保当在建构 render URL 时所设定的参数, 也能变成是在请求这个 portlet 时的参数。
Portlets可以通过 PortletURL 所提供的 setParameter 和 setParameters 两个方法, 对 PortletURL 物件设定一些应用程序的特殊参数。 setParameter 这个方法必须把以前所设定的同名参数给取代掉。所有 portlet 所加到 PortletURL 物件上的参数都必须为该 portlet 的可用请求参数。 Portlet 开发者必须注意到 render request 的请求参数并非在产生 PortletURL 时就被使用到。
|
Portlet-container不能把在 action request 得到的参数传递到后续的 render request。 假如 portlet 要这样做, 可以通过 render URL 或是在 processAction 的时候,利用 ActionResponse 物件的 setRenderParameter or serRenderParameters 方法来做。
|
一个 portlet 可以利用 PortletRequest 接口提供的 isWindowStateAllowed 方法来得知本身是否可以使用该 window state。
| |
23、Jetspeed2 在WebLogic上的部署
假设BEA的根目录是${BEA},自己的建的domain叫mydomain,并且,已经把应用的端口由7001改为80了
1. 在${BEA}下新建shared/lib文件夹,把tomcat目录下的shared/lib下的五个jar包拷到新建的文件夹中:
jetspeed-api-2.0-M1.jar
jetspeed-commons-2.0-M1.jar
pluto-1.0.1-rc1.jar
portals-bridges-common-0.1.jar
portlet-api-1.0.jar
2. 把jetspeed文件夹拷到${BEA}/user_projects/domains/mydomain/applications下面。
3. 修改${BEA}/user_projects/domains/mydomain/目录下的startWeblogic.cmd 文件,添加如下的一些设置(
红色的为添加的):
set SHLIB=C:/bea/shared/lib
set SHARED_PATH=%SHLIB%/jetspeed-api-2.0.jar;%SHLIB%/jetspeed-commons-2.0.jar;%SHLIB%/pluto-1.0.1.jar;%SHLIB%/portals-bridges-common-1.0.jar;%SHLIB%/portlet-api-1.0.jar;
set CLASSPATH=%SHARED_PATH%;%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%/jre/lib/rt.jar;%WL_HOME%/server/lib/webservices.jar;%CLASSPATH%
并确保有如下红色这句话:(很重要哦!!)
%JAVA_HOME%/bin/java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS%
-Djava.naming.provider.url=t3://localhost:80 -Dweblogic.Name=%SERVER_NAME% -Dweblogic.ProductionModeEnabled=%PRODUCTION_MODE% -Djava.security.policy="%WL_HOME%/server/lib/weblogic.policy" weblogic.Server
4. 修改jetspeed/WEB-INF/assembly/目录下的deployment.xml(或jetspeed-spring.xml)文件,找到 <bean id="org.apache.jetspeed.tools.pamanager.servletcontainer.ApplicationServerManager"
class="org.apache.jetspeed.tools.pamanager.servletcontainer.TomcatManager"
init-method="start" destroy-method="stop"
> 这样的设置,把TomcatManager改成
WeblogicManager,并把下面的<constructor-arg></constructor-arg>设置删掉。
5
.Setup a JDBC Connection and Pool
。
Startup weblogic running the startWeblogic.cmd
Goto: http://localhost:7001/console/ and login, goto Services->JDBC->Connection Pools. Create a new pool. Create a JDBC data source named
JetspeedDB based on the Connection Pool.
6
.修改weblogic.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<context-root>/jetspeed</context-root>
<reference-descriptor>
<resource-description>
<res-ref-name>jdbc/jetspeed</res-ref-name>
<jndi-name>JetspeedDB</jndi-name>
</resource-description>
</reference-descriptor>
<!--
<container-descriptor>
<servlet-reload-check-secs>-1</servlet-reload-check-secs>
</container-descriptor>
-->
</weblogic-web-app>
|
24、Portlet中获得portlet.xml中预先绑定的参数
在portlet.xml中预先定义了如下的参数值:
<portlet-preferences>
<preference>
<name>TopRange</name>
<value>100</value>
</preference>
</portlet-preferences>
|
在portlet-class中可以通过如下代码来取得:
private long getHighRange(PortletRequest request) {
PortletPreferences prefs = request.getPreferences();
String highRangePref = prefs.getValue("TopRange", "102");
//
如果找不到“
TopRange
”,返回默认值
102
long range = Long.parseLong(highRangePref);
if (range < 2) {
range = 102;
}
return range;
}
|
要修改portlet的decorator中的标题(主要用在本地化的过程中),必须在相应的resource资源文件中,定义如下两个变量的值:
javax.portlet.title=/u89d2/u8272/u5b89/u5168/u6027/u6d4b/u8bd5
javax.portlet.short-title=/u89d2/u8272/u5b89/u5168/u6027/u6d4b/u8bd5
|
private Subject getSubject()
{
AccessControlContext context = AccessController.getContext();
return Subject.getSubject(context);
}
|
其sso,感觉也是构建Form,提交相关证书到相应的异构系统的LogonForm中。
Jetspeed2中,专门写了一个
SSOIFramePortlet的portlet来专门处理单点登陆,其是由“
IFrameGenericPortlet”扩展而来,里面多了一些根据SSO配置信息来构建提交username和password的form的代码,其大概意思可以用如下代码来表达:
String site = request.getPreferences().getValue("SRC", null);
context = getPortletContext();
sso = (SSOProvider)context.getAttribute("cps:SSO");
Subject subject = getSubject(); // getSubject()在26中有说明。
SSOContext context = sso.getCredentials(subject, site);
request.setAttribute(SSO_REQUEST_ATTRIBUTE_USERNAME, context.getRemotePrincipalName());
request.setAttribute(SSO_REQUEST_ATTRIBUTE_PASSWORD, context.getRemoteCredential());
………
super.doView(request, response);
|
具体可以好好研究一下类:org.apache.jetspeed.portlet. SSOIFramePortlet.java这个类,其在
jetspeed-web-content-version.jar包中定义。
SSO的具体应用,其实只要在系统管理中配置了相应的站点后,只要定义一个居于
SSOIFramePortlet的portlet页面就可以了。