Jetspeed2学习笔记(五)

19Jetspeed应用框架详解:
   jetspeed使用spring来作为它的缺省组件框架,但是,jetspeed的体系架构使得它可以很容易替换其组件管理框架,其控制是在 JetspeedServlet中,其类图如下:
Jetspeed2学习笔记(五)_第1张图片
在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、规范摘录:
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。
 
23Jetspeed2 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>
 
24Portlet中获得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);        
    }
 
27SSO研究
其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页面就可以了。
 

你可能感兴趣的:(Jetspeed2学习笔记(五))