`

Jetspeed2学习笔记

阅读更多
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页面就可以了。
分享到:
评论

相关推荐

    实训商业源码-绿色节能环保企业网站源码-毕业设计.zip

    实训商业源码-绿色节能环保企业网站源码-毕业设计.zip

    实训商业源码-全新自适应地址发布页HTML源码-毕业设计.zip

    实训商业源码-全新自适应地址发布页HTML源码-毕业设计.zip

    C#与Halcon混合编程的视觉上位机MES源码解析及应用 - 视觉检测

    内容概要:本文详细介绍了基于C#和Halcon混合编程的视觉上位机MES(制造执行系统)源码。该源码可以在Visual Studio 2019环境中直接编译运行,采用插件式开发架构,支持多种机器视觉应用,如视觉检测、机械手定位、点胶机、激光切割机等。文中不仅展示了源码的功能特点,还深入探讨了其内部结构和技术细节,特别是手眼标定等功能。同时,强调了该源码适用于进阶开发者,不适合零基础的学习者。 适合人群:具备一定编程基础,尤其是熟悉C#和Halcon的进阶开发者。 使用场景及目标:① 快速开发视觉检测和机械控制应用;② 学习插件式开发架构和标准化拖拽式编程方法;③ 掌握C#与Halcon混合编程技巧。 其他说明:该源码已通过常用功能测试,但由于硬件差异,实际使用时可能需要进行适当调整。仅供学习使用,不适合零基础者。

    论文模板-宠物店宠物培训机构网站源码-实训商业源码.zip

    论文模板-宠物店宠物培训机构网站源码-实训商业源码.zip

    P3软件对工程项目的进度控制.doc

    P3软件对工程项目的进度控制.doc

    施工中挖断水、电、通信光缆、煤气管道事故应急预案.doc

    施工中挖断水、电、通信光缆、煤气管道事故应急预案.doc

    腾讯大数据开发面试题及参考答案.pdf

    腾讯大数据开发面试题及参考答案

    LSDyna与SPH-DEM耦合技术在泥石流冲击建筑物动力过程研究中的应用

    内容概要:本文探讨了利用LSDyna软件中SPH(光滑粒子流体动力学)和DEM(离散元法)耦合技术来模拟泥石流冲击建筑物的动力过程。针对传统有限元方法在处理大变形流体时存在的网格畸变问题,SPH-DEM耦合提供了一种有效的解决方案。文中详细介绍了SPH和DEM的工作原理以及它们之间的相互作用机制,特别是如何通过接触算法实现动量传递。此外,还讨论了具体的参数设置,如耦合半径的选择、材料特性的定义(包括泥浆的剪切稀化特性和DEM颗粒的刚度),并提供了优化计算效率的方法,如硬件选择和初始条件设定。最后强调了计算后处理阶段需要注意的问题,确保模拟结果的准确性。 适合人群:从事地质灾害防治、土木工程、岩土工程等相关领域的研究人员和技术人员。 使用场景及目标:适用于需要评估泥石流对建筑物潜在危害的研究项目,旨在提高对复杂环境下流固耦合现象的理解,为工程防灾提供科学依据。 其他说明:文中提到的具体参数设置和优化技巧对于实际操作具有重要指导意义,能够帮助用户更好地掌握LSDyna中SPH-DEM耦合的应用。

    电磁超表面中磁偶极子贡献准BIC、多极子分析与斜入射反射相位计算的技术解析 v1.0

    内容概要:本文深入探讨了电磁超表面中磁偶极子对准BIC(连续谱中的束缚态)的贡献、多极子分析以及斜入射反射相位计算。首先介绍了磁偶极子如何通过调整纳米棒长度来激活准BIC,并展示了相关代码实现及其物理意义。接着讨论了多极子分析方法,通过电偶极矩和磁偶极矩的计算,揭示了场分布中不同模式的权重。最后,详细解释了斜入射条件下反射相位的变化规律,提供了基于传输矩阵法的计算方法,并展示了TE和TM极化下的相位变化图。这些技术在生物传感等领域有重要应用价值。 适合人群:具备电磁学基础知识的研究人员和技术爱好者,尤其是对电磁超表面感兴趣的科学家和工程师。 使用场景及目标:适用于研究电磁超表面特性的科研项目,帮助研究人员理解和预测磁偶极子对准BIC的影响、多极子成分的贡献以及斜入射反射相位的变化,从而优化超表面设计。 其他说明:文中提供的代码为简化版本,旨在揭示现象背后的物理机制,实际应用中可能需要更复杂的模型和仿真工具。

    基于内容的新闻推荐系统——Java EE技术栈下TF-IDF与余弦相似度算法的应用 全集

    内容概要:本文介绍了基于内容的新闻推荐系统的技术实现与功能特点。该系统主要采用Java EE技术栈,包括Java、Eclipse、MySQL、Spring、SpringMVC、Mybatis等技术,结合TF-IDF算法和余弦相似度算法,通过对用户浏览行为的分析,挖掘用户的兴趣偏好,为用户提供个性化新闻推荐。系统分为前台和后台两大功能模块,前台提供新闻分类查看、详情阅读、评论互动等功能,后台支持系统设置、用户管理、新闻管理等操作。项目的完整源码、数据库及相关文档均包含在内,便于部署和二次开发。 适合人群:对Java EE技术栈有一定了解的研发人员和技术爱好者。 使用场景及目标:适用于希望深入了解基于内容的推荐算法及其实际应用的开发者,尤其是那些想要构建类似新闻推荐系统的团队。通过学习该项目,能够掌握推荐系统的架构设计、算法实现及前后台功能开发。 阅读建议:建议读者先熟悉Java EE相关技术和推荐算法的基本概念,再逐步深入研究项目源码和文档,结合实际运行环境进行实践探索。

    论文模板-个人写真拍照网站源码-实训商业源码.zip

    论文模板-个人写真拍照网站源码-实训商业源码.zip

    神机妙算软件(定额、清单)培训讲义.doc

    神机妙算软件(定额、清单)培训讲义.doc

    光伏微网储能技术中的双闭环与模糊PI控制策略及其应用

    内容概要:本文详细探讨了光伏微网储能技术,特别是电池充放电双向流动的实现方式。文中介绍了双闭环控制策略(如电压外环滑膜控制)和模糊PI控制策略的具体应用。双闭环控制策略通过调整电机控制参数确保电压稳定输出,而模糊PI控制则依据系统运行状态动态调整比例和积分参数,从而实现精准控制。这两种策略共同提高了光伏微网储能系统的稳定性和可靠性。此外,还提供了具体的案例分析来展示这些控制策略的实际应用效果。 适合人群:从事新能源技术研发的专业人士,尤其是关注光伏微网储能领域的研究人员和技术人员。 使用场景及目标:适用于希望深入了解光伏微网储能系统控制机制的研究者和技术开发者,旨在帮助他们掌握先进的控制技术和优化现有系统性能的方法。 其他说明:文章不仅解释了理论概念,还结合实际案例进行了详细的阐述,有助于读者更好地理解和应用相关技术。

    实训商业源码-JSON转换程序去授权版-毕业设计.zip

    实训商业源码-JSON转换程序去授权版-毕业设计.zip

    基于二阶锥规划的动态最优潮流MATLAB求解程序:配电网优化与多种设备联合协调研究

    内容概要:本文介绍了基于MATLAB的二阶锥规划方法来求解主动配电网的动态最优潮流问题。文中详细展示了MATLAB代码的具体实现步骤,包括导入数据、定义优化变量、构建目标函数和约束条件、建立二阶锥规划模型、设置求解选项并执行求解,最后对结果进行可视化展示和错误处理。该方法不仅考虑了传统的电网拓扑和线路参数,还特别引入了风电、CB(电路断路器)、SVG(静止无功功率发生器)以及OLTC(自动调节负荷器)等多种设备的影响,从而提高了优化的全面性和准确性。 适合人群:从事电力系统优化研究的技术人员、高校相关专业的研究生和高年级本科生。 使用场景及目标:适用于需要深入理解和掌握配电网优化理论和技术的研究人员,特别是那些希望借助MATLAB平台进行主动配电网动态最优潮流求解的人群。通过学习本篇文章,读者可以更好地理解如何运用先进的数学建模和优化算法解决复杂的电力系统问题。 其他说明:文中提供的MATLAB代码具有详细的注释,方便初学者跟随代码逐步学习。同时,文中提到的YALMIP和CPLEX工具也为优化求解提供了强有力的支持。

    基于方波注入与滑膜观测器的永磁同步电机无感控制策略研究,及其与正弦波注入方法的对比实现论文资料。

    内容概要:本文详细介绍了基于永磁同步电机(PMSM)的无感控制技术,重点讨论了高频注入(方波)结合滑膜观测器实现的无传感器控制方法,以及正弦波注入对应的实现方式。文中首先阐述了无感控制技术的基本概念和发展背景,随后深入探讨了高频注入法的工作原理,即通过在电机定子中注入高频方波信号并利用反电动势信号的谐波成分来估算电机的转子位置和速度。接着介绍了滑膜观测器的作用,它通过对电机电流和电压的测量值进行运算,进一步提高估算精度。最后,文章对比了正弦波注入法的优势,强调其更高的估算精度和更小的误差。通过这两种方法的结合,实现了对电机的精确控制和高效运行。 适合人群:从事电机控制领域的研究人员和技术人员,尤其是关注永磁同步电机无感控制技术的专业人士。 使用场景及目标:适用于工业、交通、航空等领域的永磁同步电机控制系统设计与优化,旨在提升电机的运行效率和稳定性。 其他说明:文章提供了详细的理论分析和技术实现路径,为相关领域的研究和应用提供了重要的参考依据。

    论文模板-电商资讯网站源码-实训商业源码.zip

    论文模板-电商资讯网站源码-实训商业源码.zip

    实训商业源码-FysPro重构版v3.0-毕业设计.zip

    实训商业源码-FysPro重构版v3.0-毕业设计.zip

    论文模板-PHP解密源码-实训商业源码.zip

    论文模板-PHP解密源码-实训商业源码.zip

    IMG_5912.JPG

    IMG_5912.JPG

Global site tag (gtag.js) - Google Analytics