??xml version="1.0" encoding="utf-8" standalone="yes"?>
// 初始?/font>
// 初始化portlets.
// 初始化display.
// 初始化layout模板.
// 初始化Theme.
// (g)查company
// 其它内容...
// 响应服务
// Portlet Request Processor - 在struts.config中定?
// d处理.
// 处理service前置事g.
// 调用Struts的serviceҎ(gu).
// 处理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
。ؓ(f)
Portlet
接口部分Q在新编?/span>
Portlet
时均需要直接实现此接口或承已实现此接口的
Portlet
c?/span>
(
?/span>
GenericPortlet)
Q此接口控制?/span>
Portlet
的整?/span>
Lifecycle
Q根?/span>
JSR168
规范Q将
Portlet
?/span>
Lifecycle
划分Z(jin)三个阶段Q?/span>
(1) init
。初始化?/span>
Portlet
Q在一?/span>
Lifecycle
?/span>
Portlet
只可初始化一ơ。通过传入?/span>
PortletConfig
可获?/span>
PortletContext
?/span>
(2) handlerRequest
。在此阶D规范将其分Z(jin)
processAction
以及(qing)
render
两种概念Q?/span>
processAction
表示?/span>
Portlet
与用L(fng)交互q程的处理;
render
则主要控制了(jin)
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提供了(jin)交互相关的设|?/span>
PortletMode
以及(qing)?/span>
WindowState
的方法?/span>
8Q?span style="FONT: 7pt 'Times New Roman'">
RenderResponse
。此接口l承?/span>
PortletResponse
Q提供了(jin)完全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不代表要替代用于保存(sh)性化定制信息的数据库Q可用于保存?sh)些数据量不大情况下的Ҏ(gu)偏好?/span>
14Q?span style="FONT: 7pt 'Times New Roman'">
PreferenceValidator
。此接口用于(g)?/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一定义?jin)可?/span> Portal 容器识别和调用的Ҏ(gu)Q包括:(x)
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 行ؓ(f)分发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 三个Ҏ(gu)分别被调用,用以生成 Portlet 标记。同样也可以调用 Servlet 生成 Portlet 标记Q或者不调用 JSP 或?/span> Servlet Q直接在Ҏ(gu)中得?/span> PrintWriter 然后用最单的 pw.println() 打印出内宏V这个过E类?/span> Servlet Q如下:(x)
PrintWriter pw = renderResponse.getWriter();
pw.println(“Hello Q?/span> world!”);
?/span> cMQ可以?/span> 得到配置文g?/span> 的初始|只不q?/span> ?/span> 中,?/span> ?/span> 中?br />portlet.xmlQ?/span>
<init-param>
<value>
</init-param>
针对如上portlet.xml中的初始化信息,可以采用如下的调用方式:(x)
SimplePortlet.java Q?/span>
String jspName = getPortletConfig().getInitParameter("jspView");
许多大型企业的网? 渐渐采用?portal server 作ؓ(f)开发的基础. 至于什么是 portal ? 中文译?"门户|站"?有h可能?. 天杀?. 门户|站不是像 yahoo, pchome, yam {等。不q? 我们现在讨论?portal server, 不是那么地简? 基本?yahoo, pchome, yam 那些只能UCؓ(f)搜烦(ch)引擎的门L(fng)站?
如果你从来沒有用q?portal server 或是似懂非懂.. 大家可以q结?MyNetscape ?MyYahoo ?注册一个帐受因?MyNetscape 的样式比较好? 所以我接下来就?MyNetscape Zl的范例?
如果你第一ơ接触到 portalQ你?x)惊讶的发?.. ?. Z一个网站里面充满了(jin)q么多小H口. 我们U这些小H口叫做 "portlet"Q而且每个窗口都存在着独立的信息与内容Q可以放到最大化Q羃?yu),q原Q关闭等{。当你登陆之后,可以选择?qing)调整自?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 无法直接发送重定向或错误信息到览器,以及(qing)转发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 都会(x)产出 TCK* ?RI**
*TCK ( Technology Compatibility Kit ) 兼容性测试组?br />*RI ( Reference Implementation ) 实现参?
2003/10/27 JSR#168 Portlet Spec 1.0 已经正式公布。以? 大家可以开始根据这个规范开发兼Ҏ(gu)的产品。而这个标准规范书?RI 是采用 Apache Jakarta Pluto 冥王星计划。至于ؓ(f)何叫做冥王星,我猜?Sun 惌把光芒射到冥王星都会(x)发光?:P
目前 pluto 未有正式的版本释放, 来有兴的人可以从 jakarta |站下蝲。不q目前我?CVS 取得版本已经可以正常q行?jin)。安装的Ҏ(gu)十分?. 只需要执?%pluto%/bin/install 可以安装了(jin)Q安装过E会(x)询问?tomcat 的目录,假设?tomcat 根目录是 c:\tomcat4.1.27 Q你输入 c:\tomcat4.1.27 可以了(jin)?
接着 http://localhost:8080/pluto/portal 可以看到很漂亮?portal 界面Q至于操作模式与Ҏ(gu)非常单,请多加操控就可以慢慢?jin)?portlet 的控制方法了(jin)?
?portlet spec 中定义的控制有分?
1) 基本?Portlet Modes
VIEW - 你没有做M动作仅仅做内Ҏ(gu)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不?x)考虑到这些细节,除非你要做一?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相当于为开发者提供了(jin)一个运行portlets的工作^台。Pluto本n也提供了(jin)一个简单的Portal模块Q该模块仅仅是ؓ(f)?jin)满Portlet容器和JSR 168的需要而写的,因而显得非常简单,提供的实用的Portlet也非常少。从某种意义上说Pluto更像是一个Portlet ContainerQ作Z个实用的Portal开发框架尚需要更强大的支持。但新版本的Pluto仍没有推出。对于Pluto的应用开发,Apache更推荐用Jetspeed目框架?br />管Pluto作ؓ(f)一个完整的Portal应用q非常欠~。但不少有媄(jing)响力的Portal目使用Pluto作ؓ(f)Portlet Container。这些项目包括:(x)Jetspeed 、Cocoon uPortal 、Jahia{。由此可见Pluto的重要性。从开发者和学习(fn)者的角度看,Pluto的意义还在于为开发者和学习(fn)者提供了(jin)一个深入了(jin)解Portlet Container的简z的参考实例?
Q?Q?font color="#421ae6">Liferay
LiferayQ支持JSR168Q代表了(jin)完整的J2EE应用 Q最高版本是2005q?月推出的Professional 3.2.0。它的主要优Ҏ(gu)Q?br /> Q?Q用第三放的开源项目,如Hibernate{。特别是前台界面部分使用?jin)Struts技术;
Q?Q支持包括中文在内的多种语言Q?br /> Q?Q支持较多的先进技术,如Web Services、EJB, JMS, SOAP, XML{;
Liferay的缺Ҏ(gu)它缺乏一个简单清晰可拓展的架构设计,整个架构比较复杂且庞大;Struts1.1本nq不支持JSR168Q所以Liferay在实现诸如上下文׃n{问题(sh)昑־十分W重且没有从Ҏ(gu)上解册些问题;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极大提高(sh)(jin)内容理性能Q?br />Q?Q?#160;ZPico Container的Portlet ContainerQPico是一个著名的IoC3轻量U容器。同时也实现?jin)上下文׃nQ二ơ开发的程比较清晰Q?br />Q?Q?#160;使用Struts框架技术;
Q?Q?#160;提供工作技术服务(Workflow serviceQ?br />Q?Q?#160;提供?jin)很多交工P通过XML可以为结构化的信息轻易地创徏视图Q?br /> ׃可见eXo采用?jin)诸多先q技术,但存在不缺炏V主要缺点:(x)׃Portal Server本n的数据是使用xmldb来进行处理,保存到数据库的数据都是ؕ码而且它所有默认的q_字符集都是ISO-8859_1。缺乏中文的充分支持Q对于中文门L(fng)开发ƈ没有优势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重要版本的发布日期:(x)
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框架开发,它提供了(jin)丰富的Portal技术功能。主要优Ҏ(gu)QXML文g注册PortletQ便于管理;囑Ş化的部v和卸载;对中文的良好支持{。值得注意的是IBM早期的WebSphere Portal Server是在JetSpeed1.X上进行二ơ开发的。Jetspeed2.0?.X基础上进行了(jin)较大的改动,功能更加丰富Q完全遵循JSR标准?
配置Ҏ(gu)Q不同的版本的配|可能有变化Q如不成功,可以自行察看文档?
Pulto在Tomcat下的安装配置Ҏ(gu)Q?br />Q?Q?#160;?
下蝲最新的二进制版本安装文?/font>
Q?Q?#160;执行%pluto%/bin/installQ将它安装到Tomcat目录下即?br />Q?Q?#160;在浏览器中输入:(x)
Q运行Pluto
http://localhost:8080/pluto/portal
http://portals.apache.org/pluto/mirrors.cgi
Liferay Professional在Tomcat下的安装配置Ҏ(gu)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下的安装配置Ҏ(gu)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下的安装配置Ҏ(gu)Q?br />Q?Q?#160;? 下蝲Jetspeed2 M1或M2版本安装?/font> ?br />Q?Q?#160;若是安装包中已经捆绑TomcatQ解压即可。若安装包不含TomcatQ先安装TomcatQ然后将安装包解压到Tomcat目录Qƈ覆盖相关文g卛_?br />Q?Q?#160;安装要注意的问题有:(x)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 刚提?gu)案,不过是国内的。)(j)
说PortalQ就不能不提JSR#168 Portlet?br />
JSR 是由 JCP (
http://www.jcp.org/
) q个
Java
l织所定义出来的规范。JSR#168规范?yu)是一个关于Portlet的规?——Portlet Spec 1.0 。既然有?jin)规范,理所当然的之后的产品应该按照这个规范来制作?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打包Ҏ(gu)
提供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。官Ҏ(gu)持列表甚x(chng)ѝ?br />
客户端请求由
Portal Web
应用E序q行处理Q它为当前用h索当前页上的
Portlet
。然后,
Portal Web
应用E序为每?/span>
Portlet
调用
Portlet
容器来通过
Container Invoker API
(g)索它的内宏V?/span>
Portlet
容器通过
Portlet API
调用
Portlet
?/span>
Container Provider Service Provider Interface
Q?/span>
SPI
Q允?/span>
portlet
容器通过
Portal
(g)索信息?/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>
portal
<!--[if !supportLists]-->² <!--[endif]-->portalhttp<!--[if !supportLists]-->² <!--[endif]-->portal<!--[if !supportLists]-->² <!--[endif]-->portalportletportal<!--[if !supportLists]-->² <!--[endif]-->portletportalportletportlet<!--[if !supportLists]-->² <!--[endif]-->portalportletportletsportal<!--[if !supportLists]-->² <!--[endif]-->portalportlets1portal
Portlet
Portal
portlet
portlet
portal
portlet
portal
<!--[endif]-->
Portlets
portlet
Portlet
portlets
portlet
portlet
portal
Portal server
portlet
portal
<!--[endif]-->
portal
portal
portlets
Portal
portlet
portlets
Portal
portlet
portal
<!--[endif]-->
Portlet
Windows
XWindows
portlet
H口状态是
portal
portlet
portlet
portlet
Portlet
render
Portlets
action
Portlet
3
normal
maximized
minimized
Normal
Normal
portlet
portlet
portlet
MAXIMIZED
Maximized
portlet
portal
portlet
portlet
portlet
Maximized
portlet
Minimized
portlet
minimized
Portlet
porlet
portlet
Portlet
portlet
portlet
portlet
portlet
Portlets
action
portlet
Portlet
view
edit, help
config
view
help
edit
举例来说Q一个用户可以定制的股票信息PortletQ?span lang="EN-US">View模式允许用户查看股票列表Q?span lang="EN-US">Help模式提供l用户帮助手册,Edit模式允许用户定制自己x(chng)的股列表,?span lang="EN-US">Config模式允许理员改变股服务的一些配|?span lang="EN-US">
VIEW
模式期待的功能是产生标记反映当前的状态给portlet。例如,view模式?span lang="EN-US">portlet包含1个或多个框,用户可以操作或交互,或组成不需要Q何用户交互的的静(rn)态内宏V?span lang="EN-US">
开发者需要通过覆盖doViewҎ(gu)实现view portlet模式的功能?span lang="EN-US">
EDIT
edit模式Q?span lang="EN-US">portlet提供内容?span lang="EN-US">logic让用L(fng)户化portlet的行为?span lang="EN-US">Edit模式包含一个或多个框,用户可以定位q输入他们的用户化数据?/span>
edit模式Q将讄或修?span lang="EN-US">portlet的参数?span lang="EN-US">Portlet开发者需要通过覆盖doEditҎ(gu)实现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信息会(x)是简单的框,用连贯的正文或上下文敏感的帮助阐明了(jin)整个portlet?span lang="EN-US">Portlet开发者需要通过覆盖doHelpҎ(gu)实现help portlet模式的功?span lang="EN-US">
CONFIG
当在config模式Q管理员可以q行相应的操作?/span>
Portlet开发者需要通过覆盖doConfigҎ(gu)实现view portlet模式的功能?/p>
因ؓ(f)Portletl承?span lang="EN-US">Servlet,所?span lang="EN-US">portlet
一词最早是指门L(fng)站。简单讲
是一个重要的
站点Q是一个联合的CQ?/span>
?/span>
作ؓ(f)
Web
应用E序?/span>
?/span>
l一的访问点和信息系l的展现层,通过个性化“我的主页Q?/span>
Q?#8221;Z同用h供个性化、统一d和内Ҏ(gu)合的服务。此?/span>
Portal
q提供了(jin)许多有h(hun)值的附加功能Q如安全性、搜索、协作和工作等。对最l用戯(g)言Q?/span>
是一个到所有计资源的单独讉K炏V业界认?/span>
Portal
会(x)成ؓ(f)下一代的桌面Q在
Web
上ؓ(f)各种客户备提供大量的?sh)子商务应用?/span>
2.
发展历程
最初的
Portal
指的是像
Yahoo
?/span>
Sina
q样?/span>
Internet
门户|站。这些门L(fng)站ؓ(f)用户提供?jin)检索、分cdcM
“
My Yahoo!
”
的个性化定制服务Q目的是帮助用户更快地找到自己所需要的信息。这L(fng)
Portal
被称?/span>
Public Portal
Q即面向公众的信息门戗?/span>
随着
Web
应用的发展,又出C(jin)
Vertical Portal
?/span>
Enterprise Information Portal
?/span>
Vertical Portal
卌业门P目的是帮助某一行业的商业h员和技术h员找到自已需要的特定行业的商业信息和技术信息?/span>
Enterprise Information Portal
Q?/span>
EIP
Q?/span>
即企业信息门戗目的是帮助企业用户?qing)员工通过l一入口扑ֈ分布于企业的各种信息。与
Public Portal
怼Q?/span>
Vertical Portal
?/span>
EIP
也同h供了(jin)(g)索、分cd个性化定制服务?/span>
在以上三U?/span>
中,
包含的内Ҏ(gu)多,因此Q?/span>
的发展过E也?/span>
中得C(jin)最充分的体现。在
发展的最初阶D,
实际上就是一些静(rn)态网,用户通过它获得企业提供的信息?qing)服务。随着信息量的增加Q逐渐增加?jin)搜索功能和内容发布功能Qƈ一定程度上实现?jin)内容管理?/span>
Q;融入?jin)工作流Q渠道(包括
Q的功能Q集成了(jin)更多应用Q如
Q?/span>
Q?/span>
{;增加?/span>
引擎。下面ؓ(f)
在企业应用里的结构图
摘自?/span>
相关资料
Q?/span>
图:(x)
Portal
在企业信息化中扮演的角色
3.
现状
技术与应用服务器紧密结合,加强?jin)高U的个性化功能Q发展成为应用服务器之上的管理客戗员工和合作伙伴应用的一个框架?/span>
作ؓ(f)应用服务器之上的面向企业应用集成的品里的必不可的l成部分Q在企业信息化方面扮演着重要的角艌Ӏ各大应用服务器厂商也纷UhZ(jin)自己?/span>
产品Q比较著名的?/span>
Q?/span>
Q?/span>
Q同时也有同cd源品,?/span>
Q?/span>
{?/span>
4.
势
著名咨询公司 Gartner 不久?/span> 提出?jin)应用^台套?/span> (Application Platform Suites Q简U?/span> APS) 的概c(din)根?/span> Gartner 的定义, APS ׃批基软gl装而成Q这些基软g提供?jin)创Z业应用所需的架构,臛_必须包括应用服务器?/span> Portal 产品和企业应用集成包{?/span> IDC 通过对众多企业信息主的调查发现Q他们最兛_(j)的问题是如何实现企业应用的整合,以及(qing)如何构徏l一的企业信息门户^台等。厂商对企业用户的这些需求,仅仅提供一个应用服务器是远q不够的Q而需要提供一整套能够使企业有效和灉|地徏立信息系l的工具和Y件^収ͼ把应用开发^台和应用集成q_有机地结合v来?/span>
ȝ来看Q?/span> 作ؓ(f)未来企业信息用户q_的一个重要组Ӟ随着应用服务器的发展Q也得到长的发展和进步?/span>