??xml version="1.0" encoding="utf-8" standalone="yes"?>
// 初始?/font>
// 初始化portlets.
// 初始化display.
// 初始化layout模板.
// 初始化Theme.
// 查company
// 其它内容...
// 响应服务
// Portlet Request Processor - 在struts.config中定?
// d处理.
// 处理service前置事g.
// 调用Struts的serviceҎ.
// 处理Sruts后置事g.
// portal的RequestProcessor.
string path = processPath(req, res) // PortalRequestProcessor重蝲
ActionMapping mapping = processMapping(req, res, path);
processRoles(req, res, mapping) // PortalRequestProcessor重蝲
ActionForm from = processActionForm(req, res, mapping);
processForward(req, res, mapping);
processInclude(req, res, mapping);
Action action = processActionCreate(req, res, mapping);
ActionForward forward = processActionPerform(req, res, action, form, mapping);
processForwardConfig(req, res, forward); // TilesRequestProcessor重蝲
processTilesDefinition(forward.getPath(), forward.getContextRelative(), req, res);
Controller.execute(); // 输出/portal/layout.jsp
/html/portal/layout/view/portlet.jsp - portlet布局视图面.
// d模板内容Q模板由liferay-layout-templates.xml文g定义.
// 注入模板处理E序
portal.servlet.MainServlet.init()
// process startup events
StartupAction.run()
String[] xmls = new String[] {
Http.URLtoString(ctx.getResource("/WEB-INF/portlet.xml")),
Http.URLtoString(ctx.getResource("/WEB-INF/portlet-ext.xml")),
Http.URLtoString(ctx.getResource("/WEB-INF/liferay-portlet.xml")),
Http.URLtoString(ctx.getResource("/WEB-INF/liferay-portlet-ext.xml")),
Http.URLtoString(ctx.getResource("/WEB-INF/web.xml"))
};
PortletLocalServiceUtil.initEAR(xmls)
String xml = Http.URLtoString(ctx.getResource(
"/WEB-INF/liferay-display.xml"));
PortletCategory newPortletCategory =
PortletLocalServiceUtil.getEARDisplay(xml);
portletCategory.merge(newPortletCategory);
String[] xmls = new String[] {
Http.URLtoString(ctx.getResource(
"/WEB-INF/liferay-layout-templates.xml")),
Http.URLtoString(ctx.getResource(
"/WEB-INF/liferay-layout-templates-ext.xml"))
};
LayoutTemplateLocalUtil.init(ctx, xmls)
String[] xmls = new String[] {
Http.URLtoString(ctx.getResource(
"/WEB-INF/liferay-look-and-feel.xml")),
Http.URLtoString(ctx.getResource(
"/WEB-INF/liferay-look-and-feel-ext.xml"))
};
ThemeLocalUtil.init(ctx, xmls)
CompanyLocalServiceUtil.checkCompany(_companyId);
portal.servlet.MainServlet.service()
// get portalContext
ServletContext ctx = getServletContext();
ServletContext portalCtx = ctx.getContext(
PrefsPropsUtil.getString(_companyId, PropsUtil.PORTAL_CTX));
// Struts module config
ModuleConfig moduleConfig = getModuleConfig(req);
portletReqProcessor = PortletRequestProcessor.getInstance(this, moduleConfig);
EventsProcessor.process(PropsUtil.getArray(PropsUtil.SERVLET_SERVICE_EVENT_PRE), req, res);
callParentService(req, res);
EventsProcessor.process(PropsUtil.getArray(PropsUtil.SERVLET_SERVICE_EVENTS_POST), req, res);
// struts的ActionServlet.
ActionServlet.process(HttpServletRequest req, HttpServletResponse res)
processor.process(req, res);
portal.struts.PortalRequestProcessor.process(HttpServletRequest req, HttpServletResponse res)
// struts的RequestProcessor
RequestProcessor.process(HttpServletRequest req, HttpServletResponse res)
// tiles的RequestProcessor
TilesRequestProcessor.processForwardConfig(req, res, forward)
/html/portal/layout.jsp - portal布局面.
String content = LayoutTemplateLocalUtil.getContent(
layoutTypePortlet.getLayoutTemplateId(), false, theme.getThemeId());
下面是一个一列的模板:
Qdiv id="layout-content-outer-decoration"Q?br /> Qdiv id="layout-content-inner-decoration"Q?br /> Qdiv id="layout-content-container"Q?br /> $processor.processColumn("column-1")
Q?divQ?br /> Q?divQ?br /> Q?divQ?br />
// 处理模板
portlet.layoutconfiguration.util.RuntimePortletUtil.processTemplate(
application, pageContext, request, response, content);
TemplateProcessor processor = new TemplateProcessor(ctx, req, res, portletId);
VelocityContext context = new VelocityContext();
context.put("processor", processor);
// 处理模板
Velocity.evaluate(context, pageContext.getOut(),
RuntimePortletUtil.class.getName(), content);
]]>
2Q?span style="FONT: 7pt 'Times New Roman'">
Portlet
。ؓ
Portlet
接口部分Q在新编?/span>
Portlet
时均需要直接实现此接口或承已实现此接口的
Portlet
c?/span>
(
?/span>
GenericPortlet)
Q此接口控制?/span>
Portlet
的整?/span>
Lifecycle
Q根?/span>
JSR168
规范Q将
Portlet
?/span>
Lifecycle
划分Z三个阶段Q?/span>
(1) init
。初始化?/span>
Portlet
Q在一?/span>
Lifecycle
?/span>
Portlet
只可初始化一ơ。通过传入?/span>
PortletConfig
可获?/span>
PortletContext
?/span>
(2) handlerRequest
。在此阶D规范将其分Z
processAction
以及
render
两种概念Q?/span>
processAction
表示?/span>
Portlet
与用L交互q程的处理;
render
则主要控制了
Portlet
的内容的昄Q用于组?/span>
Portlet
?/span>
fragment
Q不好翻译,
^_^
Q?/span>
(3)destroy
。结束此
Portlet
?/span>
Lifecycle
Q可在此部分q行
Portlet
的一些资源的回收{工作?/span>
Portlet
容器通过
Portlet
的一个标识符调用
Portlet
的接口进行与
Portlet
的交互?/span>
Portlet
接口依赖
PortletConfig
?/span>
ActionRequest
?/span>
ActionResponse
?/span>
RenderRequest
?/span>
RenderResponse
Q这?/span>
Servlet
非常的相伹{?/span>
3Q?span style="FONT: 7pt 'Times New Roman'">
PortletRequest
。此接口cM
HttpServletRequest
Q通过此接口获取所有与当前
Portlet
相关的参数?/span>
Portlet
?/span>
Mode
?/span>
Portlet
?/span>
WindowState
?/span>
Portal
的上下文环境?/span>
Portlet
?/span>
Preference
?/span>
PortletSession
?/span>
4Q?span style="FONT: 7pt 'Times New Roman'">
ActionRequest
。此接口l承?/span>
PortletRequest
Q通过此接口在
Portlet
?/span>
processAction
中通过
ActionRequest
可获得相关的
Portlet
的交互式h的参数?/span>
5Q?span style="FONT: 7pt 'Times New Roman'">
RenderRequest
。此接口l承?/span>
PortletRequest
Q目前规范中此接口中未定义Q何方法?/span>
6Q?span style="FONT: 7pt 'Times New Roman'">
PortletResponse
。此接口cM?/span>
HttpServletResponse
Q提供页面显C?/span>
Portlet
时的一些内容的写入?/span>
7Q?span style="FONT: 7pt 'Times New Roman'">
ActionResponse
。此接口l承?/span>
PortletResponse
Q提供了交互相关的设|?/span>
PortletMode
以及?/span>
WindowState
的方法?/span>
8Q?span style="FONT: 7pt 'Times New Roman'">
RenderResponse
。此接口l承?/span>
PortletResponse
Q提供了完全cM?/span>
HttpServletResponse
的方法,׃
Portlet
只提供片断式的内容,?/span>
Servlet
提供一个完整的面内容不同Q在
response
时无法设|页面的
contentType
{相关的面头的东ѝ?/span>
9Q?span style="FONT: 7pt 'Times New Roman'">
PortletConfig
。此接口非常cM?/span>
ServletConfig
Q用于获?/span>
Portlet
配置文g
(portlet.xml)
中的初始参数Q类g
ServletConfig
获取
web.xml
中的初始参数Q通过
PortletConfig
可获?/span>
Portlet
的相关上下文对象
PortletContext
?/span>
10Q?span style="FONT: 7pt 'Times New Roman'">
WindowState
。此具体cȝ于定?/span>
Portlet
所支持?/span>
WindowState
?/span>
11Q?span style="FONT: 7pt 'Times New Roman'">
PortletMode
。此具体cȝ于定?/span>
Portlet
所支持?/span>
Mode
Q默认提供的?/span>
View
?/span>
Edit
?/span>
Help
Q?/span>
Portlet
容器厂商可根据需要提供特D的
Mode
?/span>
12Q?span style="FONT: 7pt 'Times New Roman'">
PortalContext
。此接口cM?/span>
ServletContext
Q用于获?/span>
Portal
相关的上下文信息Q如
Portal
的提供商信息{等?/span>
13Q?span style="FONT: 7pt 'Times New Roman'">
PortletPreference
。此接口主要用于考虑
Portlet
的个性化定制的数据的保存Q此接口q不代表要替代用于保存个性化定制信息的数据库Q可用于保存一些数据量不大情况下的Ҏ偏好?/span>
14Q?span style="FONT: 7pt 'Times New Roman'">
PreferenceValidator
。此接口用于?/span>
portlet.xml
中的
Preference
参数的合法性?/span>
15Q?span style="FONT: 7pt 'Times New Roman'">
PortletSession
。此接口非常cM?/span>
HttpSession
Q用于串?/span>
Portlet
中的
Session
数据?/span>
16Q?span style="FONT: 7pt 'Times New Roman'">
PortletContext
。此接口用于获取?/span>
Portlet
容器相关的上下文信息?/span>
import Java.io.IOException;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
public class HelloWorldPortlet extends GenericPortlet {
@Override
protected void doEdit(RenderRequest arg0, RenderResponse arg1) throws PortletException, IOException {
// TODO Auto-generated method stub
arg1.setContentType("text/html");
arg1.getWriter().println("Hello World,This is a Portlet!---doEdit");
}
@Override
protected void doView(RenderRequest arg0, RenderResponse arg1) throws PortletException, IOException {
// TODO Auto-generated method stub
arg1.setContentType("text/html");
arg1.getWriter().println("Hello World,This is a Portlet!---doView");
}
}
package com.rain.portal;
import Java.io.IOException;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
public class HelloJSPPortlet extends GenericPortlet {
@Override
protected void doEdit(RenderRequest arg0, RenderResponse arg1) throws PortletException, IOException {
// TODO Auto-generated method stub
arg1.setContentType("text/html");
String jspName=getPortletConfig().getInitParameter("edit-jsp");
PortletRequestDispatcher rd=getPortletContext().getRequestDispatcher(jspName);
rd.include(arg0, arg1);
}
@Override
protected void doView(RenderRequest arg0, RenderResponse arg1) throws PortletException, IOException {
// TODO Auto-generated method stub
arg1.setContentType("text/html");
String jspName=getPortletConfig().getInitParameter("view-jsp");
PortletRequestDispatcher rd=getPortletContext().getRequestDispatcher(jspName);
rd.include(arg0, arg1);
}
}
GenericPortlet l一定义了可?/span> Portal 容器识别和调用的ҎQ包括:
public Init() Q初始化Q?/span>
public Init(PortletConfig) Q初始化Q?/span>
public getInitParameter(String) Q取得在 Portlet.xml 中定义的初始化参敎ͼ
public getInitParameterNames() Q取得在 Portlet.xml 中定义的全部初始化参敎ͼ
public getPortletConfig() Q取得包含初始化参数的配|对?/span> PortletConfig 实例Q?/span>
public getPortletContext() Q取?/span> Portlet 上下文;
public getPortletName() Q取得在 Portlet.xml 中定义的 Portlet 名称?/span>
public getResourceBundle(Locale) Q取?/span> Portlet 国际化的 Resource Bundle Q?/span>
protected getTitle(RenderRequest) Q取?/span> Portlet 的标题;
protected doView(RenderRequest Q?/span> RenderResponse) Q?/span> Portlet 览模式的处理方法;
protected doEdit(RenderRequest Q?/span> RenderResponse) Q?/span> Portlet ~辑模式的处理方法;
protected doHelp(RenderRequest Q?/span> RenderResponse) Q?/span> Portlet 帮助模式的处理方法;
protected doDispatch(RenderRequest Q?/span> RenderResponse) Q?/span> Portlet 行ؓ分发Q?/span>
protected processAction(ActionRequest Q?/span> ActionResponse) Q?/span> Portlet 处理 Action Request 的方法;
protected render(RenderRequest Q?/span> RenderResponse) Q?/span> Portal 处理 Render Request 的方法;
public destroy() Q?/span> Portlet 销毁,l止其生命周期?/span>
?/span> Portlet Portal q行的时候, doView ?/span> doEdit ?/span> doHelp 三个Ҏ分别被调用,用以生成 Portlet 标记。同样也可以调用 Servlet 生成 Portlet 标记Q或者不调用 JSP 或?/span> Servlet Q直接在Ҏ中得?/span> PrintWriter 然后用最单的 pw.println() 打印出内宏V这个过E类?/span> Servlet Q如下:
PrintWriter pw = renderResponse.getWriter();
pw.println(“Hello Q?/span> world!”);
?/span> Servlet cMQ可以?/span> getInitParamter(String s) 得到配置文g?/span> Portlet 的初始|只不q?/span> Servlet ?/span> web.xml 中,?/span> Portlet ?/span> portlet.xml 中?br />portlet.xmlQ?/span>
<init-param>
<value>
</init-param>
针对如上portlet.xml中的初始化信息,可以采用如下的调用方式:
SimplePortlet.java Q?/span>
String jspName = getPortletConfig().getInitParameter("jspView");
许多大型企业的网? 渐渐采用?portal server 作ؓ开发的基础. 至于什么是 portal ? 中文译?"门户|站"?有h可能?. 天杀?. 门户|站不是像 yahoo, pchome, yam {等。不q? 我们现在讨论?portal server, 不是那么地简? 基本?yahoo, pchome, yam 那些只能UCؓ搜烦引擎的门L站?
如果你从来沒有用q?portal server 或是似懂非懂.. 大家可以q结?MyNetscape ?MyYahoo ?注册一个帐受因?MyNetscape 的样式比较好? 所以我接下来就?MyNetscape Zl的范例?
如果你第一ơ接触到 portalQ你会惊讶的发现... ?. Z一个网站里面充满了q么多小H口. 我们U这些小H口叫做 "portlet"Q而且每个窗口都存在着独立的信息与内容Q可以放到最大化Q羃,q原Q关闭等{。当你登陆之后,可以选择及调整自?portlet 的配|,也可以设|自己喜q风格与样式,更可以设|每?portlet 的资料配|。这U以客户Z帝的pȝQ就是我们将要介l的 portal?
Portal 的组成可以分Z部䆾 (1) Portal Server (2) Portlet Container (3) Portlet
... +--javax.servlet.http.HttpServlet | +--org.apache.jetspeed.portlet.Portlet | +--org.apache.jetspeed.portlet.PortletAdapter | +--com.myCompany.myApplication.myPortlet
因此QPortlet是一cȝD的ServletQ能方便的插入Portal ServerQƈ在其上运行。与 servlet 不同Qportlet 无法直接发送重定向或错误信息到览器,以及转发h或者写专用标记到输出流?/p>
?servlet 相比QPortlet有更强的动态性,可在不重新启?Portal Server 的情况下q行更新Q?/p>
Portlet容器依赖于J2EE体系l构。Portlet 被打包成cM于J2EE Web应用的WAR文gQƈ按类g servlet 的方式部|Ӏ与其它 servlet 怼Q?servlet 部v描述W(web.xmlQ把 portlet 定义到应用程序服务器Q这个文件定?portlet 的类文g和只d始化参数。除此之外,portletq必L供一个portlet的部|描q符Qportlet.xmlQ来把portlet定义到portal server
JSR 是由 JCP ( www.jcp.org ) q个 Java l织所定义出来的规范。几乎每?JSR 都会产出 TCK* ?RI**
*TCK ( Technology Compatibility Kit ) 兼容性测试组?br />*RI ( Reference Implementation ) 实现参?
2003/10/27 JSR#168 Portlet Spec 1.0 已经正式公布。以? 大家可以开始根据这个规范开发兼Ҏ的产品。而这个标准规范书?RI 是采用 Apache Jakarta Pluto 冥王星计划。至于ؓ何叫做冥王星,我猜?Sun 惌把光芒射到冥王星都会发光?:P
目前 pluto 未有正式的版本释放, 来有兴的人可以从 jakarta |站下蝲。不q目前我?CVS 取得版本已经可以正常q行了。安装的Ҏ十分?. 只需要执?%pluto%/bin/install 可以安装了Q安装过E会询问?tomcat 的目录,假设?tomcat 根目录是 c:\tomcat4.1.27 Q你输入 c:\tomcat4.1.27 可以了?
接着 http://localhost:8080/pluto/portal 可以看到很漂亮?portal 界面Q至于操作模式与Ҏ非常单,请多加操控就可以慢慢了解 portlet 的控制方法了?
?portlet spec 中定义的控制有分?
1) 基本?Portlet Modes
VIEW - 你没有做M动作仅仅做内ҎC?br />EDIT - ~辑相关的设|?br />HELP - L帮助
2) 基本?Window States
NORMAL - q原 portlet H口
MAXIMIZED - 最大化 portlet H口
MINMIZED - 最化 portlet H口
其实, q些动作都已l由 portal 所实现Qportlet container 接收与回应相关的动作。真正在E序开发上q不会考虑到这些细节,除非你要做一?portlet container。而开发上要考虑的是什么h能夠做什么事情。例如说未登陆的h应该只能?doView / doHelpQ而不能夠 doEdit q种权限控机制的开发?
因此 css 的定义对于具有定制功能的 portal 是相当重要的?
主要包括QPlutoQLiferayQeXo,Jetspeed四种开源Portal的介l和分析Q有助于对具体项目选择合适的开发^台?
Q?Q?font color="#421ae6">Pluto
2003q?0月JSR168规范1.0正式公布后,Jakarta Apache开始实施Pluto计划Q冥王星计划Q,最l开发出该规范的一个参考实玎ͼReference ImplementationQ,即Pluto。Pluto?.0.1-rc2版与2004q?2月发布?br />Pluto实现Z JSR168的一?Portlet ContainerQ相当于为开发者提供了一个运行portlets的工作^台。Pluto本n也提供了一个简单的Portal模块Q该模块仅仅是ؓ了满Portlet容器和JSR 168的需要而写的,因而显得非常简单,提供的实用的Portlet也非常少。从某种意义上说Pluto更像是一个Portlet ContainerQ作Z个实用的Portal开发框架尚需要更强大的支持。但新版本的Pluto仍没有推出。对于Pluto的应用开发,Apache更推荐用Jetspeed目框架?br />管Pluto作ؓ一个完整的Portal应用q非常欠~。但不少有媄响力的Portal目使用Pluto作ؓPortlet Container。这些项目包括:Jetspeed 、Cocoon uPortal 、Jahia{。由此可见Pluto的重要性。从开发者和学习者的角度看,Pluto的意义还在于为开发者和学习者提供了一个深入了解Portlet Container的简z的参考实例?
Q?Q?font color="#421ae6">Liferay
LiferayQ支持JSR168Q代表了完整的J2EE应用 Q最高版本是2005q?月推出的Professional 3.2.0。它的主要优ҎQ?br /> Q?Q用第三放的开源项目,如Hibernate{。特别是前台界面部分使用了Struts技术;
Q?Q支持包括中文在内的多种语言Q?br /> Q?Q支持较多的先进技术,如Web Services、EJB, JMS, SOAP, XML{;
Liferay的缺Ҏ它缺乏一个简单清晰可拓展的架构设计,整个架构比较复杂且庞大;Struts1.1本nq不支持JSR168Q所以Liferay在实现诸如上下文׃n{问题上昑־十分W重且没有从Ҏ上解册些问题;portlet设计也显得比较凌乱。此外,如果你的门户pȝ准备应用于商业用途,你需要购买License。基于它q行二次开发比较困难?br />
Q?Q?font color="#421ae6">eXo
eXo(支持JSR168)ZJSF的Portal实现。最新版本是2004q?0月发布的1.0RC1版?br />主要优点包括Q?br />Q?Q?#160;由AOPQAspectJQ实现的内容理pȝQ极大提高了内容理性能Q?br />Q?Q?#160;ZPico Container的Portlet ContainerQPico是一个著名的IoC3轻量U容器。同时也实现了上下文׃nQ二ơ开发的程比较清晰Q?br />Q?Q?#160;使用Struts框架技术;
Q?Q?#160;提供工作技术服务(Workflow serviceQ?br />Q?Q?#160;提供了很多交工P通过XML可以为结构化的信息轻易地创徏视图Q?br /> ׃可见eXo采用了诸多先q技术,但存在不缺炏V主要缺点:׃Portal Server本n的数据是使用xmldb来进行处理,保存到数据库的数据都是ؕ码而且它所有默认的q_字符集都是ISO-8859_1。缺乏中文的充分支持Q对于中文门L开发ƈ没有优势Q由于JSF是重量的表现层框架Q得exo的二ơ开发工作量比较大;对于商业Portal应用开发需要购买License。M开发难度较大?
(4) JetSpeed
JetSpeed是Apachel织的开源Portal目。Jetspeed 目前有两个版本可供选择1.X?.0版本。Jetspeed1.X出现得比较早Q但W一个较为成熟的版本发布?.4。此?.X不断推出新版本。但Jetspeed1.X都不支持JSR168。当JSR168?003q发布后QApche开始开发Jetspeed2Q提供对JSR168 的全面支持?
下表是Jetspeed重要版本的发布日期:
Jetspeed的重要版?#160; 发布日期
Jetspeed-1.4b2 2002q?2?br />Jetspeed-1.5 2004q??br />Jetspeed-2.0-M1 2004q?2?br />Jetspeed-2.0-M2 2005q??br />Jetspeed1.XZTurbine框架开发,它提供了丰富的Portal技术功能。主要优ҎQXML文g注册PortletQ便于管理;囑Ş化的部v和卸载;对中文的良好支持{。值得注意的是IBM早期的WebSphere Portal Server是在JetSpeed1.X上进行二ơ开发的。Jetspeed2.0?.X基础上进行了较大的改动,功能更加丰富Q完全遵循JSR标准?
配置ҎQ不同的版本的配|可能有变化Q如不成功,可以自行察看文档?
Pulto在Tomcat下的安装配置ҎQ?br />Q?Q?#160;?
下蝲最新的二进制版本安装文?/font>
Q?Q?#160;执行%pluto%/bin/installQ将它安装到Tomcat目录下即?br />Q?Q?#160;在浏览器中输入:
Q运行Pluto
http://localhost:8080/pluto/portal
http://portals.apache.org/pluto/mirrors.cgi
Liferay Professional在Tomcat下的安装配置ҎQ?br />Q?Q?#160;? 下蝲Liferay Professional安装文g Q?br />Q?Q?#160;解压ZIP包到某个目录?br />Q?Q?#160;若下载Tomcat版本的Liferay安装文gQ则不需再装TomcatQ直接启动bin目录下的startup.bat文g?br />Q?Q?#160;在浏览器中输?/font> q行Liferay Professional?/font> http://localhost/ http://www.liferay.com/downloads/index.jsp
eXo Platform在Tomcat下的安装配置ҎQ?br />Q?Q?#160;? 下蝲eXo Platform的安装包 ?br />Q?Q?#160;解压ZIP包到某个目录?br />Q?Q?#160;若下载Tomcat版本的eXo安装文gQ则不需再装TomcatQ直接启动bin目录下的startup.bat文g?br />Q?Q?#160; 在浏览器中输?/font> q行eXo Platform. http://localhost/ http://www.exoplatform.com/portal/faces/public/exo
Jetspeed2在Tomcat下的安装配置ҎQ?br />Q?Q?#160;? 下蝲Jetspeed2 M1或M2版本安装?/font> ?br />Q?Q?#160;若是安装包中已经捆绑TomcatQ解压即可。若安装包不含TomcatQ先安装TomcatQ然后将安装包解压到Tomcat目录Qƈ覆盖相关文g卛_?br />Q?Q?#160;安装要注意的问题有:Jetspeed2M1版本׃Bug无法安装Tomcat5.5上(此BUG?/font> Q;Jetspeed2必须安装在Tomcat5.0.28以上版本上,否则低版本由于JAAS问题无法登陆 Q?br />Q?Q?#160;启动jetspeed-database目录下的start-database.batQ启动数据库Q?br />Q?Q?#160;启动TomcatQ?br />Q?Q?#160;在浏览器中输?/font> q行JetspeedQ?/font> http://localhost:8080/jetspeed/portal http://issues.apache.org/jira/browse/JS2-187 http://www.apache.org/dist/portals/jetspeed-2/
目前比较L的Portal产品Q?br />Apache JetspeedQhttp://jakarta.apache.org/jetspeed/Q?br />LiferayQhttp://www.liferay.comQ?br />EXOportalQhttp://cvs.sf.net/viewcvs.py/exo/ExoPortal/Q?br />PlutoQhttp://jakarta.apache.org/plutoQ?br />BEA WebLogic Portal Qhttp://edocs.bea.com/wlp/docs81/javadoc/com/bea/portal/model/Portlet.html Q?br />IBM Websphere Portal Qhttp://www.software.ibm.com/wsdd/zones/portal/ Q?br />Oracle Portal Developer Kit Qhttp://portalstudio.oracle.com/Q?
jfoxportalQhttp://www.huihoo.org/jfox/jfoxportal/index.html 刚提案,不过是国内的。)
说PortalQ就不能不提JSR#168 Portlet?br />
JSR 是由 JCP (
http://www.jcp.org/
) q个
Java
l织所定义出来的规范。JSR#168规范是一个关于Portlet的规?——Portlet Spec 1.0 。既然有了规范,理所当然的之后的产品应该按照这个规范来制作?br />
JSR168的目标是Q?span lang="EN-US">
定义portlet的运行时环境Q即portlet容器
定义portlet?span lang="EN-US">portlet容器之间?span lang="EN-US">api?span lang="EN-US">
提供portlet存储易失数据和持久数据的机制
提供portlet包含servlet?span lang="EN-US">jsp的机?span lang="EN-US">
定义方便部v?span lang="EN-US">portlet打包Ҏ
提供jsr168规范下的portal的二q制portlet便携?span lang="EN-US">
通过WSRPQ?span lang="EN-US">web service for remote portletQ协议运行符?span lang="EN-US">jsr168规范的远E?span lang="EN-US">portlet
IT
界已l广泛的接受?span lang="EN-US">jsr168规范。所有的portal领域主要公司都是jsr168专家l的成员Q?span lang="EN-US">Apache,AGT,BEA,Boeing,Borland,Broadvision,Citrix,EDS, Fujitsu, Hitachi, IBM, Novell, Oracle, SAP, SAS Institute, Sun Microsystems, Sybase, TIBCO, and Vignette。官Ҏ持列表甚xѝ?br />
客户端请求由
Portal Web
应用E序q行处理Q它为当前用h索当前页上的
Portlet
。然后,
Portal Web
应用E序为每?/span>
Portlet
调用
Portlet
容器来通过
Container Invoker API
索它的内宏V?/span>
Portlet
容器通过
Portlet API
调用
Portlet
?/span>
Container Provider Service Provider Interface
Q?/span>
SPI
Q允?/span>
portlet
容器通过
Portal
索信息?/span>
Portlet
H口包括Q?/span>
l 标题栏,带有 Portlet 的标?/span>
l 修饰Q包括用于更?/span> Portlet 的窗口状态的按钮Q比如最大化或最化 Portlet Q和用于更改 Portlet 的模式的按钮Q比如显C帮助或~辑预定义的 Portlet 讄Q?/span>
l
?/span>
Portlet
产生的内容(也称Z个标记段Q?/span>
下面是典型的事g程Q当用户讉K portal 面的时候:
<!--[if !supportLists]-->² <!--[endif]-->客户端在验证后向portal?/span>httph?/span>
<!--[if !supportLists]-->² <!--[endif]-->portal接收h?/span>
<!--[if !supportLists]-->² <!--[endif]-->portal判断是否有包含请求,q请求包含的动作指向?/span>portlet是和q个portal面相关联的?/span>
<!--[if !supportLists]-->² <!--[endif]-->如果含有动作的目?/span>portletQ?/span>portal发请求给portlet容器L行相应的portlet的动作?/span>
<!--[if !supportLists]-->² <!--[endif]-->portal通过portlet容器调用portletsQ去获得内容片断Q这个片断可以包含在portal面中?/span>
<!--[if !supportLists]-->² <!--[endif]-->portal集合portlets的输出内容到1?/span>portal面中,q把面q回客户端?/span>
Portlet 产生标记片断?/span> Portal 通常l?/span> portlet 产生的标记片断加了标题,控制按钮和其他的装饰Q这个新的片断叫 portlet H口。然?/span> portal 整合 portlet H口到完整的文gQ?/span> portal 面?/span>
<!--[endif]-->
Portlets q行?/span> portlet 容器内?/span> Portlet 容器接收 portlets 产生的内宏V典型的Q?/span> portlet 容器?/span> portlet 内容传到 portal ?/span> Portal server Ҏ portlet 产生的内容创?/span> portal 面Qƈ传送给客户端,由客L昄?/span>
<!--[endif]-->
客户使用客户l端讉K portal 。在收到h后, portal 判断满h?/span> portlets 列表?/span> Portal 通过 portlet 容器Q调?/span> portlets ?/span> Portal ?/span> portlet 产生的片断创?/span> portal 面Q同时把面q回l用戗?/span>
<!--[endif]-->
用户可以Ҏ需要通过增删 Portlet 的方式配|他们的面。在 Windows 或?/span> XWindows H口E序中,H口有最大化和最化的窗口状态, portlet 也有H口状态?/span> H口状态是 portal 面I间数量的指C器Q它被赋值给 portlet 产生的内容中。当调用 portlet Q容器提供当前窗口状态给 portlet ?/span> Portlet 使用H口状态决定多信息需?/span> render ?/span> Portlets 能在处理 action hӞ~程的改变他们的H口状态?/span> Portlet 规范定义?/span> 3 U窗口状态, normal Q?/span> maximized ?/span> minimized ?/span>
Normal
H口状?/span>
Normal H口状态表C?/span> portlet 要和其他?/span> portlet ׃n面。它也表C目标设备限制了昄能力。因此, portlet 限制输出的尺寸?/span>
MAXIMIZED
H口状?/span>
Maximized H口状态表C?/span> portlet ?/span> portal 面唯一?/span> portlet Q或 portlet 相比与其他的 portlet 有更多的I间。当H口状态是 Maximized Ӟ portlet 产生更多的内宏V?/span>
Minimized
H口状?/span>
?/span> portlet ?/span> minimized 状态,它将是最限度的输出Q或不输出?/span>
Portlet 模式指出 porlet 的功能。一般来_ portlet 执行不同dQ依靠当前执行的d的创Z同内宏V?/span> Portlet 模式告诉 portlet 他们执行什么Q务,生什么内宏V当调用 portlet Q容器提供当?/span> portlet 模式l?/span> portlet ?/span> Portlets 在处?/span> action h时能~程的改变他们的 portlet 模式?/span>
Portlet 有四U模式: view Q?/span> edit, help ?/span> config ?/span>
可用的模式根据用L角色受到限制。例如,匿名用户只能使用 view ?/span> help 模式Q而验证用户可以?/span> edit 模式?/span>
举例来说Q一个用户可以定制的股票信息PortletQ?span lang="EN-US">View模式允许用户查看股票列表Q?span lang="EN-US">Help模式提供l用户帮助手册,Edit模式允许用户定制自己x的股列表,?span lang="EN-US">Config模式允许理员改变股服务的一些配|?span lang="EN-US">
VIEW
模式
View
模式期待的功能是产生标记反映当前的状态给portlet。例如,view模式?span lang="EN-US">portlet包含1个或多个框,用户可以操作或交互,或组成不需要Q何用户交互的的静态内宏V?span lang="EN-US">
Portlet
开发者需要通过覆盖doViewҎ实现view portlet模式的功能?span lang="EN-US">
EDIT
模式
通过edit模式Q?span lang="EN-US">portlet提供内容?span lang="EN-US">logic让用L户化portlet的行为?span lang="EN-US">Edit模式包含一个或多个框,用户可以定位q输入他们的用户化数据?/span>
典型的,edit模式Q将讄或修?span lang="EN-US">portlet的参数?span lang="EN-US">Portlet开发者需要通过覆盖doEditҎ实现edit portlet模式的功能?span lang="EN-US">
HELP
模式
当在help模式Q?span lang="EN-US">portlet提供portlet?span lang="EN-US">help信息。这?span lang="EN-US">help信息会是简单的框,用连贯的正文或上下文敏感的帮助阐明了整个portlet?span lang="EN-US">Portlet开发者需要通过覆盖doHelpҎ实现help portlet模式的功?span lang="EN-US">
CONFIG
模式
当在config模式Q管理员可以q行相应的操作?/span>
Portlet开发者需要通过覆盖doConfigҎ实现view portlet模式的功能?/p>
因ؓPortletl承?span lang="EN-US">Servlet,所?span lang="EN-US">portlet
Portal
一词最早是指门L站。简单讲
Portal
是一个重要的
Web
站点Q是一个联合的CQ?/span>
?/span>
作ؓ
Web
应用E序?/span>
?/span>
l一的访问点和信息系l的展现层,通过个性化“我的主页Q?/span>
My Home Pages
Q?#8221;Z同用h供个性化、统一d和内Ҏ合的服务。此?/span>
Portal
q提供了许多有h值的附加功能Q如安全性、搜索、协作和工作等。对最l用戯言Q?/span>
Portal
是一个到所有计资源的单独讉K炏V业界认?/span>
Portal
会成ؓ下一代的桌面Q在
Web
上ؓ各种客户备提供大量的电子商务应用?/span>
2.
发展历程
最初的
Portal
指的是像
Yahoo
?/span>
Sina
q样?/span>
Internet
门户|站。这些门L站ؓ用户提供了检索、分cdcM
“
My Yahoo!
”
的个性化定制服务Q目的是帮助用户更快地找到自己所需要的信息。这L
Portal
被称?/span>
Public Portal
Q即面向公众的信息门戗?/span>
随着
Web
应用的发展,又出C
Vertical Portal
?/span>
Enterprise Information Portal
?/span>
Vertical Portal
卌业门P目的是帮助某一行业的商业h员和技术h员找到自已需要的特定行业的商业信息和技术信息?/span>
Enterprise Information Portal
Q?/span>
EIP
Q?/span>
即企业信息门戗目的是帮助企业用户及员工通过l一入口扑ֈ分布于企业的各种信息。与
Public Portal
怼Q?/span>
Vertical Portal
?/span>
EIP
也同h供了索、分cd个性化定制服务?/span>
在以上三U?/span> Portal 中, EIP 包含的内Ҏ多,因此Q?/span> Portal 的发展过E也?/span> EIP 中得C最充分的体现。在 EIP 发展的最初阶D, Portal 实际上就是一些静态网,用户通过它获得企业提供的信息及服务。随着信息量的增加Q逐渐增加了搜索功能和内容发布功能Qƈ一定程度上实现了内容管理( Content Management Q;融入了工作流Q渠道(包括 Email Q的功能Q集成了更多应用Q如 ERP Q?/span> CRM Q?/span> SCM {;增加?/span> Web Services 引擎。下面ؓ Portal 在企业应用里的结构图 ( 摘自?/span> WebLogic Portal 8.1 相关资料 ) Q?/span>
图: Portal 在企业信息化中扮演的角色
3.
现状
Portal
技术与应用服务器紧密结合,加强了高U的个性化功能Q发展成为应用服务器之上的管理客戗员工和合作伙伴应用的一个框架?/span>
Portal
作ؓ应用服务器之上的面向企业应用集成的品里的必不可的l成部分Q在企业信息化方面扮演着重要的角艌Ӏ各大应用服务器厂商也纷UhZ自己?/span>
Portal
产品Q比较著名的?/span>
IBM WebSphere Portal Server
Q?/span>
BEA WebLogic Portal
Q?/span>
Sun Portal Server
Q同时也有同cd源品,?/span>
Apache JetSpeed
Q?/span>
Liferay
{?/span>
4.
势
著名咨询公司 Gartner 不久?/span> 提出了应用^台套?/span> (Application Platform Suites Q简U?/span> APS) 的概c根?/span> Gartner 的定义, APS ׃批基软gl装而成Q这些基软g提供了创Z业应用所需的架构,臛_必须包括应用服务器?/span> Portal 产品和企业应用集成包{?/span> IDC 通过对众多企业信息主的调查发现Q他们最兛_的问题是如何实现企业应用的整合,以及如何构徏l一的企业信息门户^台等。厂商对企业用户的这些需求,仅仅提供一个应用服务器是远q不够的Q而需要提供一整套能够使企业有效和灉|地徏立信息系l的工具和Y件^収ͼ把应用开发^台和应用集成q_有机地结合v来?/span>
ȝ来看Q?/span> Portal 作ؓ未来企业信息用户q_的一个重要组Ӟ随着应用服务器的发展Q也得到长的发展和进步?/span>