19、Jetspeed应用框架详解:
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作初始加载。
20、数据库连接模式修改:
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来负责提供。
21、用户登陆验证:
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验证被触发。
22、规范摘录:
|
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
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 namedJetspeedDB 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;
}
|
25、设置本地语言的portlet标题
要修改portlet的decorator中的标题(主要用在本地化的过程中),必须在相应的resource资源文件中,定义如下两个变量的值:
javax.portlet.title=/u89d2/u8272/u5b89/u5168/u6027/u6d4b/u8bd5
javax.portlet.short-title=/u89d2/u8272/u5b89/u5168/u6027/u6d4b/u8bd5
|
26、获得用户的Subject
private Subject getSubject()
{
AccessControlContext context = AccessController.getContext();
return Subject.getSubject(context);
}
|
27、SSO研究
其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页面就可以了。