- 浏览: 6771 次
- 来自: 北京
最新评论
原文地址:http://helloklzs.iteye.com/blog/1152421
1、 Jetspeed系统的配置文件在《JetSpeed2 home》\conf\Catalina\localhost下的jetspeed.xml文件中,此文件中定义了JAAS验证的配置及数据库连接模式(包括连接语句)
2、配置一个居于IFrame的应用:
1、 引入jar包:jetspeed-components-2.0.jar
jetspeed-rewriter-2.0.jar
jetspeed-web-content-2.0.jar
portals-bridges-velocity-1.0.jar
portals-gems-2.0.jar
(注:可以使用demo应用的lib)
2、 在portal.xml文件中配置一个portlet:
EchoIframe
lixin IFrame Portlet
Prototype of the IFRAME2 portlet
org.apache.jetspeed.portlet.IFrameGenericPortlet
-1
text/html
VIEW
SRC
http://www.sohu.com
HEIGHT
600
WIDTH
100%
MAX-HEIGHT
800
MAX-WIDTH
100%
SCROLLING
AUTO
en
zh
搜狐网
搜狐网
iframe,frame,frame2,iframe2
3、 配置对应的.psml文件,如下:
3、
jetspeed2的登陆权限验证完全居于JAAS,其配置文件是在jetspeed应用lib库中的jetspeed-security-.jar中的login.conf文件中定义的,如果想替换成自己的验证模式,可以修改此配置文件,如下:
Jetspeed {
org.apache.jetspeed.security.impl.DefaultLoginModule required;
};
请注意,自己加的login.conf配置文件可以放在WEB-INF/classes目录下的任何位置,并且修改WEB-INF/assembly目录下的security-providers.xml文件相应的login.conf文件的新位置。
4、
JAAS的subject主要用来表示一个应用主体对象(用户),此对象有一个或多个用来标识其身份的Principals,如名字(name principal)或者身份证号(SSN principal),principal是用来唯一标识此subject,以区别于其他的subject的。原文如下:
To authorize access to resources, applications first need to authenticate
the source of the request. The JAAS framework defines the term subject
to represent the source of a request. A subject may be any entity, such
as a person or a service. Once the subject is authenticated, a
javax.security.auth.Subject is populated with associated identities, or
Principals. A Subject may have many Principals. For example, a person may
have a name Principal ('John Doe') and a SSN Principal ('123-45-6789'),
which distinguish it from other subjects.
6、
一个Subject也许会与一个AccessControlContext联系在一起,可以通过如下方法返回一个与AccessControlContext联系在一起的subject:
public static Subject getSubject(final AccessControlContext acc);
7、
一个特定的Subject通过doAs方法来执行一个特定的操作(Action),原文如下:
The following static methods may be called to perform an action as a
particular Subject:
public static Object
doAs(final Subject subject,
final java.security.PrivilegedAction action);
public static Object
doAs(final Subject subject,
final java.security.PrivilegedExceptionAction action)
throws java.security.PrivilegedActionException;
};
8、
一个演示第一个doAs方法的例子:
假设有个用户叫Bob,他已经通过了LoginContext的(登陆)验证,随后,一个拥有com.ibm.security.Principal标识的subject产生了,这个Principal被命名为“Bob”。同时假设SecurityManager已经安装,并且访问策略文件(PolicyFile)存在,并定义如下:
// 授予 'BOB'访问(读)文件 'foo.txt'的许可
grant Principal com.ibm.security.Principal 'BOB' {
permission java.io.FilePermission 'foo.txt', 'read';
};
以下是本应用的代码:
class ExampleAction implements java.security.PrivilegedAction {
public Object run() {
java.io.File f = new java.io.File('foo.txt');
// 以下代码将会触发一个安全检测(通过Policy)
if (f.exists()) {
System.out.println('File foo.txt exists');
}
return null;
}
}
public class Example1 {
public static void main(String args) {
// 验证并鉴别用户 'BOB',这个过程在LoginContext那章中有描述
Subject bob;
// 在验证阶段,将bob与此Subject相关联
// 以'BOB'的身份执行'ExampleAction'
Subject.doAs(bob, new ExampleAction());
}
}
在执行过程中,ExampleAction在调用 f.exists() 时将遭遇一个安全检测。由于执行ExampleAction的是BOB,而在策略(Policy)文件中,已经赋予了Bob有此操作的相关权限,ExampleAction将通过安全检测。如果策略被改变的话,一个SecurityException的错误将被抛出。
9、
Principals用于描述Subject的身份,其必须继承java.security.Principal 和java.io.Serializable 接口
10、
LoginContext提供了4中构造器,如下:
public LoginContext(String name) throws LoginException;
public LoginContext(String name, Subject subject) throws
LoginException;
public LoginContext(String name, CallbackHandler callbackHandler)
throws LoginException
public LoginContext(String name, Subject subject,
CallbackHandler callbackHandler) throws LoginException
它们都统一有个参数name,这个参数指定了验证所使用的LoginModul
Jaas配置文件如下:
WorkDesk {
net.joinwork.bpm.workdesk.LoginModule required;
};
// 用LoginContext 实例化一个新的Subject
LoginContext lc = new LoginContext('WorkDesk');
try {
// 验证这个Subject
lc.login();
System.out.println('验证成功!');
// 获得被验证成功的Subject
Subject subject = lc.getSubject();
...
// 办完事 – 退出
lc.logout();
} catch (LoginException le) {
System.err.println('authentication unsuccessful: ' +le.getMessage());
}
10、
要配置如下图所示的区域,可以编辑pages目录下的:“folder.metadata”文件,这个文件控制区域的内容
http://b30.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef9704ea706b75d6a23d4f8b23a3b7a6e2761d0cb2b957611531149ba295af42134a2e0a7e0312477c2c41eda76f267152357548cca10346e2168180c7f19626878beaec597&a=30&b=30
11、
Portlet规范明确定义了Portlet应用如何使用“用户属性”,首先,必须在protlet.xml文件中定义属性如下:
User Given Name
user.name.given
User Last Name
user.name.family
User eMail
user.home-info.online.email
...
一旦属性如上定义,当前的portlet就可以利用PortletRequest 中定义的USER_INFO常量来从登陆用户处以无法更改的Map数据格式来获得当前的值,代码如下:
Map userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO);
String givenName = (userInfo!=null)? (String)userInfo.get('user.name.given') : '';
String lastName = (userInfo!=null) ? (String)userInfo.get('user.name.family') : '';
String email = (userInfo!=null) ? (String)userInfo.get('user.home-info.online.email') : '';
12、Portlet对动作的处理过程
在一个标准的Web应用程序中,一个HTML表单提交将导致执行一些业务逻辑。业务处理的结果,要么作为属性而被设置在请求或会话中并转发,要么包含到下一个JSP。
在一个JSR 168 portlet中,一个HTML表单的动作URL应该是什么样呢?JSR 168定义了一个JSP标签库,称为portlet taglib。HTML表单的动作URL可以使用actionURL portlet标签生成。例如(请参考favoriteColorEdit.jsp文件):
...
提交该HTML表单将会导致调用portlet的processAction(ActionRequest aRequest, ActionResponse aResponse)方法。像通常一样,可以通过调用request对象的getParameter()方法来获得表单参数。注意:通过提交表单调用动 作,但portlet中却没有processAction()方法,将会导致javax.portlet.PortletException。
processAction()方法设置response对象中的值。不要使用ActionRequest或ActionResponse对象的 setAttribute()方法。值不会从processAction()传递到render()方法,而且在JSP中是不可用的。相反要使用 ActionResponse对象的setRenderParameter()方法。这些render参数将对所有后续render请求可用,这一点与典型的Web应用程序请求属性很不相同。典型的Web application请求属性只对于一个请求可用。另一方面,render请求参数对于许多后续render请求可用。render参数保持可用直到值 被动作的重新执行显式地修改或删除。
考虑portlet FavoriteColor。它在VIEW模式显示了一个用户偏好的颜色,但是可以在EDIT模式下更改。在EDIT模式下提交偏好的颜色选择将调用 processAction()方法。该方法获得偏好的颜色请求参数,并将其设置为render参数。这样,偏好的的颜色render参数将在所有后续 render请求中都可用。
所呈现的参数是怎样显示在JSP上的呢?应使用来自portlet标签库的defineObjects标签来定义portlet对象。该标签使renderRequest、renderResponse和portletConfig portlet对象在页面中可用。参数通过调用renderRequest对象的getParameter()方法来显示。请参考与所包含的源代码示例中的favoriteColorView.jsp。
portlet FavoriteColor也展示了其他概念。第一个是如何在processAction()方法中用编程的方法改变portlet模式。调用 ActionResponse对象的setPortletMode()方法来修改portlet模式。第二个概念是如何使用一个HTML链接来修改 portlet模式。该链接使用来自portlet标签库的renderURL标签生成。根据希望的portlet模式指定portletMode属性的 值。请参考源代码示例中的FavoriteColorPortlet类和favoriteColorView.jsp页面。
13、portlet中对预先配置参数的读取
在portlet的开发中,可以在portlet.xml文件中预先配置相关的参数,然后在代码中通过PortletConfig来进行读取,具体示例如下:
a、 在portlet.xml文件中添加如下配置片断,添加一个参数:
portlet.xml:
jspView
/jsp/view.jsp
b、 在portlet程序中如下读取其配置:
SimplePortlet.java:
String jspName = this.getPortletConfig().getInitParameter('jspView');
14、 Portlet标签库
a、 定义对象(defineObjects)标签:
如果打开其中的一个JSP文件,你会发现,和Servlet一样,JSP中可以使用Portlet的一些variables.例如:
renderResponse
renderRequest
portletConfig--------可以用此变量获得portlet.xml文件中的配置信息
但是必须声名:
其中不可以定义任何属性或者包含任何内容.
b、 动作URL(actionURL )标签:
属性 值类型 对应值
windowState String minimized, normal, maximized
portletMode String view, edit, help
var String 任何值
secure String true,false
以上创建一个action URL , 当访问它时将使portlet window变为normal 装态, 模式变为 edit。
可以通过如下代码在processAction中判断当前操作模式:
public void processAction(ActionRequest request, ActionResponse response)
throws PortletException, IOException {
if (request.getPortletMode() == PortletMode.VIEW) { //浏览页
…..
}else if(request.getPortletMode() == PortletMode.EDIT){ //编辑状态
…..
}else if(request.getPortletMode() == PortletMode.HELP){ //帮助状态
…..
}
c、 renderURL 标签:
属性 值类型 对应值
windowState String minimized,normal,maximized
portletMode String view, edit, help
var String 任何值
secure String true,false
创建一个render URL , 当访问它时将使portlet window变为maximized装态, 模式变为 view.
d、 namespace Tag
为目前的Portlet产生一个唯一的Value. 防止和其他的Portlet 或者Portal页面上的value产生冲突.
doFoo()”>Foo
e、 param Tag:這個 tag 是定義一個參數值, 可能是放在 actionURL 或 renderURL 之中. param Tag 不准包含任何 Body Content.
属性 值类型
name String
注: param Tag不可以有body content.
15、portlet缓存
控制portlet是否被缓存,及缓存的时间可以在portlet.xml文件中用如下标签:
0
16、 Portal管理
研究portal管理中的【portlet应用生命周期管理】,可以发现,这个portlet是一个普通的GenericServletPortlet,其通过以下代码来获得一些系统的管理器:
PortletContext context = getPortletContext();
//注册管理器
registry = (PortletRegistry)context.getAttribute(CommonPortletServices.CPS_REGISTRY_COMPO
NENT);
//portlet工厂管理器
portletFactory = (PortletFactory)context.getAttribute(CommonPortletServices.CPS_PORTLET_FAC
TORY_COMPONENT);
//部署管理器
dm = (DeploymentManager)context.getAttribute(CommonPortletServices.CPS_DEPLOYMENT_
MANAGER_COMPONENT);
asm = (ApplicationServerManager)context.getAttribute(CommonPortletServices.CPS_APPLICATION_ SERVER_MANAGER_COMPONENT);
//应用服务管理器
if (null == registry) {
throw new PortletException('Failed to find the Portlet Registry on portlet initialization');
}
if (null == portletFactory) {
throw new PortletException('Failed to find the Portlet Factory on portlet initialization');
}
//服务管理器是否可用,决定于【应用管理器】是否可用
serverManagerAvailable = (asm != null && asm.isConnected());
其应用是在j2-admin应用的包:org.apache.jetspeed.portlets.palm中,牵涉到对portal应用的管理,可以参考一下它。
16、 Portal中跨域的session管理用的是PortletMessaging
可以参考SSO管理中对PortletMessaging的使用:
//接收
String realm = (String)PortletMessaging.receive(request, 'site', 'realm');
//
StatusMessage msg = (StatusMessage)PortletMessaging.consume(request, 'SSOBrowser', 'status');
//发布
PortletMessaging.publish(request, 'site', 'selectedUrl', selectedSite);
//销毁
PortletMessaging.cancel(request, 'site', 'selected');
16、 Jetspeed应用中的WEB-INF/jetspeed_macros.vm中包含了所有可以使用的宏
从
17、Jetspeed-layout部署的一些说明:
1、 是最早被部署的portlet应用,控制了整个的布局、装饰管理。
2、 其不是被部署为一个单独的应用,而是被部署到“WEB-INF\apps”目录下了,原因不明。
3、 autodeployment.staging.dir :部署的监听路径
4、 autodeployment.target.dir:部署的目标路径
18、Jetspeed部署配置文件:WEB-INF/conf/jetspeed.properties
这个配置文件定义了jetspeed部署服务器的所有规则 ,包括部署用户名和密码(修改它可以解决默认安装部署失败的问题-和tomcat保存一致),默认的装饰(tigris),默认编码格式,默认页面(page)的布局,管理员的电子邮件配置,默认用户等等
19、Jetspeed部署及其部署管理器:
它被作为Jetspeed的一个子项目来单独开发,其项目路径为:
http://portals.apache.org/jetspeed-2/multiproject/jetspeed-deploy-tools/deploy-tools.html
JetspeedDeploy and the DeploymentManager
JetspeedDeploy负责Jetspeed-2中portlet应用程序的管理. 当一个新的portlet应用被注册时,
the DeployPortletAppEventListener invokes JetspeedDeploy to prepare the portlet application for deployment.
new JetspeedDeploy(event.getPath(), toFile.getAbsolutePath(), stripLoggers);
JetspeedDeploy copies the web application archives (.war) from the input directory to the output directory and parses the web.xml, portlet.xml, and context.xml to ensure their compliance with the Jetspeed-2 portal engine.
http://b27.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef94800cf50ec19368357752807e5078d7547c211a1747bfd2be83516527484c85c591069e508e8091ec376477425426e8b207196159048661e7337416f8f55c38f400f18fc&a=27&b=27
JetspeedDeploy invokes the JetspeedWebApplicationRewriter to infuse the web.xml with the JetspeedContainer servlet if it does not already exist:
JetspeedContainer
Jetspeed Container
MVC Servlet for Jetspeed Portlet Applications
org.apache.jetspeed.container.JetspeedContainerServlet
contextName
${portlet-application-name}
0
...
JetspeedContainer
/container/*
In the same fashion, the JetspeedDeploy invokes the JetspeedContextRewriter to manipulate a portlet application context.xml file. For more information about Tomcat context.xml, see tomcat's documentation.
JetspeedDeploy Standalone Usage
JetspeedDeploy也可以通过命令行来单独调用:
java -jar jetspeed-deploy-tools-.jar -s inputWarPath outputWarPath
说明:
-s: flag indicating whether or not to strip to loggers from the application. When the flag is present, the loggers available in the application will be removed.
inputWarPath: the path of the war to process.
outputWarPath: the path of the processed war.
其工作模式描述如下,居于线程:
http://b27.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef9578831b263d0572e92f1a0e8b84cddc56ecc32cad462e8ea924a8075db194c1545e330fdd901ef31c9249dc84f99e742a5972d449346afba89add661203dfbe2ebccf588&a=30&b=27
19、Jetspeed应用框架详解:
jetspeed使用spring来作为它的缺省组件框架,但是,jetspeed的体系架构使得它可以很容易替换其组件管理框架,其控制是在JetspeedServlet中,其类图如下:
http://b26.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef9fe02cdc5dbffc58c96995aaa6d20e910e583e3ea6424df4283967fdf844c83a612ea8d2b43e9806e9028c0879b34e9536873ec5ff4b88d3cec3377f3e72334886c5752d6&a=26&b=26
在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上下文的加载模式注释掉,如下 所示:
java:comp/env/jdbc/jetspeed
将其下面的居于“common DBCP Pooled datasource”模式的连接模式放开,如下所示:
{my.drivers.class.name}
{URL to my DB}
{username}
{password}
同时修改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。
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)文件,找到 class='org.apache.jetspeed.tools.pamanager.servletcontainer.TomcatManager'
init-method='start' destroy-method='stop'
> 这样的设置,把TomcatManager改成WeblogicManager,并把下面的设置删掉。
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文件如下:
/jetspeed
jdbc/jetspeed
JetspeedDB
24、Portlet中获得portlet.xml中预先绑定的参数
在portlet.xml中预先定义了如下的参数值:
TopRange
100
在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页面就可以了。
1、 Jetspeed系统的配置文件在《JetSpeed2 home》\conf\Catalina\localhost下的jetspeed.xml文件中,此文件中定义了JAAS验证的配置及数据库连接模式(包括连接语句)
2、配置一个居于IFrame的应用:
1、 引入jar包:jetspeed-components-2.0.jar
jetspeed-rewriter-2.0.jar
jetspeed-web-content-2.0.jar
portals-bridges-velocity-1.0.jar
portals-gems-2.0.jar
(注:可以使用demo应用的lib)
2、 在portal.xml文件中配置一个portlet:
EchoIframe
lixin IFrame Portlet
Prototype of the IFRAME2 portlet
org.apache.jetspeed.portlet.IFrameGenericPortlet
-1
text/html
VIEW
SRC
http://www.sohu.com
HEIGHT
600
WIDTH
100%
MAX-HEIGHT
800
MAX-WIDTH
100%
SCROLLING
AUTO
en
zh
搜狐网
搜狐网
iframe,frame,frame2,iframe2
3、 配置对应的.psml文件,如下:
3、
jetspeed2的登陆权限验证完全居于JAAS,其配置文件是在jetspeed应用lib库中的jetspeed-security-.jar中的login.conf文件中定义的,如果想替换成自己的验证模式,可以修改此配置文件,如下:
Jetspeed {
org.apache.jetspeed.security.impl.DefaultLoginModule required;
};
请注意,自己加的login.conf配置文件可以放在WEB-INF/classes目录下的任何位置,并且修改WEB-INF/assembly目录下的security-providers.xml文件相应的login.conf文件的新位置。
4、
JAAS的subject主要用来表示一个应用主体对象(用户),此对象有一个或多个用来标识其身份的Principals,如名字(name principal)或者身份证号(SSN principal),principal是用来唯一标识此subject,以区别于其他的subject的。原文如下:
To authorize access to resources, applications first need to authenticate
the source of the request. The JAAS framework defines the term subject
to represent the source of a request. A subject may be any entity, such
as a person or a service. Once the subject is authenticated, a
javax.security.auth.Subject is populated with associated identities, or
Principals. A Subject may have many Principals. For example, a person may
have a name Principal ('John Doe') and a SSN Principal ('123-45-6789'),
which distinguish it from other subjects.
6、
一个Subject也许会与一个AccessControlContext联系在一起,可以通过如下方法返回一个与AccessControlContext联系在一起的subject:
public static Subject getSubject(final AccessControlContext acc);
7、
一个特定的Subject通过doAs方法来执行一个特定的操作(Action),原文如下:
The following static methods may be called to perform an action as a
particular Subject:
public static Object
doAs(final Subject subject,
final java.security.PrivilegedAction action);
public static Object
doAs(final Subject subject,
final java.security.PrivilegedExceptionAction action)
throws java.security.PrivilegedActionException;
};
8、
一个演示第一个doAs方法的例子:
假设有个用户叫Bob,他已经通过了LoginContext的(登陆)验证,随后,一个拥有com.ibm.security.Principal标识的subject产生了,这个Principal被命名为“Bob”。同时假设SecurityManager已经安装,并且访问策略文件(PolicyFile)存在,并定义如下:
// 授予 'BOB'访问(读)文件 'foo.txt'的许可
grant Principal com.ibm.security.Principal 'BOB' {
permission java.io.FilePermission 'foo.txt', 'read';
};
以下是本应用的代码:
class ExampleAction implements java.security.PrivilegedAction {
public Object run() {
java.io.File f = new java.io.File('foo.txt');
// 以下代码将会触发一个安全检测(通过Policy)
if (f.exists()) {
System.out.println('File foo.txt exists');
}
return null;
}
}
public class Example1 {
public static void main(String args) {
// 验证并鉴别用户 'BOB',这个过程在LoginContext那章中有描述
Subject bob;
// 在验证阶段,将bob与此Subject相关联
// 以'BOB'的身份执行'ExampleAction'
Subject.doAs(bob, new ExampleAction());
}
}
在执行过程中,ExampleAction在调用 f.exists() 时将遭遇一个安全检测。由于执行ExampleAction的是BOB,而在策略(Policy)文件中,已经赋予了Bob有此操作的相关权限,ExampleAction将通过安全检测。如果策略被改变的话,一个SecurityException的错误将被抛出。
9、
Principals用于描述Subject的身份,其必须继承java.security.Principal 和java.io.Serializable 接口
10、
LoginContext提供了4中构造器,如下:
public LoginContext(String name) throws LoginException;
public LoginContext(String name, Subject subject) throws
LoginException;
public LoginContext(String name, CallbackHandler callbackHandler)
throws LoginException
public LoginContext(String name, Subject subject,
CallbackHandler callbackHandler) throws LoginException
它们都统一有个参数name,这个参数指定了验证所使用的LoginModul
Jaas配置文件如下:
WorkDesk {
net.joinwork.bpm.workdesk.LoginModule required;
};
// 用LoginContext 实例化一个新的Subject
LoginContext lc = new LoginContext('WorkDesk');
try {
// 验证这个Subject
lc.login();
System.out.println('验证成功!');
// 获得被验证成功的Subject
Subject subject = lc.getSubject();
...
// 办完事 – 退出
lc.logout();
} catch (LoginException le) {
System.err.println('authentication unsuccessful: ' +le.getMessage());
}
10、
要配置如下图所示的区域,可以编辑pages目录下的:“folder.metadata”文件,这个文件控制区域的内容
http://b30.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef9704ea706b75d6a23d4f8b23a3b7a6e2761d0cb2b957611531149ba295af42134a2e0a7e0312477c2c41eda76f267152357548cca10346e2168180c7f19626878beaec597&a=30&b=30
11、
Portlet规范明确定义了Portlet应用如何使用“用户属性”,首先,必须在protlet.xml文件中定义属性如下:
User Given Name
user.name.given
User Last Name
user.name.family
User eMail
user.home-info.online.email
...
一旦属性如上定义,当前的portlet就可以利用PortletRequest 中定义的USER_INFO常量来从登陆用户处以无法更改的Map数据格式来获得当前的值,代码如下:
Map userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO);
String givenName = (userInfo!=null)? (String)userInfo.get('user.name.given') : '';
String lastName = (userInfo!=null) ? (String)userInfo.get('user.name.family') : '';
String email = (userInfo!=null) ? (String)userInfo.get('user.home-info.online.email') : '';
12、Portlet对动作的处理过程
在一个标准的Web应用程序中,一个HTML表单提交将导致执行一些业务逻辑。业务处理的结果,要么作为属性而被设置在请求或会话中并转发,要么包含到下一个JSP。
在一个JSR 168 portlet中,一个HTML表单的动作URL应该是什么样呢?JSR 168定义了一个JSP标签库,称为portlet taglib。HTML表单的动作URL可以使用actionURL portlet标签生成。例如(请参考favoriteColorEdit.jsp文件):
...
提交该HTML表单将会导致调用portlet的processAction(ActionRequest aRequest, ActionResponse aResponse)方法。像通常一样,可以通过调用request对象的getParameter()方法来获得表单参数。注意:通过提交表单调用动 作,但portlet中却没有processAction()方法,将会导致javax.portlet.PortletException。
processAction()方法设置response对象中的值。不要使用ActionRequest或ActionResponse对象的 setAttribute()方法。值不会从processAction()传递到render()方法,而且在JSP中是不可用的。相反要使用 ActionResponse对象的setRenderParameter()方法。这些render参数将对所有后续render请求可用,这一点与典型的Web应用程序请求属性很不相同。典型的Web application请求属性只对于一个请求可用。另一方面,render请求参数对于许多后续render请求可用。render参数保持可用直到值 被动作的重新执行显式地修改或删除。
考虑portlet FavoriteColor。它在VIEW模式显示了一个用户偏好的颜色,但是可以在EDIT模式下更改。在EDIT模式下提交偏好的颜色选择将调用 processAction()方法。该方法获得偏好的颜色请求参数,并将其设置为render参数。这样,偏好的的颜色render参数将在所有后续 render请求中都可用。
所呈现的参数是怎样显示在JSP上的呢?应使用来自portlet标签库的defineObjects标签来定义portlet对象。该标签使renderRequest、renderResponse和portletConfig portlet对象在页面中可用。参数通过调用renderRequest对象的getParameter()方法来显示。请参考与所包含的源代码示例中的favoriteColorView.jsp。
portlet FavoriteColor也展示了其他概念。第一个是如何在processAction()方法中用编程的方法改变portlet模式。调用 ActionResponse对象的setPortletMode()方法来修改portlet模式。第二个概念是如何使用一个HTML链接来修改 portlet模式。该链接使用来自portlet标签库的renderURL标签生成。根据希望的portlet模式指定portletMode属性的 值。请参考源代码示例中的FavoriteColorPortlet类和favoriteColorView.jsp页面。
13、portlet中对预先配置参数的读取
在portlet的开发中,可以在portlet.xml文件中预先配置相关的参数,然后在代码中通过PortletConfig来进行读取,具体示例如下:
a、 在portlet.xml文件中添加如下配置片断,添加一个参数:
portlet.xml:
jspView
/jsp/view.jsp
b、 在portlet程序中如下读取其配置:
SimplePortlet.java:
String jspName = this.getPortletConfig().getInitParameter('jspView');
14、 Portlet标签库
a、 定义对象(defineObjects)标签:
如果打开其中的一个JSP文件,你会发现,和Servlet一样,JSP中可以使用Portlet的一些variables.例如:
renderResponse
renderRequest
portletConfig--------可以用此变量获得portlet.xml文件中的配置信息
但是必须声名:
其中不可以定义任何属性或者包含任何内容.
b、 动作URL(actionURL )标签:
属性 值类型 对应值
windowState String minimized, normal, maximized
portletMode String view, edit, help
var String 任何值
secure String true,false
以上创建一个action URL , 当访问它时将使portlet window变为normal 装态, 模式变为 edit。
可以通过如下代码在processAction中判断当前操作模式:
public void processAction(ActionRequest request, ActionResponse response)
throws PortletException, IOException {
if (request.getPortletMode() == PortletMode.VIEW) { //浏览页
…..
}else if(request.getPortletMode() == PortletMode.EDIT){ //编辑状态
…..
}else if(request.getPortletMode() == PortletMode.HELP){ //帮助状态
…..
}
c、 renderURL 标签:
属性 值类型 对应值
windowState String minimized,normal,maximized
portletMode String view, edit, help
var String 任何值
secure String true,false
创建一个render URL , 当访问它时将使portlet window变为maximized装态, 模式变为 view.
d、 namespace Tag
为目前的Portlet产生一个唯一的Value. 防止和其他的Portlet 或者Portal页面上的value产生冲突.
doFoo()”>Foo
e、 param Tag:這個 tag 是定義一個參數值, 可能是放在 actionURL 或 renderURL 之中. param Tag 不准包含任何 Body Content.
属性 值类型
name String
注: param Tag不可以有body content.
15、portlet缓存
控制portlet是否被缓存,及缓存的时间可以在portlet.xml文件中用如下标签:
0
16、 Portal管理
研究portal管理中的【portlet应用生命周期管理】,可以发现,这个portlet是一个普通的GenericServletPortlet,其通过以下代码来获得一些系统的管理器:
PortletContext context = getPortletContext();
//注册管理器
registry = (PortletRegistry)context.getAttribute(CommonPortletServices.CPS_REGISTRY_COMPO
NENT);
//portlet工厂管理器
portletFactory = (PortletFactory)context.getAttribute(CommonPortletServices.CPS_PORTLET_FAC
TORY_COMPONENT);
//部署管理器
dm = (DeploymentManager)context.getAttribute(CommonPortletServices.CPS_DEPLOYMENT_
MANAGER_COMPONENT);
asm = (ApplicationServerManager)context.getAttribute(CommonPortletServices.CPS_APPLICATION_ SERVER_MANAGER_COMPONENT);
//应用服务管理器
if (null == registry) {
throw new PortletException('Failed to find the Portlet Registry on portlet initialization');
}
if (null == portletFactory) {
throw new PortletException('Failed to find the Portlet Factory on portlet initialization');
}
//服务管理器是否可用,决定于【应用管理器】是否可用
serverManagerAvailable = (asm != null && asm.isConnected());
其应用是在j2-admin应用的包:org.apache.jetspeed.portlets.palm中,牵涉到对portal应用的管理,可以参考一下它。
16、 Portal中跨域的session管理用的是PortletMessaging
可以参考SSO管理中对PortletMessaging的使用:
//接收
String realm = (String)PortletMessaging.receive(request, 'site', 'realm');
//
StatusMessage msg = (StatusMessage)PortletMessaging.consume(request, 'SSOBrowser', 'status');
//发布
PortletMessaging.publish(request, 'site', 'selectedUrl', selectedSite);
//销毁
PortletMessaging.cancel(request, 'site', 'selected');
16、 Jetspeed应用中的WEB-INF/jetspeed_macros.vm中包含了所有可以使用的宏
从
17、Jetspeed-layout部署的一些说明:
1、 是最早被部署的portlet应用,控制了整个的布局、装饰管理。
2、 其不是被部署为一个单独的应用,而是被部署到“WEB-INF\apps”目录下了,原因不明。
3、 autodeployment.staging.dir :部署的监听路径
4、 autodeployment.target.dir:部署的目标路径
18、Jetspeed部署配置文件:WEB-INF/conf/jetspeed.properties
这个配置文件定义了jetspeed部署服务器的所有规则 ,包括部署用户名和密码(修改它可以解决默认安装部署失败的问题-和tomcat保存一致),默认的装饰(tigris),默认编码格式,默认页面(page)的布局,管理员的电子邮件配置,默认用户等等
19、Jetspeed部署及其部署管理器:
它被作为Jetspeed的一个子项目来单独开发,其项目路径为:
http://portals.apache.org/jetspeed-2/multiproject/jetspeed-deploy-tools/deploy-tools.html
JetspeedDeploy and the DeploymentManager
JetspeedDeploy负责Jetspeed-2中portlet应用程序的管理. 当一个新的portlet应用被注册时,
the DeployPortletAppEventListener invokes JetspeedDeploy to prepare the portlet application for deployment.
new JetspeedDeploy(event.getPath(), toFile.getAbsolutePath(), stripLoggers);
JetspeedDeploy copies the web application archives (.war) from the input directory to the output directory and parses the web.xml, portlet.xml, and context.xml to ensure their compliance with the Jetspeed-2 portal engine.
http://b27.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef94800cf50ec19368357752807e5078d7547c211a1747bfd2be83516527484c85c591069e508e8091ec376477425426e8b207196159048661e7337416f8f55c38f400f18fc&a=27&b=27
JetspeedDeploy invokes the JetspeedWebApplicationRewriter to infuse the web.xml with the JetspeedContainer servlet if it does not already exist:
JetspeedContainer
Jetspeed Container
MVC Servlet for Jetspeed Portlet Applications
org.apache.jetspeed.container.JetspeedContainerServlet
contextName
${portlet-application-name}
0
...
JetspeedContainer
/container/*
In the same fashion, the JetspeedDeploy invokes the JetspeedContextRewriter to manipulate a portlet application context.xml file. For more information about Tomcat context.xml, see tomcat's documentation.
JetspeedDeploy Standalone Usage
JetspeedDeploy也可以通过命令行来单独调用:
java -jar jetspeed-deploy-tools-.jar -s inputWarPath outputWarPath
说明:
-s: flag indicating whether or not to strip to loggers from the application. When the flag is present, the loggers available in the application will be removed.
inputWarPath: the path of the war to process.
outputWarPath: the path of the processed war.
其工作模式描述如下,居于线程:
http://b27.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef9578831b263d0572e92f1a0e8b84cddc56ecc32cad462e8ea924a8075db194c1545e330fdd901ef31c9249dc84f99e742a5972d449346afba89add661203dfbe2ebccf588&a=30&b=27
19、Jetspeed应用框架详解:
jetspeed使用spring来作为它的缺省组件框架,但是,jetspeed的体系架构使得它可以很容易替换其组件管理框架,其控制是在JetspeedServlet中,其类图如下:
http://b26.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef9fe02cdc5dbffc58c96995aaa6d20e910e583e3ea6424df4283967fdf844c83a612ea8d2b43e9806e9028c0879b34e9536873ec5ff4b88d3cec3377f3e72334886c5752d6&a=26&b=26
在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上下文的加载模式注释掉,如下 所示:
java:comp/env/jdbc/jetspeed
将其下面的居于“common DBCP Pooled datasource”模式的连接模式放开,如下所示:
{my.drivers.class.name}
{URL to my DB}
{username}
{password}
同时修改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。
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)文件,找到 class='org.apache.jetspeed.tools.pamanager.servletcontainer.TomcatManager'
init-method='start' destroy-method='stop'
> 这样的设置,把TomcatManager改成WeblogicManager,并把下面的设置删掉。
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文件如下:
/jetspeed
jdbc/jetspeed
JetspeedDB
24、Portlet中获得portlet.xml中预先绑定的参数
在portlet.xml中预先定义了如下的参数值:
TopRange
100
在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页面就可以了。
相关推荐
标题 "jetspeed2" 暗示我们正在讨论一个开源的Java门户框架——Jetspeed 2。Jetspeed 2是一个高度可配置和可扩展的框架,用于构建企业级的Web门户应用。它允许开发者整合各种内容、应用和服务,提供统一的用户界面。...
在portal.xml文件中配置一个portlet 配置对应的.psml文件,如下 一个特定的Subject通过doAs方法来执行一个特定的操作(Action) 一个演示第一个doAs方法的例子 Portlet对动作的处理过程 ...Jetspeed部署及其部署管理器
**Jetspeed2 门户技术开发文档** Apache Jetspeed2 是一个开源的、可扩展的、基于标准的门户框架,用于构建企业级的门户应用。它提供了丰富的功能,包括个性化、内容管理、工作流程以及安全机制,使开发者能够快速...
【Jetspeed2官网guide文档翻译2】这篇文档主要面向初次接触Jetspeed的用户,提供了从源码构建和部署Jetspeed 2.2的详细步骤。Jetspeed是一个开源的portlet容器和企业信息门户平台,它允许集成多种应用和服务,提供...
### jetspeed2样式的开发文档解析 #### 一、概述 jetspeed2是一款基于Java的企业门户框架,它提供了丰富的功能来构建复杂的Web应用程序。本文档旨在帮助开发者理解jetspeed2样式的开发流程与细节,特别是关于如何...
由于是开源项目,Jetspeed2有一个活跃的开发者社区,提供了许多在线文档、教程和论坛讨论,方便用户学习和解决问题。 通过这个Jetspeed2资料包,你可以深入了解Jetspeed2的原理、配置方法、开发技巧以及最佳实践,...
Jetspeed2 是一个开源的企业门户框架,它提供了丰富的功能,包括安全管理、内容管理、个性化以及portlet集成。本文档是Jetspeed2 Deployer Guide的中文翻译,旨在帮助初学者理解如何部署和配置Jetspeed2的安全机制。...
在提供的压缩包文件中,"jetspeed1资料.zip"可能包含了Jetspeed 1的相关文档、源代码、示例和开发指南,而"Jetspeed2资料.rar"则可能包含Jetspeed 2的更新内容、教程和案例研究。这些资源对于想要学习和使用Jetspeed...
综上所述,这些中文文档为学习和使用Jetspeed2提供了全面的指导。从安装配置到实际应用,再到深入开发,覆盖了Jetspeed2的各个方面,对于想要掌握这一企业门户平台的用户来说,是一份不可多得的学习资料。通过研读...
Jetspeed是Apache组织开发的一个...Apache开源组织的企业门户项目,现有两个版本:jetspeed1与jetspeed2。由于jetspeed1在设计上的“缺陷”,现在已经升级到jetspeed2。目前大陆还没有成功使用jetspeed2开发的案例。
JetSpeed2.0(简称J2)是Apache软件基金会旗下的一个开源企业级门户平台,其最终release版本于2005年12月发布。相较于早期的JetSpeed1.x(J1.x),J2在架构上进行了重大改进,不再依赖Turbine框架,而是引入了Spring...
2. **文档**:可能会有安装指南、用户手册和开发者文档,帮助用户了解如何部署、配置和使用jetSpeed,以及如何为jetSpeed开发portlet。 3. **库文件**:包括jar文件,它们是jetSpeed运行所必需的Java类库。这些库...
### jetspeed2-开发手册知识点概述 #### 一、Apache Jetspeed2简介 ...通过上述知识点的学习,开发者可以更好地理解和掌握Apache JetSpeed2的开发流程和技术细节,从而更加高效地进行门户网站的开发工作。
Jetspeed 是一个开源的门户平台,它主要用于构建企业级的Web门户应用。作为一个专业的IT行业大师,我很高兴向您详细解读这个项目的...在实际工作中,深入学习和应用这些知识点,可以提升项目效率,满足复杂的企业需求。
### JetSpeed 高级 Portlet 技术详解 #### 关于本教程 本文旨在深入探讨JetSpeed中的高级Portlet技术,特别关注如何利用JavaServer Pages (JSP) 和其他Web编程技术来创建更加动态和交互式的portlet。此外,还会...
### JetSpeed2开发文档中文翻译的关键知识点概览 #### JetSpeed2.0概述 JetSpeed2.0(简称J2)是Apache基金会推出的开源企业门户框架。它在2005年12月发布了最终的Release版本,用户可以从官方网站下载到源代码以及...
2. **运行安装程序**:通过命令行窗口进入下载目录(例如:`C:\download`),执行`java -jar jetspeed-installer-demo-2.2.0.jar`命令开始安装流程。 3. **安装界面**:点击“Next”进入下一步,并接受许可协议。 4....
2. 服务器上的Jetty Web服务器接收到请求,并将其转发给Jetspeed。 3. Jetspeed中的Action模块处理用户请求,并执行相应的业务逻辑。 4. 根据业务逻辑的结果,选择合适的Screen模块来生成页面内容。 5. Layout模块...
2. 输入项目名称,选择JetSpeed作为目标运行时,并指定portlet API版本为JSR168。 3. 创建portlet类,实现`javax.portlet.Portlet`接口,编写`doView`、`doEdit`等生命周期方法。 portlet开发: 1. Portlet配置:在...